| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать массив из выделенных объектов на VBA?

Как создать массив из выделенных объектов на VBA?

Ответ
Поиск в этой теме
Непрочитано 10.05.2022, 11:24 #1
Как создать массив из выделенных объектов на VBA?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Существует ли способ создать массив из выделенных объектов (наверное надо использовать SelectionSet) средствами VBA?
Выделенные объекты могут быть произвольными.
Просмотров: 1925
 
Непрочитано 10.05.2022, 12:38
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,772


ИМХО только командными методами
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.05.2022, 12:39
#3
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


А на ЛИСПе есть команды для создания массива?
МишаИнженер вне форума  
 
Непрочитано 10.05.2022, 12:53
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 10,960


что именно подразумевается под массивом в данном случае?
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.05.2022, 12:55
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Объект созданный командой: _arrayrect
МишаИнженер вне форума  
 
Непрочитано 10.05.2022, 13:18
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 10,960


или командными методами, как писали выше, либо через костыль попробовать - создать блок из выделенных объектов и у вставки блока использовать метод ArrayRectangular
Сергей812 вне форума  
 
Непрочитано 10.05.2022, 13:28
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,772


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
или командными методами, как писали выше, либо через костыль попробовать - создать блок из выделенных объектов и у вставки блока использовать метод ArrayRectangular
Огось, не знал про такое Правда, мне никогда массив и не надо было создавать...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.05.2022, 14:04
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 10,960


это предположение, что так можно сделать) По документации метод ArrayRectangular у наследников AcadEntity, включая и вставку блока. Поэтому в лучших традициях Аутодеска создаем очередной блок и размножаем его вставки внутри блока массива...

Тоже как то массивы без надобности - проще программно по узлам расчетной сетки вставить объекты.

----- добавлено через ~2 ч. -----
проверил с готовым блоком по COM из экселя - без проблем создается массив. Ну а создать блок из выделенных примитивов, попутно высчитав через GetBoundingBox точку вставки определения блока - типовая задача)
Сергей812 вне форума  
 
Автор темы   Непрочитано 14.05.2022, 11:01
#9
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Получилось создать вот такие быстрые команды для создания линейных массивов:
Код:
[Выделить все]
Private Sub ComButton5_МассивВлево_Click()
Dim dШаг As Double, iЧШМ As Integer
   iЧШМ = Range("ЧислоШаговМассива")
   dШаг = Range("ШагМассива")
   Call СоздатьМассивИзвыделенныхОбъектов(iЧШМ, , -dШаг)
End Sub

Private Sub ComButton6_МассивВправо_Click()
Dim dШаг As Double, iЧШМ As Integer
   iЧШМ = Range("ЧислоШаговМассива")
   dШаг = Range("ШагМассива")
   Call СоздатьМассивИзвыделенныхОбъектов(iЧШМ, , dШаг)
End Sub

Private Sub ComButton7_МассивВверх_Click()
Dim dШаг As Double, iЧШМ As Integer
   iЧШМ = Range("ЧислоШаговМассива")
   dШаг = Range("ШагМассива")
   Call СоздатьМассивИзвыделенныхОбъектов(, iЧШМ, , dШаг)
End Sub

Private Sub ComButton8_МассивВниз_Click()
Dim dШаг As Double, iЧШМ As Integer
   iЧШМ = Range("ЧислоШаговМассива")
   dШаг = Range("ШагМассива")
   Call СоздатьМассивИзвыделенныхОбъектов(, iЧШМ, , -dШаг)
End Sub

Public Function СоздатьМассивИзвыделенныхОбъектов(Optional iЧШМX As Integer = 5, Optional iЧШМY As Integer = 5, _
Optional dШагX As Double = 0, Optional dШагY As Double = 0) As Variant
'Функция создает массив из выделенных объектов
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim I As Integer
Dim objТекВыдОбъекты As AcadSelectionSet, obМассив As Variant
On Error GoTo ОбработкаОшибок
'Получить объекты Excell и AutoCAD
   Call ПолучитьОбъектыExcellИAutoCAD(objПриложениеAutoCAD, objAcadDoc)

'Получим список выделенных объектов на чертеже
   Set objТекВыдОбъекты = objAcadDoc.PickfirstSelectionSet
   objТекВыдОбъекты.Highlight True
   I = objТекВыдОбъекты.count
   If I = 0 Then
      objТекВыдОбъекты.SelectOnScreen
      If Err <> 0 Then End
   End If
'Получим массив из объектов
   If dШагX <> 0 And dШагY = 0 Then
     objAcadDoc.SendCommand ("_ARRAYRECT _COL " & iЧШМX & " " & dШагX & " _R 1 5 5 _X ")
   ElseIf dШагX = 0 And dШагY <> 0 Then
     objAcadDoc.SendCommand ("_ARRAYRECT _COL 1 5 _R " & iЧШМY & " " & dШагY & " 5 _X ")
   End If

   Exit Function
ОбработкаОшибок:
   glОтвет = MsgBox("При создании массива произошла ошибка:" & vbLf & _
         "номер = " & Err.Number & vbLf & _
         "с описанием: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbYesNo, gsНазваниеПрограммы)
   If glОтвет = vbNo Then Exit Function
   Resume Next
End Function
Все работает
Исправил ошибку в прошлом коде, команда не работала если на экране перед запуском небыли выделены объекты и надо было их выделять вручную. После выделения они не подсвечивались синенькими квадратиками, поэтому команда выдавала ошибку и не работала. Теперь все исправлено:
Код:
[Выделить все]
Public Function СоздатьМассивИзвыделенныхОбъектов(Optional iЧШМX As Integer = 5, Optional iЧШМY As Integer = 5, _
Optional dШагX As Double = 0, Optional dШагY As Double = 0) As Variant
'Функция создает массив из выделенных объектов
Dim objПриложениеAutoCAD As AcadApplication, objAcadDoc As AcadDocument
Dim I As Integer, J As Integer
Dim objТекВыдОбъекты As AcadSelectionSet, obМассив As Variant
On Error GoTo ОбработкаОшибок
'Получить объекты Excell и AutoCAD
   Call ПолучитьОбъектыExcellИAutoCAD(objПриложениеAutoCAD, objAcadDoc)

'Получим список выделенных объектов на чертеже
   Set objТекВыдОбъекты = objAcadDoc.PickfirstSelectionSet
   objТекВыдОбъекты.Highlight True
   J = objТекВыдОбъекты.count
   If J = 0 Then
      objТекВыдОбъекты.SelectOnScreen
      If Err.Number <> 0 Then End
'Подсветим выделенные объекты
      J = objТекВыдОбъекты.count
      ReDim mОбъекты(0 To J - 1) As AcadEntity
      For I = 0 To J - 1
         Set mОбъекты(I) = objТекВыдОбъекты(I)
      Next I
      
   'Создадим группу выделения "Подсветка"
      If ПризнакНаличияЭлементаВКоллекции("Подсветка", objAcadDoc.SelectionSets, 2) Then
         objAcadDoc.SelectionSets("Подсветка").Delete
      End If
      Set objSelПодсветка = objAcadDoc.SelectionSets.Add("Подсветка")
      objSelПодсветка.AddItems mОбъекты
   'Вызовем команду выделения группы "Подсветка"
      objAcadDoc.SendCommand "(progn(defun ss-gripset (/ SS SR SSN I)(vl-load-com)(setq SS(vla-get-selectionsets(vla-get-activedocument (vlax-get-acad-object))) SSN(vla-item SS ""Подсветка"") SR(ssadd))(vlax-for I SSN (ssadd(vlax-vla-object->ename I)SR))(sssetfirst nil SR)(princ))(ss-gripset))\n "
   End If
'Получим массив из объектов
   If dШагX <> 0 And dШагY = 0 Then
     objAcadDoc.SendCommand ("_ARRAYRECT _COL " & iЧШМX & " " & dШагX & " _R 1 5 5 _X ")
   ElseIf dШагX = 0 And dШагY <> 0 Then
     objAcadDoc.SendCommand ("_ARRAYRECT _COL 1 5 _R " & iЧШМY & " " & dШагY & " 5 _X ")
   End If

   Exit Function
ОбработкаОшибок:
   glОтвет = MsgBox("При создании массива произошла ошибка:" & vbLf & _
         "номер = " & Err.Number & vbLf & _
         "с описанием: " & Err.Description & vbLf & vbLf & _
         "Продолжать выполнение программы?", vbYesNo, gsНазваниеПрограммы)
   If glОтвет = vbNo Then Exit Function
   Resume Next
End Function

Последний раз редактировалось МишаИнженер, 29.05.2022 в 13:55.
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать массив из выделенных объектов на VBA?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли в AutoCad создать массив с разным шагом в ряду или колонне? stumpel AutoCAD 1 11.12.2017 16:42
SolidWorks: как создать парметрический массив с граничными условиями шага? staer SolidWorks 2 31.08.2012 16:34
Как правильно создать массив с помощью array? Dmitriyele Программирование 3 28.11.2011 16:57
Нужен Лисп: программный EXPLODE выделенных объектов Кочетков Андрей LISP 25 06.08.2009 12:35
VBA, Определение набора текущих выделенных объектов чертежа. Vildar Программирование 7 28.07.2008 17:35