Вставка статичного блока в ячейку таблицы Autocad

Автор Тема: Вставка статичного блока в ячейку таблицы Autocad  (Прочитано 4972 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день! По мотивам здешних видеоуроков VBA увлекся программированием (стаж без году неделя  :(). До поры справлялся сам, но с этой задачкой уперся в стену. В пространстве модели имеется таблица автокад и статичный блок. Требуется в конкретную ячейку вставить этот блок.

Код - Visual Basic [Выбрать]
  1.  Sub BlockIntoAcadTable()
  2.  
  3.   Dim name As String
  4.   Dim block As AcadBlock
  5.   Dim ID As Long
  6.   Dim table As AcadTable
  7.  
  8.   On Error Resume Next
  9.  
  10.   name = "1"
  11.  
  12.   Set block = ThisDrawing.Blocks(name)
  13.   ID = block.objectID32
  14.  
  15.   ThisDrawing.SelectionSets("SS").Delete
  16.   Set ss = ThisDrawing.SelectionSets.Add("SS")
  17.   ss.SelectOnScreen
  18.  
  19.   For Each table In ss
  20.      
  21.   table.SetCellType 5, 5, acBlockCell
  22.   table.SetBlockTableRecordId 5, 5, ID, True
  23.      
  24.   Next
  25.  
  26. End Sub

Направте в нужную сторону новичка.

Ps. Windows7, 64, Autocad2016Eng

 

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А что не так в коде?
Возможно не хватает:
Код - Visual Basic [Выбрать]
  1. table.RecomputeTableBlock(True)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение pavka_97 15-01-2018, 20:21:38

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил у себя вот этот код:
Код - Visual Basic [Выбрать]
  1. Sub BlockIntoAcadTable()
  2.      
  3.       Dim name As String
  4.       Dim block As AcadBlock
  5.       Dim ID As LONG_PTR
  6.       Dim table As AcadTable
  7.      
  8.       On Error Resume Next
  9.      
  10.       name = "1"
  11.      
  12.       Set block = ThisDrawing.Blocks(name)
  13.       ID = block.ObjectID
  14.      
  15.       On Error Resume Next
  16.       ThisDrawing.SelectionSets("SS").Delete
  17.       Set ss = ThisDrawing.SelectionSets.Add("SS")
  18.       ss.SelectOnScreen
  19.      
  20.       For Each table In ss
  21.         table.SetCellType 5, 5, acBlockCell
  22.         table.SetBlockTableRecordId 5, 5, ID, True
  23.       Next
  24.      
  25. End Sub

Работает. В ячейку [6:F] вставляется и масштабируется блок с именем 1.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
А ведь верно :). А в 32-х разрядных работает и без ptr. Спасибо большое!
 P.s. Я так полагаю, что вставку по условию тоже можно домыслить (допустим если значение в одной ячейке совпадает с именем вставляемого блока в другой)?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
P.s. Я так полагаю, что вставку по условию тоже можно домыслить (допустим если значение в одной ячейке совпадает с именем вставляемого блока в другой)?
Всё что угодно. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Ура!:) Буду разбираться. Спасибо.

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день, осмелюсь спросить еще раз в продолжении темы :). Возможна ли вставка с условием в таблицу блока c атрибутом, при сравнении значений textString (атрибута блока) и CellValue?
Код - Visual Basic [Выбрать]
  1. Sub BlockIntoAcadtable2()
  2.       Dim name1 As String
  3.       Dim block As AcadBlock
  4.       Dim t1 As String
  5.       Dim n1 As String
  6.       Dim ID As LONG_PTR
  7.       Dim Attributes As Variant
  8.       Dim table As AcadTable
  9.      
  10.          On Error Resume Next
  11.          
  12.          name1 = "1"
  13.          Set block = ThisDrawing.Blocks(name1)
  14.          ID = block.ObjectID
  15.          
  16.          Attributes = block.GetAttributes
  17.          t1 = Attributes(0).TextString
  18.          
  19.          ThisDrawing.SelectionSets("ss").Delete
  20.          Set ss = ThisDrawing.SelectionSets.Add("ss")
  21.          ss.SelectOnScreen
  22.          
  23.          For Each table In ss
  24.          n1 = table.GetCellValue(7, 0)
  25.          If n1 = t1 Then
  26.          table.SetBlockTableRecordId 7, 5, ID, True
  27.          End If
  28.       Next
  29. End Sub
При сравнении с именем блока, числом работает. Чего то опять не хватает?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты путаешь описание блока (Block) и вставку блока (BlockReference). У Block нет метода GetAttributes.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Матчасть конечно хромает, это да. Добавил фильтр и вставку, но снова что то не так.
Код - Visual Basic [Выбрать]
  1. Sub BlockIntoAcadtable2()
  2.       Dim ssName As String
  3.       Dim ssetobj As AcadSelectionSet
  4.       Dim blk2 As AcadBlockReference
  5.       Dim name1 As String
  6.       Dim block As AcadBlock
  7.       Dim t1 As String
  8.       Dim n1 As String
  9.       Dim ID As LONG_PTR
  10.       Dim Attributes As Variant
  11.       Dim table As AcadTable
  12.      
  13.          On Error Resume Next
  14.          
  15.          name1 = "111"
  16.          Set block = ThisDrawing.Blocks.Item(name1)
  17.          ID = block.ObjectID
  18.          
  19.          ThisDrawing.SelectionSets.Item(ssName).Delete
  20.          Set ssetobj = ThisDrawing.SelectionSets.Add(ssName)
  21.      
  22.       Dim gpCode(0 To 1) As Integer
  23.       Dim dataValue(0 To 1) As Variant
  24.      
  25.          gpCode(0) = 0: dataValue(0) = "INSERT"
  26.          gpCode(1) = 2: dataValue(1) = "111"
  27.          ssetobj.Select acSelectionSetAll, , , gpCode, dataValue
  28.          
  29.          For Each blk2 In ssetobj
  30.          
  31.          Attributes = blk2.GetAttributes
  32.          t1 = Attributes(0).TextString
  33.          
  34.          Next
  35.                                    
  36.          ThisDrawing.SelectionSets("ss").Delete
  37.          Set ss = ThisDrawing.SelectionSets.Add("ss")
  38.          ss.SelectOnScreen
  39.          
  40.          For Each table In ss
  41.          n1 = table.GetCellValue(7, 0)
  42.          If n1 = t1 Then
  43.          table.SetBlockTableRecordId 7, 5, ID, True
  44.          End If
  45.       Next
  46. End Sub

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
pavka_97
Извини, но тут даже на уровне идеи какая-то глупость. Причем тут значение атрибута вставленного отдельно блока к появлению или не появлению в ячейке таблицы блока?
И вообще запусти код под отладчиком и посмотри что у тебя получается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Я прогнозировал выполнение так: имеется таблица в одной ячейке которой значение "1", имеется статичный блок с одним атрибутом у которого значение (text string) скажем "2", впоследствии оно меняется на значение "1",при запуске кода сопоставляются значение ячейки и значение атрибута блока и этот блок вставляется в определенную ячейку (может это и бредовая идея конечно). Но это сейчас это уже не столь важно.
 Мне непонятно почему не выполняется отдельно кусок кода где извлекается атрибут из одной конкретной вставки блока и его text string записывается в переменную:
Код - Visual Basic [Выбрать]
  1. Sub Attinvar()
  2.       Dim ssName As String
  3.       Dim ssetobj As AcadSelectionSet
  4.       Dim blk2 As AcadBlockReference
  5.       Dim Attributes As Variant
  6.          
  7.          On Error Resume Next
  8.          ThisDrawing.SelectionSets.Item(ssName).Delete
  9.          Set ssetobj = ThisDrawing.SelectionSets.Add(ssName)
  10.      
  11.       Dim gpCode(0 To 1) As Integer
  12.       Dim dataValue(0 To 1) As Variant
  13.      
  14.          gpCode(0) = 0: dataValue(0) = "INSERT"
  15.          gpCode(1) = 2: dataValue(1) = "111"
  16.          ssetobj.Select acSelectionSetAll, , , gpCode, dataValue
  17.          
  18.          For Each blk2 In ssetobj
  19.          
  20.          Attributes = blk2.GetAttributes
  21.          t1 = Attributes(0).TextString
  22.  Next
  23. End Sub
или наоборот требуется изменить значение самого text string:
Код - Visual Basic [Выбрать]
  1. Sub ChangeValue()      
  2.       Dim ssName As String
  3.       Dim ssetobj As AcadSelectionSet
  4.       Dim blk2 As AcadBlockReference
  5.       Dim Attributes As Variant
  6.  
  7.          On Error Resume Next
  8.          ThisDrawing.SelectionSets.Item(ssName).Delete
  9.          Set ssetobj = ThisDrawing.SelectionSets.Add(ssName)
  10.      
  11.       Dim gpCode(0 To 1) As Integer
  12.       Dim dataValue(0 To 1) As Variant
  13.      
  14.          gpCode(0) = 0: dataValue(0) = "INSERT"
  15.          gpCode(1) = 2: dataValue(1) = "111"
  16.          ssetobj.Select acSelectionSetAll, , , gpCode, dataValue
  17.          
  18.          For Each blk2 In ssetobj
  19.          
  20.          Attributes = blk2.GetAttributes
  21.          Attributes(0).TextString = "4"
  22. Next
  23. End Sub
Может что то нужно обновить, синхронизировать,регенерировать чтобы увидеть изменения (если код верный) или у меня вообще фундаментальные ошибки?

P.s.Как запустить код под отладчиком и проанализировать то что он покажет я пока не умею :-[.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
P.s.Как запустить код под отладчиком и проанализировать то что он покажет я пока не умею :-[.
Тогда как минимум печатай все промежуточные значения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
pavka_97
Посмотрел я более внимательно код. Так он у тебя и не должен работать. Ты не задаёшь значение ssName. И так как обработчик ошибок блокирует все ошибки, то ты и не видишь что код ничего не делает.
Например, твой ChangeValue должен выглядеть как-то так:

Код - Visual Basic [Выбрать]
  1. Sub ChangeValue()
  2.   Dim ssName As String
  3.   Dim ssetobj As AcadSelectionSet
  4.   Dim blk2 As AcadBlockReference
  5.   Dim Attributes As Variant
  6.   ssName = "ssName" ' задали значение ssName
  7.  On Error Resume Next
  8.   ThisDrawing.SelectionSets.Item(ssName).Delete
  9.   On Error GoTo 0
  10.   Set ssetobj = ThisDrawing.SelectionSets.Add(ssName)
  11.  
  12.   Dim gpCode(0 To 1) As Integer
  13.   Dim dataValue(0 To 1) As Variant
  14.  
  15.   gpCode(0) = 0: dataValue(0) = "INSERT"
  16.   gpCode(1) = 2: dataValue(1) = "111"
  17.   ssetobj.Select acSelectionSetAll, , , gpCode, dataValue
  18.      
  19.   For Each blk2 In ssetobj
  20.      
  21.      Attributes = blk2.GetAttributes
  22.      Attributes(0).TextString = "4"
  23.   Next
  24.        
  25. End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
ssName = "ssName".
Дьявол кроется в деталях. Заработало абсолютно все. Я был в шаге от отчаяния:). Спасибо вам огромное за участие, пошел усложнять дальше:)