Копирование объектов с помощью CopyObjects

Автор Тема: Копирование объектов с помощью CopyObjects  (Прочитано 9271 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
1. Имеется чертеж с оформленными чертежами (в рамках) в пространстве модели.
2. Необходимо скопировать чертежи из пространства модели каждый на новый лист

Мне предложили вариант кода на VBA:
Код - Visual Basic [Выбрать]
  1. ---
  2.     'Create selectionset
  3.    Dim selSet As AcadSelectionSet
  4.     Set selSet = ThisDrawing.SelectionSets.Add("MySS")
  5.     Dim ptLL(2) As Double, ptUR(2) As Double
  6.     ptLL(0) = 0#: ptLL(1) = 0#
  7.     ptUR(0) = 50#: ptUR(1) = 50#
  8.    
  9.     'Objects selection
  10.    Call selSet.Select(acSelectionSetWindow, ptLL, ptUR)
  11.     MsgBox "Entities selected using Window selection : " & selSet.Count
  12.    
  13.     Dim obj() As Object
  14.     ReDim obj(0 To selSet.Count - 1) As Object
  15.     For i = 0 To selSet.Count - 1
  16.         Set obj(i) = selSet(i)
  17.     Next
  18.    
  19.     Dim Layout As AcadLayout
  20.     For Each Layout In ThisDrawing.Layouts
  21.         Call ThisDrawing.CopyObjects(obj, Layout.Block)
  22.     Next
  23.    
  24.     selSet.Delete
  25. ----
  26.  

Прекрасно работающий код!!! Но, нужно тоже самое сделать на VB.NET используя Interop COM.
Я адаптировал этот код под VB.NET и вот, что у меня получилось:
Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Interop
  2. Imports Autodesk.AutoCAD.Runtime
  3.  
  4. Public Class CopyOBJECTS
  5.  
  6.     <CommandMethod("GALMODELOBJ", CommandFlags.Session)>
  7.     Public Sub GALMODELOBJ()
  8.         Dim acApp As AcadApplication
  9.         Dim acDoc As AcadDocument
  10.         acApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  11.         acDoc = acApp.ActiveDocument
  12.  
  13.         'Create selectionset
  14.         Dim selSet As AcadSelectionSet
  15.         selSet = acDoc.SelectionSets.Add("MySS")
  16.         Dim ptLL(2) As Double, ptUR(2) As Double
  17.         ptLL(0) = -9999.0# : ptLL(1) = -9999.0#
  18.         ptUR(0) = 9999.0# : ptUR(1) = 9999.0#
  19.  
  20.         'Objects selection
  21.         Call selSet.Select(Common.AcSelect.acSelectionSetWindow, ptLL, ptUR)
  22.         MsgBox("Entities selected using Window selection : " & selSet.Count)
  23.  
  24.         Dim obj() As Object
  25.         '        ReDim obj(0 To selSet.Count - 1)
  26.         ReDim obj(selSet.Count - 1)
  27.         For i = 0 To selSet.Count - 1
  28.             obj(i) = selSet(i)
  29.         Next
  30.  
  31.         Dim Layout As Object ' AcadLayout
  32.         For Each Layout In acDoc.Layouts
  33.             Call acDoc.CopyObjects(obj, Layout.Block)
  34.         Next
  35.         selSet.Delete()
  36.  
  37.     End Sub
  38.  
  39. End Class


И вот на строке

Код - vb.net [Выбрать]
  1. ----
  2. Call acDoc.CopyObjects(obj, Layout.Block)
  3. ----
  4.  


выпадает ошибка НЕВЕРНЫЙ МАССИВ ОБЪЕКТОВ!




Вопрос: как обойти эту ошибку? Но именно, чтобы этот вариант решения работал.

Отмечено как Решение Пашин Евгений 26-08-2015, 08:18:39

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Подробный ответ:

1. Visual Studio 2013 / Целевая платформа .NET Framework 4 / Конфигурация - Release / AutoCAD 2014 x64 / Windows 8.1 x64
2. Подключаемые библиотеки:
  • AcCoreMgd.dll
  • AcDbMgd.dll
  • AcMgd.dll
  • Autodesk.AutoCAD.Interop.dll
  • Autodesk.AutoCAD.Interop.Common.dll
3. Код:
Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Interop
  2. Imports Autodesk.AutoCAD.Runtime
  3.  
  4. Public Class CopyOBJECTS
  5.  
  6.     <CommandMethod("GALMODELOBJ", CommandFlags.Session)>
  7.     Public Sub GALMODELOBJ()
  8.         Dim acApp As AcadApplication
  9.         Dim acDoc As AcadDocument
  10.         acApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  11.         acDoc = acApp.ActiveDocument
  12.  
  13.         'Создание выборки объектов
  14.         Dim selSet As Autodesk.AutoCAD.Interop.AcadSelectionSet
  15.         selSet = acDoc.SelectionSets.Add("MySS")
  16.  
  17.         Dim ptLL(2) As Double, ptUR(2) As Double
  18.         ptLL(0) = -9999.0# : ptLL(1) = -9999.0#
  19.         ptUR(0) = 9999.0# : ptUR(1) = 9999.0#
  20.  
  21.         'Добавление объектов в выборку (выделение объектов рамкой, заданной координатами)
  22.         Call selSet.Select(Common.AcSelect.acSelectionSetWindow, ptLL, ptUR)
  23.         MsgBox("Entities selected using Window selection : " & selSet.Count)
  24.  
  25.         ' Создаем массив объектов из выборки
  26.         Dim obj() As Autodesk.AutoCAD.Interop.Common.AcadEntity
  27.         ReDim obj(selSet.Count - 1)
  28.         For i = 0 To selSet.Count - 1
  29.             obj(i) = selSet.Item(i)
  30.         Next
  31.  
  32.         ' Каждому листу присваиваем массив объектов из выборки
  33.         Dim Layout As Autodesk.AutoCAD.Interop.Common.AcadLayout
  34.         For Each Layout In acDoc.Layouts
  35.             Call acDoc.CopyObjects(obj, Layout.Block)
  36.         Next
  37.  
  38.         ' Очищаем выборку
  39.         selSet.Delete()
  40.  
  41.     End Sub
  42.  
  43. End Class
  44.  
  45.  

4. Запустите AutoCAD
5. Введите команду _NETLOAD
6. Укажите сборку (*.dll) из папки построения.
7. Нарисуйте в пространстве модели, к примеру, круг с координатами 0,0,0 и радиусом 50!
8. Введите команду GALMODELOBJ
9. В результате на всех листах (и даже MODEL) должны появиться все объекты, которые вместились в рамку [-9999,-9999;9999,9999] из пространства модели!

Огромное спасибо, Александру Ривилису!