Jump to content
  • entries
    15
  • comments
    97
  • views
    3,758

АвтоЗаполнялка. Часть 2


doctorraz

1,433 views

 Share

Сделал автозаполнялку , по результатам боевых стрельб внезапно выяснилось, что нана не умеет работать с полями нативных объектов.

Зато умеет вставлять поля из свойств документа (хотя возможно в следующей версии пофиксят и все будет наоборот)))

Возник вопрос, как запихнуть данные в  свойства документа....

Руками прям не вдохновляет

Спойлер

image.png.d238428f6d075708067bb818e58b3ebf.png

Второй вопрос откуда эти данные брать, решился просто, коль у нас на чертеже есть таблица, (автозаполнялка)  в которую мы занесли все сведения...

отчего бы данные не подтянуть из нее.

Принцип в кратце:

  1. Хватаем конкретную таблицу на чертеже
  2. Пробегаем по значениям именованных ячеек
  3. Имя ячейки пишем как ключ в пользовательские свойства документа
  4. Значением-свойством ключа будет содержимое ячейки

------------------------

Некритичные проверки исключений я не делал, кому надо вполне может дописать, как надо

Если изменить "комментарии"  ячеек, то соответственно в свойства документа запишутся другие ключи

Все ключи пишутся в пользовательские свойства документа, но при желании можно писать и в 

Спойлер

image.png.d1d023e4dfff1ade16c008af0f79a073.png

 

Под спойлером код, старался комментировал))

 

Спойлер

Dim ThisDrawing As Object
Sub docProp() 'заполнялка полей документа из таблицы (именованных ячеек)
    'без проверки исключений, чисто для общего понятия как
    Set objApp = GetObject(, "nanoCAD.Application") 'цепляемся к нане, или AutoCAD
    Set SPDS = CreateObject("McCOM2.Server") 'Получаем COM-сервер СПДС
    Set ThisDrawing = objApp.ActiveDocument 'хватаем активный документ
    Set ff = ThisDrawing
    TabName = "Заполнялка Таблица в таблицы" 'эту таблицу будем искать на чертеже
    Set FindTable = SPDS.Query("McCom2.SymTable", "Name=""" & TabName & """") _
            'ищем таблицу, можно изменить на свое
       If FindTable.Count > 0 Then 'если хоть одна таблица с таким именем найдена
        Set PropTable = FindTable(1).Properties 'хватаем первую из коллекции с таким именем (предполагается, что она одна)))
Dim varr
'<тут готовим путь для записи в таблицу (мне так надо)
        If ThisDrawing.FullName Like "*\*" Then 'НАНОКОСТЫЛЬ если файл сохранялся
            FulPatch = ThisDrawing.FullName
'<тут получаем имя файла без расширения
            varr = Split(ThisDrawing.Name, ".")
ReDim Preserve varr(UBound(varr) - 1)
            Filename = Join(varr, "")
        Else
            FulPatch = "ФАЙЛ НЕ СОХРАНЯЛСЯ!!"
            Filename = ThisDrawing.Name
        End If
Dim PropKey As String 'ключ для записи в свойства документа (коментарий ячейки)
Dim PropVal As String 'свойство ключа)) (содержимое ячейки)
On Error Resume Next 'страховочка вдруг такой ячейки нет((
        PropTable("Путь к файлу") = FulPatch 'пишем в ячейку полный путь
        PropTable("Имя файла") = Filename 'пишем в ячейку имя файла
On Error GoTo 0
    'тут в цикле заполняем свойства документа из именованных ячеек
        For Each namProp In PropTable.Names 'перебираем имена свойств
            Set PropProp = PropTable(namProp) 'получаем свойство по имени
            PropCategory = PropProp.Category
            If PropCategory = "Именованные ячейки" Then 'из свойств нам нужны только именованные ячейки
                PropKey = namProp 'коментарий ячейки будет ключ
                PropVal = PropProp.Value 'значение ячейки
                SetOrAddKey PropKey, PropVal 'идем писать в свойства
            End If
        Next
        res = "Значения именованных ячеек из " & "<" & TabName & ">" & _
                " записаны в свойства документа"
        ThisDrawing.SendCommand "(alert """ & res & """)" & vbCrLf
        SPDS.Message (res)
    Else
        MsgBox "Таблица: """ & TabName & """" & vbCrLf & _
                "не найдена на чертеже!", vbInformation, "docProp"
    End If
End Sub
    
Function SetOrAddKey(Key1 As String, val As String)
On Error Resume Next
    ThisDrawing.SummaryInfo.SetCustomByKey Key1, val 'НАНОКОСЯК если ключа нет в каде будет исключение, но нана создаст ключ)))
    If Err.Number <> 0 Then
        ThisDrawing.SummaryInfo.AddCustomInfo Key1, val
        Err.Number = 0
    End If
On Error GoTo 0
End Function
Sub main()
    docProp
End Sub

 

 

Сразу скажу из скрипта VBS внутри наны этот код работать не будет, хотя конечно заманчиво... (значения ключей и свойства должны быть String и никак иначе, а в скриптах типы данных я не умею )

Поэтому этот код запускается из Excel большой красной кнопкой.

В принципе, как дальнейшее развитие, этот код можно причесать, откомпилировать и запускать, хоть из командной строки нано, из меню или кнопкой на панели.

В аттаче шаблон чертежа и большая красная кнопка.

PS кода без багов не бывает, поэтому по мере... буду улучшать

Автозаполнялка через поля документа V2.dwg docProp.xlsm

Edited by doctorraz

 Share

16 Comments


Recommended Comments

@doctorraz Без это "картинки" не очень понятно откуда именно берутся данные.

Хотя работает, конечно, и в платформе.

image.png.30d37042957d0ce8797405f998da6db3.png

  • Like 1
Link to comment

@MCAD дык в часть 1 все с картинками, про заполнялку форматок из таблиц

А это часть 2 про заполнялку свойств документа из таблиц.

Коль  ни у кого вопросов не возникает, то одно из трех..

 

  • Like 1
Link to comment

интересная шутка, спасибо, честно не очень пока понимаю , как это работает

а можно ли сделать так, чтобы листы которые добавляются по горизонтали имели нумерацию вида "3.1., 3.2, 3.3..." (тоесть как только справа появляется лист, нумерация предыдущего и последующих листов по горизонтали нумеровались именно так) , а по вертикали "1,2,3,4, 5...) ?

 

спасибо

 

Link to comment
9 минут назад, sokave сказал:

а можно ли сделать так, чтобы листы которые добавляются по горизонтали имели нумерацию вида "3.1., 3.2, 3.3..." (тоесть как только справа появляется лист, нумерация предыдущего и последующих листов по горизонтали нумеровались именно так) , а по вертикали "1,2,3,4, 5...)

что-то похожее было тут:

 

  • Like 1
Link to comment
1 час назад, sokave сказал:

можно ли сделать так, чтобы листы которые добавляются по горизонтали имели нумерацию вида "3.1., 3.2, 3.3..."

 можно, если подумать

  • Like 2
Link to comment

а легче не стало :) я вообще не понимаю ничерта, магия какая то запредельного уровня

Link to comment
1 час назад, sokave сказал:

как автонумерация страниц у вас сделана

п.8 наверное.

Цитата

8.       Теперь, когда мы определили, сколько блоков находится в каждом ряду необходимо, пронумеровать их  по возрастанию параметра  Object."Position X". Для этого в колонку «F» вводим выражение: =iff(off(0;-5)==1;1;iff(off(-1;-4)!=off(0;-4);1;off(-1;0)+1)). Это значит, на самом деле, очень простое действие. Если (iff) ячейка, которая находится (off) в той же строке (0) , на пять колонок влево (-5)  равна «1», то пишем «1». Дальше проверяем, если координата «Y » не равна выше стоящей ячейке off(-1;-4)!=off(0;-4) , то ставим «1», если равна, то берём значение верхней ячейки off(-1;0) и прибавляем «1»

 

  • Like 2
Link to comment
8 часов назад, sokave сказал:

кажется китайский язык проще

Всегда то что знаешь или умеешь кажется проще))

  • Like 1
Link to comment
9 часов назад, sokave сказал:

китайский язык проще

 Вам не нужно ничего учить тут.

А думать, говоря по китайски, можно на русском.

  • Like 1
Link to comment

спасибо всем за консультации, все вроде сделал, не совсем так как хотел, но , в принципе, работоспособно 

  • Like 2
Link to comment
В 31.05.2023 в 23:11, sokave сказал:

все вроде сделал,

Да и славно

 

В 31.05.2023 в 00:07, sokave сказал:

мне кажется китайский язык проще

Зря, значит, я "Русско-Китайский" разговорник готовил.

 

Документ переехал сюда:

 

  • Thanks 2
Link to comment
3 часа назад, MCAD сказал:

Зря, значит, я "Русско-Китайский" разговорник готовил.

ничего не бывает зря, знания - сила

Link to comment
3 часа назад, sokave сказал:

ничего не бывает зря

Да? ну тогда выложу там 

Что бы тут не мусорить.

  • Like 1
  • Thanks 1
Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...