Visual Studio и работа с CopyObjects

Автор Тема: Visual Studio и работа с CopyObjects  (Прочитано 12673 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Visual Studio и работа с CopyObjects
« : 10-12-2014, 09:47:59 »
Подскажите, пожалуйста, уже не знаю где искать и читать, ошибку в упор не вижу.
При срабатывании события с MainDoc.CopyObjects(obj, ThisDrawing.ModelSpace)  возникает ошибка, неверный массив объектов.

Код - Visual Basic [Выбрать]
  1. Imports Autodesk.AutoCAD.Interop.Common
  2. Imports Autodesk.AutoCAD.Interop
  3.  
  4.        Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
  5.  
  6.         Dim SrchTxt As String
  7.         Dim MyEnt As AcadEntity
  8.  
  9.         SrchTxt = "Среда -"
  10.         ThisDrawing = AcadApp.ActiveDocument
  11.  
  12.         For Each MyEnt In ThisDrawing.ModelSpace
  13.             Select Case MyEnt.ObjectName
  14.  
  15.                 Case "AcDbMText" '"AcDbText"
  16.                    If InStr(1, UCase(MyEnt.TextString), UCase(SrchTxt)) > 0 Then
  17.                         MyEnt.Delete() : Exit For
  18.                     End If
  19.             End Select
  20.         Next
  21.  
  22.         Dim obj(0) As Object
  23.         Dim copyObj As Object
  24.         Dim Pp As Double
  25.         DimAs Double
  26.  
  27.         'AcadApp.Visible = False
  28.        MainDoc = AcadApp.Documents.Open(fname, False)
  29.  
  30.         For Each MyEnt In MainDoc.ModelSpace
  31.             Select Case MyEnt.ObjectName
  32.                 Case "AcDbMText"
  33.                     If InStr(1, UCase(MyEnt.TextString), UCase(SrchTxt)) > 0 Then
  34.                         On Error GoTo HoustonWeHaveAProblem
  35.                         obj(0) = MyEnt
  36.  
  37.                         MainDoc.CopyObjects(obj, ThisDrawing.ModelSpace)
  38.                         MainDoc = Nothing
  39.                         Exit For
  40.                     End If
  41.             End Select
  42.         Next
  43.  
  44. HoustonWeHaveAProblem:
  45.  
  46.         If Err.Number <> 0 Then
  47.             MsgBox("ObjectDBX CopyObjects method objects failed." & vbCr & Err.Number & " " & _
  48.             Err.Description, vbCritical)
  49.         End If
  50.     End Sub

и еще вот этот использую, но ошибка все та же

Код - Visual Basic [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.EditorInput
  5. Imports Autodesk.AutoCAD.Windows
  6. Imports AXDBLib
  7.  
  8.     <CommandMethod("SingleCopy")> _
  9.     Public Sub SingleCopy()
  10.  
  11.         Dim AcadApp As AutoCAD.AcadApplication = GetObject(, "Autocad.Application")
  12.         Dim fname As String = "D:\Active Systems\Блоки\Версия первая.dwg"
  13.  
  14.         ' This example creates a Circle object and uses the CopyObjects
  15.        ' method to make a copy of the new Circle.
  16.        Dim DOC1 As AutoCAD.AcadDocument
  17.         Dim circleObj1 As AcadCircle, circleObj2 As AcadCircle
  18.         Dim circleObj1Copy As AcadCircle, circleObj2Copy As AcadCircle
  19.         Dim centerPoint(0 To 2) As Double
  20.         Dim radius1 As Double, radius2 As Double
  21.         Dim radius1Copy As Double, radius2Copy As Double
  22.         Dim objCollection(0 To 1) As Object
  23.         Dim retObjects As Object
  24.  
  25.         ' Define the Circle object
  26.        centerPoint(0) = 0 : centerPoint(1) = 0 : centerPoint(2) = 0
  27.         radius1 = 5.0# : radius2 = 7.0#
  28.         radius1Copy = 1.0# : radius2Copy = 2.0#
  29.  
  30.         ' Create a new drawing
  31.  
  32.         DOC1 = AcadApp.ActiveDocument
  33.  
  34.         ' Add two circles to the drawing
  35.        circleObj1 = DOC1.ModelSpace.AddCircle(centerPoint, radius1)
  36.         circleObj2 = DOC1.ModelSpace.AddCircle(centerPoint, radius2)
  37.         AcadApp.ZoomAll()
  38.  
  39.         ' Copy objects
  40.        '
  41.        ' First put the objects to be copied into a form compatible with CopyObjects
  42.        objCollection(0) = circleObj1
  43.         objCollection(1) = circleObj2
  44.  
  45.         ' Copy object and get back a collection of the new objects (copies)
  46.        retObjects = DOC1.CopyObjects(objCollection, DOC1.ModelSpace)
  47.  
  48.         ' Get newly created object and apply new properties to the copies
  49.        circleObj1Copy = retObjects(0)
  50.         circleObj2Copy = retObjects(1)
  51.  
  52.         circleObj1Copy.Radius = radius1Copy
  53.         circleObj2Copy.Radius = radius2Copy
  54.  
  55.         AcadApp.ZoomAll()
  56.  
  57.         MsgBox("Circles copied.")
  58.  
  59.     End Sub
  60.  
  61.  
  62. End Class

« Последнее редактирование: 10-12-2014, 12:13:43 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #1 : 10-12-2014, 12:19:33 »
Приветствую на форуме.
Сразу же просьба пользоваться кнопкой Код для нормального форматирования текста программы:



Я не понимаю смысла в использовании методов ActiveX/COM в сборке, загружаемой в AutoCAD, а судя по  <CommandMethod("SingleCopy")>, у тебя именно такая сборка. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Re: Visual Studio и работа с CopyObjects
« Ответ #2 : 10-12-2014, 13:20:34 »
В первом варианте, я пытался запустить CopyObjects, напрямую через form найдя объект "AcDbMText" в открываемом фале dwg. Я хотел скопировать, и вставить в ранее активный чертеже в autocad.

Раньше с помощью vba я делал это вот так и все работало нормально, а с visual studio 2012 express не получается.

Код - Visual Basic [Выбрать]
  1.  Dim obj(0) As Object
  2.  Dim MyEnt As AcadEntity
  3.  Dim copyObj As Variant
  4.  Dim Pp As Double
  5.  DimAs Double
  6.  
  7.      Set oDbx = GetInterfaceObject("ObjectDBX.AxDbDocument.19")
  8.      oDbx.Open fname
  9.  
  10.  
  11.  For Each MyEnt In oDbx.ModelSpace
  12.  
  13.  Select Case MyEnt.ObjectName
  14.  Case "AcDbMText"
  15.  
  16.  If InStr(1, UCase(MyEnt.TextString), UCase(SrchTxt)) > 0 Then
  17.  
  18.           On Error GoTo HoustonWeHaveAProblem
  19.           Set obj(0) = MyEnt
  20.           copyObj = oDbx.CopyObjects(obj, ThisDrawing.ModelSpace)
  21.           Set oDbx = Nothing
  22.           Exit For
  23.  End If
  24.  End Select

Отмечено как Решение Александр Ривилис 15-12-2014, 11:10:22

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #3 : 10-12-2014, 22:18:34 »
Раньше с помощью vba я делал это вот так и все работало нормально, а с visual studio 2012 express не получается.
Так у меня работает, хотя использовать ActiveX/COM в .NET - это последнее дело. Только когда других способов нет.
Код - vb.net [Выбрать]
  1. Imports System
  2. Imports Autodesk.AutoCAD.Runtime
  3. Imports Autodesk.AutoCAD.ApplicationServices
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Imports Autodesk.AutoCAD.EditorInput
  7. Imports Autodesk.AutoCAD.Interop
  8. Imports Autodesk.AutoCAD.Interop.Common
  9.  
  10. <Assembly: CommandClass(GetType(VBTEST.TestCopy))>
  11. Namespace VBTEST
  12.     Public Class TestCopy
  13.         <CommandMethod("SingleCopy")> _
  14.         Public Sub SingleCopy()
  15.             Dim AcadApp As AcadApplication = Application.AcadApplication
  16.             Dim fname As String = "D:\Active Systems\Блоки\Версия первая.dwg"
  17.             Dim DbxDoc As AXDBLib.AxDbDocument = AcadApp.GetInterfaceObject("ObjectDBX.AxDbDocument.19")
  18.             Dim Objects(0 To 0) As AcadEntity
  19.  
  20.             DbxDoc.Open(fname)
  21.  
  22.             For Each ent As AcadEntity In DbxDoc.ModelSpace
  23.                 If ent.ObjectName.EndsWith("MText") Then
  24.                     Objects(0) = ent
  25.                     DbxDoc.CopyObjects(CObj(Objects), AcadApp.ActiveDocument.ModelSpace)
  26.                 End If
  27.             Next
  28.             DbxDoc = Nothing
  29.         End Sub
  30.     End Class
  31. End Namespace
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Visual Studio и работа с CopyObjects
« Ответ #4 : 10-12-2014, 22:21:23 »
Anton950, а почему не на ассемблере? Если уж взялся использовать .NET язык, так используй и .NET API. А то, что ты написал сейчас - это, мягко говоря, плохое решение (гусары молчат)...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #5 : 10-12-2014, 22:52:51 »
Тоже самое, но средствами AutoCAD .NET API:
Код - vb.net [Выбрать]
  1. <CommandMethod("SingleCopy2")> _
  2. Public Sub SingleCopy2()
  3.     Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.     Dim db As Database = doc.Database
  5.     Dim fname As String = "D:\Active Systems\Блоки\Версия первая.dwg"
  6.     Dim idms As ObjectId = ObjectId.Null
  7.  
  8.     Using bt As BlockTable = db.BlockTableId.Open(OpenMode.ForRead)
  9.         idms = bt(BlockTableRecord.ModelSpace)
  10.     End Using
  11.  
  12.     Using dbSource As Database = New Database(False, False)
  13.         dbSource.ReadDwgFile(fname, FileOpenMode.OpenForReadAndAllShare, False, "")
  14.         Dim ids As ObjectIdCollection = New ObjectIdCollection
  15.         ' Нам нужен класс MText для сравнения
  16.         Dim rxClass As RXClass = rxClass.GetClass(GetType(MText))
  17.         Using bt As BlockTable =
  18.             dbSource.BlockTableId.Open(OpenMode.ForRead)
  19.             Using ms As BlockTableRecord =
  20.                 bt(BlockTableRecord.ModelSpace).Open(OpenMode.ForRead)
  21.                 For Each id As ObjectId In ms
  22.                     ' Отбираем только примитивы MText
  23.                     If id.ObjectClass.IsDerivedFrom(rxClass) Then
  24.                         ids.Add(id)
  25.                     End If
  26.                 Next
  27.             End Using
  28.         End Using
  29.         If ids.Count > 0 Then
  30.             Using mapIds As IdMapping = New IdMapping
  31.                 ' Копируем в активный чертеж все выбранные MText'ы
  32.                 dbSource.WblockCloneObjects(ids, idms, mapIds,
  33.                                             DuplicateRecordCloning.Replace, False)
  34.             End Using
  35.         End If
  36.     End Using
  37. End Sub
« Последнее редактирование: 10-12-2014, 23:26:27 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Re: Visual Studio и работа с CopyObjects
« Ответ #6 : 11-12-2014, 10:11:46 »
Александр Ривилис огромное спасибо, дали направление в котором буду разбираться. Но не могли бы подсказать, в первом примере с помощью ActiveX/COM у меня ваш код заработал, и его я смог применить его в winform vbs.С помощью этого кода я смогу легко переделать весь свой труд, который я до этого времени делал в vba autocad,  там я свзывал excel, word и все через form. Забирал данные из excel (использовал как базу данных) заносил их в форому там выбирал что нужно, и выдавал в autocad. Через vbs если напрямую, со всем связываться, то проще использовать ваш первый код ActiveX/COM. Если через .NET API тогда придется запускать форму через autocad и там связываться с excel, word. А так же в скором будущем может придется еще и учится работать в microstation. Так может мне как бы нелепо выглядел мой код, оставаться работать с помощью ActiveX/COM, но зато я напрямую всегда с могу связаться с нужно мне программой, и вот тут у меня проблема, боюсь, что в силу своего малого опыта я не вижу очевидных вещей, которые не смог разглядеть,  может вы подскажите по этому поводу что думаете?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #7 : 11-12-2014, 12:21:07 »
Я отрицательно отношусь к VBA/VB/VB.NET вообще. На это накладывается использование чужеродного для AutoCAD .NET COM-интерфейса, который только кажется похожим на VBA, но имеет кучу нюансов. На один из которых вы и наткнулись. В данном случае проблема была в том, что нужно писать не
Код - vb.net [Выбрать]
  1. Dim obj(0) As Object
а
Код - vb.net [Выбрать]
  1. Dim Objects(0 To 0) As AcadEntity
И такого будет множество...
Как поступать - решать вам. Советовать не берусь. По поводу MicroStation ничего не скажу. Я даже не в курсе поддерживает ли она работу через COM.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Visual Studio и работа с CopyObjects
« Ответ #8 : 26-08-2015, 07:43:39 »
До чего же интересная дискуссия! Надо опробовать!

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Visual Studio и работа с CopyObjects
« Ответ #9 : 26-08-2015, 07:51:31 »
Александр Ривилис, здравствуйте!

Знаете Вы кто?

Вы - гений!

Все заработало, зашуршало и зафурычило! +1500 к Вашей карме, это даже мало! Были бы деньги - завалил бы Вас золотыми слитками! Но увы, пока только дифирамбы в Ваш адрес примите )))

А любите Вы VB или нет - это не мешает Вам. Если б Вы только могли доходчиво объяснить почему стоит выбрать C# или С++, я бы метнулся в первый магазин за книгой по данному языку.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #10 : 26-08-2015, 11:36:24 »
Знаете Вы кто?

Вы - гений!
Конечно знаю.  ;)

Если б Вы только могли доходчиво объяснить почему стоит выбрать C# или С++, я бы метнулся в первый магазин за книгой по данному языку.

Слишком много аргументов. Все и не перечислишь. Во-первых, C# - это родной язык для .NET, а VB.NET специально допиливают для поддержки функционала .NET. Во-вторых, изначально Basic - это учебный язык, а C/C++/C# - это язык для профессионалов. Ну и в-третьих, из всех примеров по .NET и в частности по AutoCAD .NET API, 90% написаны на C#, еще 7% на VB.NET и 3% на managed C++. Так что готовый пример-образец проще всего найти на C#.
Думаю, этого должно быть достаточно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Visual Studio и работа с CopyObjects
« Ответ #11 : 26-08-2015, 12:14:41 »
Пора идти за книгой по C#

Оффлайн Khasan Mamaev

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Visual Studio и работа с CopyObjects
« Ответ #12 : 24-04-2017, 15:15:15 »
Я отрицательно отношусь к VBA/VB/VB.NET вообще. На это накладывается использование чужеродного для AutoCAD .NET COM-интерфейса, который только кажется похожим на VBA, но имеет кучу нюансов. На один из которых вы и наткнулись. В данном случае проблема была в том, что нужно писать не
Код - vb.net [Выбрать]
Dim obj(0) As Object
а
Код - vb.net [Выбрать]
Dim Objects(0 To 0) As AcadEntity

На днях возникла необходимость решить эту задачу в IronPython, препятствием стало создание массива объектов, при помощи сообществ Питон и СиШарп не удалось подобрать нужный массив

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Visual Studio и работа с CopyObjects
« Ответ #13 : 24-04-2017, 15:26:39 »
Я ничего не понимаю в Питонах, но думаю, что это должно выглядеть как-то так:
Код - Python [Выбрать]
  1. Objects = Array.CreateInstance(AcadEntity, 1)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Khasan Mamaev

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Visual Studio и работа с CopyObjects
« Ответ #14 : 24-04-2017, 15:43:53 »
Я ничего не понимаю в Питонах, но думаю, что это должно выглядеть как-то так:
Код - Python [Выбрать]
Objects = Array.CreateInstance(AcadEntity, 1)

NameError: name 'AcadEntity' is not defined