Вставить блок из внешнего dwg

Olga94
отредактировано August 2024 Раздел: API

Здравствуйте Уважаемые специалисты NanoCAD!

Подскажите пожалуйста, возможно ли с помощью vba-excel вставить в текущий чертеж блок из внешнего dwg, по аналогии, например, с lisp (см. вложение).

В vba-excel можно вставить блок "InsertBlock" (если он например был выгружен из чертежа командой пблок):

Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(InsPoint, Range("A" & i).Value, Range("D" & i).Value, Range("D" & i).Value, Range("D" & i).Value, Range("E" & i).Value)

Но мне нужно вставить определенный блок (по имени) из внешнего dwg с несколькими вставленными в него блоками. Может через "WblockCloneObjects"?

Тэги темы:

Ответы

  • Olga94
    отредактировано September 2024

    Следующий фрагмент кода (vba-excel): найти файл dwg через окно - в этом файле после того как найден блок с нужным именем, запускается команда "пблок", затем нужно как-то вставить из этого файла (WBlock_example.dwg) блок в текущий чертеж?

    Dim myBlock As AcadBlockReference
    Dim oEnt As AcadEntity
    Dim sourceObj As Object
    Dim Sset As nanoCAD.SelectionSet

    Dim activeDoc As nanoCAD.Document
    Set activeDoc = acadApp.ActiveDocument

    StartF = "C:"
    Set App = CreateObject("Excel.Application")
    With App.FileDialog(3)
    .AllowMultiSelect = False
    .Title = "Выбрать файл с блоком"
    .Filters.Clear
    .Filters.Add "Файлы чертежей", ".dwg;.dwt", 1
    .InitialFileName = StartF
    .InitialView = 2

    If .Show = 0 Then
    MsgBox "Файл не выбран."
    Else
    For lf = 1 To .SelectedItems.Count
    Set awCopy = acadApp.Documents.Open(.SelectedItems(lf))

      For Each oEnt In awCopy.ModelSpace
    If TypeOf oEnt Is AcadBlockReference Then
    Set myBlock = oEnt
    If UCase(myBlock.EffectiveName) = UCase(blockname) Then
    Set sourceObj = myBlock
    Exit For
    End If
    End If
    Next oEnt

    If VarType(sourceObj) <> vbEmpty Then

    Set Sset = awCopy.SelectionSets.Add("WBLOCKSET")
    Sset.AddItems sourceObj
    awCopy.Wblock "C:\temp\WBlock_example.dwg", Sset
    Sset.DELETE

    activeDoc.Activate

  • Задачу вроде бы решила: получаю с помощью ПБЛОК блок (отдельно) во внешнем файле dwg (не выбранное, а только блок), затем выполняю вставку блока из этого внешнего файла.

  • kpblc
    отредактировано September 2024

    ИМХО сложновато. Значительно проще было бы "типа вставить" файл библиотеки, а потом уже вставлять блок из библиотеки. Общими мазками, без конкретики и просмотра кода (на VBA у меня, можно сказать, аллергия ;)), алгоритм может быть такой:
    - Пройтись по таблице блоков на предмет "есть ли такой блок в чертеже". Если есть - вставляем и на выход
    - Через метод .Insert пространства модели вставляем сторонний файл - весь, целиком. Запоминаем результат вставки
    - Удалить вставку блока "библиотеки"
    - См. первый шаг.

    На лиспе я подобное делал, когда про ObjectDBX был ни сном ни духом. Если что, ObjectDBX в NC23/23.1 не поддерживается, насколько я знаю.