Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Stoner от 17-04-2015, 14:15:50

Название: Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012
Отправлено: Stoner от 17-04-2015, 14:15:50
Здравствуйте. А подскажите, пожалуйста, какое пространство имён используется для работы с точками cogo (а конкретно с координатами) и ссылку на какую dll'сборку Autodesk надо создать?
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: German от 17-04-2015, 14:59:25
http://docs.autodesk.com/CIV3D/2014/ENU/API_Reference_Guide/html/d5a6eb60-c19d-58c9-0213-73b6ed949be9.htm
Наверху все ответы
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 17-04-2015, 15:23:44
Прошу прощения, не указал версию: AutoCAD Civil 3D 2012. Никак не могу найти CogoPoints в этом reference http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/net/Index.html (http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/net/Index.html)
[Прошло какое-то время]
Нашел. Походу class PointEntity из Autodesk.Civil.Land.DatabaseServices
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 17-04-2015, 16:32:21
Нашел. Походу class PointEntity из Autodesk.Civil.Land.DatabaseServices
Думаю, что ты ошибаешься. В Civil 3D 2012 .NET API не было возможности работать с CogoPoint. Эта возможность появилась только в Civil 3D 2013. В Civil 3D 2012 с GogoPoint можно работать через ActiveX/COM. Здесь пример:
http://forums.autodesk.com/t5/autocad-civil-3d-customization/points-api-in-2012/m-p/3185062#M5888

Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 17-04-2015, 18:33:51
Это печалька. Только начал вникать в .NET. Из всех Civil, с которыми работал Civil 2012 самый стабильный по отношению к системам координат и пользовательским свойствам точек CoGo
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 17-04-2015, 21:02:23
Но из .NET ты можешь свободно пользоваться ActiveX/COM. Посмотри пример - там всё очень прозрачно.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 20-04-2015, 08:45:39
А  подскажите пожалуйста, есть ли где-нибудь документация по dll-сборкам Autocad Civil 2012.
Т.е., изучая, часто сталкиваюсь с кодом, в котором указаны пространства имён, а из какой они сборки не найти.
Например, вот эти типы данных указаны, пространство имён откуда не ясно:
Dim oAcadApp As Autodesk.AutoCAD.Interop.AcadApplication = Nothing
Dim oAeccApp As Autodesk.AECC.Interop.UiLand.AeccApplication = Nothing
Dim oAeccDoc As Autodesk.AECC.Interop.UiLand.AeccDocument = Nothing
Dim oAeccDB As Autodesk.AECC.Interop.Land.AeccDatabase = Nothing
Как я понял это надо библиотеки ObjectARX подключать?
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 20-04-2015, 11:58:47
Как я понял это надо библиотеки ObjectARX подключать?
Нет. Почитай статью: http://knowledge.autodesk.com/support/autocad-civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/Civil3D-DevGuide/files/GUID-DD447A5A-DF8B-4905-8BFC-4CBFA1C7C121-htm.html
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 20-04-2015, 13:03:25
Почитал. Там вот это написано:
Цитировать
On the Browse tab, browse to the Civil 3D install directory, and select the following COM interop DLLs, where <domain> is the Civil domain you want to use (Land, Roadway, Pipe, or Survey):
Autodesk.AEC.Interop.Base
Autodesk.AEC.Interop.UiBase
Autodesk.AutoCAD.Interop
Autodesk.AutoCAD.Interop.Common
Autodesk.AECC.Interop.<domain>
Autodesk.AECC.Interop.Ui<domain>
Я скачал ObjectARX для AutoCAD 2012 отсюда http://adn-cis.org/forum/index.php?topic=61.0
Там нашёл Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll.
А вот остальных библиотек нет на моём компьютере =(
Autocad у меня Civil 3d 2012. Помогите, пожалуйста
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 20-04-2015, 13:08:04
А вот остальных библиотек нет на моём компьютере =(
В каталоге с AutoCAD Civil 3d 2012 их нет?
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 20-04-2015, 13:13:27
Нету, нашёл в DWG True View 2015. опять же только Autodesk.Autocad.Interop.dll и  Autodesk.Autocad.Interop.Common.dll
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 20-04-2015, 16:03:02
Насколько я помню в AutoCAD Civil 3D до версии 2012 включительно эти все дополнительные модули регистрировались в системе и добавлять их нужно через вкладку COM, а не Browse. Начиная с версии 2013 они поставляются как отдельные dll-файлы.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 20-04-2015, 16:11:12
Огромное спасибо. Всё нашёл
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 20-04-2015, 16:13:39
Список DLL файлов для COM API Civil 3D:
Autodesk.AEC.Interop.Base.dll
Autodesk.AEC.Interop.UIBase.dll
Autodesk.AECC.Interop.Land.dll
Autodesk.AECC.Interop.UiLand.dll
Autodesk.AECC.Interop.Pipe.dll
Autodesk.AECC.Interop.UiPipe.dll
Autodesk.AECC.Interop.Roadway.dll
Autodesk.AECC.Interop.UiRoadway.dll
Autodesk.AECC.Interop.Survey.dll
Autodesk.AECC.Interop.UiSurvey.dll
Они все находятся в папке, куда установлен Civil 3D, рядом с файлом acad.exe.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 20-04-2015, 16:14:46
Дмитрий Загорулькин, Это насколько я понял начиная с версии 2013, а у Stoner версия 2012.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 20-04-2015, 16:17:09
Насколько я знаю, они и раньше там же лежали. Сейчас на работе нет ничего ранее 2014, вечером из дома могу уточнить.
P.S. Уточнил. Действительно, в версиях 2009 и 2012 их там нет. В промежуточных, наверное, тоже. Буду знать :)
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 20-04-2015, 16:28:24
Список DLL файлов для COM API Civil 3D:
Autodesk.AEC.Interop.Base.dll
Autodesk.AEC.Interop.UIBase.dll
Autodesk.AECC.Interop.Land.dll
Autodesk.AECC.Interop.UiLand.dll
Autodesk.AECC.Interop.Pipe.dll
Autodesk.AECC.Interop.UiPipe.dll
Autodesk.AECC.Interop.Roadway.dll
Autodesk.AECC.Interop.UiRoadway.dll
Autodesk.AECC.Interop.Survey.dll
Autodesk.AECC.Interop.UiSurvey.dll
Они все находятся в папке, куда установлен Civil 3D, рядом с файлом acad.exe.
Но как выяснилось в autocad позднее 2012 версии
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 20-04-2015, 17:59:07
Проверил инсталляционный пакет AutoCAD 2012 x64 Russian. Все эти dll-файлы есть в её составе в двух следующих каталогах:

x64\C3D\Program Files\root

x64\C3D\Program Files\root\Autodesk.AECC.Interop.Land.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.Pipe.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.Roadway.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.Survey.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.UiLand.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.UiPipe.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.UiRoadway.dll
x64\C3D\Program Files\root\Autodesk.AECC.Interop.UiSurvey.dll

x64\C3D\Program Files\root\GACD056

x64\C3D\Program Files\root\GACD056\Autodesk.AEC.Interop.Base.dll
x64\C3D\Program Files\root\GACD056\Autodesk.AEC.Interop.Details.dll
x64\C3D\Program Files\root\GACD056\Autodesk.AEC.Interop.UIBase.dll

Так что их при желании можно взять оттуда.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 08:26:20
Все эти dll-файлы есть в её составе в двух следующих каталогах:
x64\C3D\Program Files\root
........
x64\C3D\Program Files\root\GACD056
Спасибо, всё нашлось. Подключил - работает
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Владимир Шу от 22-04-2015, 11:37:01
В Civil 3D 2012 .NET API не было возможности работать с CogoPoint.
А как тогда понимать вот это:

Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 22-04-2015, 11:47:13
Хм... Вот тут http://forums.autodesk.com/t5/autocad-civil-3d-customization/points-api-in-2012/m-p/3185062 Partha Sarkar однозначно утверждает, что только через COM.
Цитировать
Hi Bill,
 
Points are not yet available in .NET, however you can use the exiting Points COM API in VB.NET application using Interop. I have  code snippet on creating COGO point in Civil 3D 2012 using COM API in a VB.NET project, I can share with you if that helps.
 
Thanks,
Может быть, в справке есть, а по факту - не реализовано? Надо проверять.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 11:59:02
Подскажите плиз в чём проблема здесь:
Error 5 Cannot implicitly convert type 'Autodesk.AutoCAD.DatabaseServices.DBObject' to
'Autodesk.Civil.Land.DatabaseServices.PointEntity'. An explicit conversion exists (are you missing a cast?)

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6.  
  7. using Autodesk.Civil.ApplicationServices;
  8. using Autodesk.Civil.Land;
  9. using Autodesk.Civil.Land.DatabaseServices;
  10.  
  11. namespace HelloWorld
  12. {
  13.     public class Class1:IExtensionApplication
  14.     {
  15.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  16.         public void Initialize()
  17.         {
  18.             ed.WriteMessage("Поздравляю вас, сборка загружена.");
  19.         }
  20.         public void Terminate()
  21.         {
  22.             ed.WriteMessage("Сборка выгружена. До свидания");
  23.         }
  24.         [CommandMethod("HelloWorld")]
  25.         public void HelloWorld()
  26.         {
  27.             ed.WriteMessage("Пхай-Пхай");
  28.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  29.             CivilDocument civdoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  30.             using (Transaction trans=doc.TransactionManager.StartTransaction())
  31.             {
  32.                 foreach (ObjectId myPointID in civdoc.GetAllPointIds())
  33.                 {
  34.                     PointEntity myPoint=myPointID.GetObject(OpenMode.ForRead);
  35.  
  36.  
  37.                 }
  38.             }
  39.         }
  40.     }
  41. }
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 22-04-2015, 12:16:57
А как тогда понимать вот это:
Могу заблуждаться, т.к. с Civil 3d не работаю. Если сравнить набор методов и свойств у CogoPoint и PointEntity: http://docs.autodesk.com/CIV3D/2014/ENU/API_Reference_Guide/html/163778ae-9fa7-6737-5afc-37c955f6f541.htm то отличие очень заметно.

Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 22-04-2015, 12:18:49
Цитировать
Подскажите плиз в чём проблема здесь:

Код - C# [Выбрать]
  1. PointEntity ptEnt = tr.GetObject(objId, OpenMode.ForRead) as PointEntity;
  2. или
  3. PointEntity ptEnt = (PointEntity)tr.GetObject(objId, OpenMode.ForRead);
C# требует явного приведения объектов к нужному типу. VB это прощает :)
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 12:51:18
C# требует явного приведения объектов к нужному типу. VB это прощает
Вот спасибо. Ха ха, я уже два дня бьюсь. Вот что значит неучь
Название: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 22-04-2015, 13:23:19
Я помню тоже вначале на этом споткнулся. Смотрел видео с примерами кода на VB и переписывал под C#. На видео все отлично работало, а у меня - нет :) Тоже довольно долго разбирался почему.
Название: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 13:34:32
Код - C# [Выбрать]
  1. using System;
  2. //-----------------------------------------
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. //-----------------------------------------
  8. using Autodesk.Civil.ApplicationServices;
  9. using Autodesk.Civil.Land;
  10. using Autodesk.Civil.Land.DatabaseServices;
  11.  
  12.  
  13. namespace HelloWorld
  14. {
  15.     public class Class1:IExtensionApplication
  16.     {
  17.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  18.         public void Initialize()
  19.         {
  20.             ed.WriteMessage("Поздравляю вас, сборка загружена.");
  21.         }
  22.         public void Terminate()
  23.         {
  24.             ed.WriteMessage("Сборка выгружена. До свидания");
  25.         }
  26.         [CommandMethod("HelloWorld")]
  27.         public void HelloWorld()
  28.         {
  29.             ed.WriteMessage("Пхай-Пхай");
  30.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  31.             CivilDocument civdoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  32.             using (Transaction trans=doc.TransactionManager.StartTransaction())
  33.             {
  34.                 foreach (ObjectId myPointID in civdoc.GetAllPointIds())
  35.                 {
  36.                     PointEntity myPoint=(PointEntity)myPointID.GetObject(OpenMode.ForRead);
  37.                     ed.WriteMessage("\n------------------------------");
  38.                     ed.WriteMessage("\nНомер точки: "+myPoint.PointNumber);
  39.                     ed.WriteMessage("\nКоординаты точки: X=" + myPoint.Location.Y+"; Y="+myPoint.Location.X);
  40.                 }
  41.                 trans.commit();
  42.             }
  43.         }
  44.     }
  45. }
Вот, наконец-то получилось. Но тут он просто перебирает все точки чертежа.
А вот как бы узнать координаты точки, задав номер?
Название: Re: Создание и редактирование точек COGO
Отправлено: Владимир Шу от 22-04-2015, 14:52:41
Ага, таки можно получит доступ к COGO точкам через NET API в Civil3d 2012 =)


https://sites.google.com/site/bushmansnetlaboratory/translate-manual/upravlenie-sredoj-autocad/podskazka-polzovatelskogo-vvoda/metod-getstring , а затем тупо и в лоб (про приведение типов и прочее не забывай):
Код - C# [Выбрать]
  1.                
  2. foreach (ObjectId myPointID in civdoc.GetAllPointIds())
  3. {
  4.    PointEntity myPoint = (PointEntity)myPointID.GetObject(OpenMode.ForRead);
  5.    if (myPoint.PointNumber = 1)
  6.       {
  7.           ed.WriteMessage("\n------------------------------");
  8.           ed.WriteMessage("\nНомер точки: " + myPoint.PointNumber);
  9.           ed.WriteMessage("\nКоординаты точки: X=" + myPoint.Location.Y + "; Y=" + myPoint.Location.X);
  10.           break;
  11.       }
  12. }
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 15:37:45
Код - C# [Выбрать]
  1. if (myPoint.PointNumber = 1)
Это в голове моей крутилось. Просто не хочется велосипедов изобретать. Вдруг есть у Autodesk какой-нибудь метод.
Опять же в дальнейшем нужно будет строить полилинию по интервалу номеров точек (и да, в civil есть прозрачная команда 'PN, но когда постоянно делаешь одного и тоже, начинаешь лениться нажимать лишние кнопки, опять же надо будет ещё сделать, чтобы полилиния с нужными свойствами была)

ЗЫ: а с точки зрения программирования "break" - хорошо?
Название: Re: Создание и редактирование точек COGO
Отправлено: Владимир Шу от 22-04-2015, 15:45:54
...с точки зрения программирования "break" - хорошо?
А что плохого то? Точка нашлась, цикл продолжать не имеет смысла.
Я, правда, не в курсе,  номер точки уникален или их может быть много с одним номером.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 22-04-2015, 19:11:30
if (myPoint.PointNumber = 1)
Только мне кажется, что в этой строке ты присваиваешь myPoint.PointNumber значение 1?
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Владимир Шу от 22-04-2015, 19:16:13
if (myPoint.PointNumber = 1)
Только мне кажется, что в этой строке ты присваиваешь myPoint.PointNumber значение 1?

Посыпаю голову пеплом, конечно же if (myPoint.PointNumber == 1) , VB еще сказывается...
Название: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 22-04-2015, 21:51:43
Но чего то я не могу найти в Civil 2012 методы для работы с точками COGO.
Видимо этого то и нет. Придётся руками
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 22-04-2015, 22:13:57
Но чего то я не могу найти в Civil 2012 методы для работы с точками COGO.
Видимо этого то и нет. Придётся руками
Так может всё-таки через COM/ActiveX?
Название: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 23-04-2015, 12:03:54
Ни как не могу понять в чём суть COM/ActiveX. Есть какая-нибудь документация для Autocad?
А документацию лучше тут %ProgramFiles%\Common Files\Autodesk Shared\acad_aag.chm смотреть?
Как я понял, эволюция такая: OLE -> COM -> COM/ActiveX -> .NET.
Т.е. те же яйца - вид сбоку.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 23-04-2015, 12:12:47
Ни как не могу понять в чём суть COM/ActiveX.
После того, как ты подключил нужные dll-файлы (или на вкладке COM) - всё остальное для тебя не отличается от работы с .NET. Единственно что тебе нужно смотреть в Object Browser какие классы/методы/свойства есть у Civil 3D в этих библиотеках.
Есть какая-нибудь документация для Autocad?
Документация на что? Как работать с ActiveX/COM моделью AutoCAD? Есть. Хотя она написана больше для работы в VBA:
Или это: AutoCAD ActiveX Guide 2013 (http://images.autodesk.com/adsk/files/autocad_2013_activex_help.zip)
Название: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 23-04-2015, 12:14:23
Большое спасибо. Как то понятнее стало
Название: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 23-04-2015, 15:36:02
В общем, допёр я как использовать COM. Как-то. Скорее всего ещё будут проблемы. Спасибо вашим пинкам, иначе забросил бы это дело уже.
Вот мой тренировочный код, в котором я выбираю через COM точку типа AeccPoint по номеру:
Код - C# [Выбрать]
  1. //-----------------------------------------
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. //-----------------------------------------
  7. using Autodesk.Civil.ApplicationServices;
  8. using Autodesk.Civil.Land.DatabaseServices;
  9.  
  10. using Autodesk.AutoCAD.Interop;
  11. using Autodesk.AECC.Interop.Land;
  12. using Autodesk.AECC.Interop.UiLand;
  13.  
  14. namespace HelloWorld
  15. {
  16.     public class Class1:IExtensionApplication
  17.     {
  18.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  19.         public void Initialize()
  20.         {
  21.             ed.WriteMessage("Поздравляю вас, сборка загружена.");
  22.         }
  23.         public void Terminate()
  24.         {
  25.             ed.WriteMessage("Сборка выгружена. До свидания");
  26.         }
  27.         [CommandMethod("HelloWorld")]
  28.         public void HelloWorld()
  29.         {
  30.             ed.WriteMessage("Пхай-Пхай");
  31.             AcadApplication oAcadApp = (AcadApplication)Application.AcadApplication;
  32.             string sCivilAppName = "AeccXUiLand.AeccApplication.9.0";
  33.             AeccApplication oCivilApp = (AeccApplication)oAcadApp.GetInterfaceObject(sCivilAppName);
  34.             AeccDocument oDocument = (AeccDocument)oCivilApp.ActiveDocument;
  35.             AeccPoints oPoints = (AeccPoints)oDocument.Points;
  36.             AeccPoint oPoint1;
  37.             oPoint1 = oPoints.Find(3);
  38.             ed.WriteMessage("\n------------------------------");
  39.             ed.WriteMessage("\nНомер точки: " + oPoint1.Number);
  40.             ed.WriteMessage("\nКоординаты точки: X={0}; Y={1}", oPoint1.Northing, oPoint1.Easting);
  41.             double[] lower = new double[3] { 10, 10, 0 };
  42.             double[] upper = new double[3] { 100, 100, 0 };
  43.             ZoomPlineCOM(lower, upper);
  44.         }
  45.         public void ZoomPlineCOM(double[] lower,double[] upper) //Зум по координатам окна, которые берутся из созданной полилинии
  46.         {
  47.             AcadApplication oAcadApp = (AcadApplication)Application.AcadApplication;
  48.             string sCivilAppName="AeccXUiLand.AeccApplication.9.0";
  49.             AeccApplication oCivilApp = (AeccApplication)oAcadApp.GetInterfaceObject(sCivilAppName);
  50.             AeccDocument oDocument = (AeccDocument)oCivilApp.ActiveDocument;
  51.             oCivilApp.ZoomWindow(lower, upper);
  52.         }
  53.     }
  54. }

Вопрос 1: насчёт транзакции. Надо ли её использовать при обращении к объектам через COM? Так то всё работает.
Вопрос 2: Код ниже обязательно в каждой функции прописывать или же достаточно один раз где то?

Код - C# [Выбрать]
  1. AcadApplication oAcadApp = (AcadApplication)Application.AcadApplication;
  2. string sCivilAppName="AeccXUiLand.AeccApplication.9.0";
  3. AeccApplication oCivilApp = (AeccApplication)oAcadApp.GetInterfaceObject(sCivilAppName);
  4. AeccDocument oDocument = (AeccDocument)oCivilApp.ActiveDocument;

Вопрос 3: рефёренсы. Вылезло 88 варнингов типа "Warning   1   Reference to type 'Autodesk.AutoCAD.Interop.AcWindowState' claims it is defined in 'c:\Autocad DLL\Autodesk.AutoCAD.Interop.dll', but it could not be found   c:\Autocad DLL\Autodesk.AECC.Interop.UiLand.dll   HelloWorld".
Взял dll из папки [Дистрибутив Autocad]\x64\C3D\Program Files\root. Может я чего то не так или может не то подключил?

Нашёл по этой ошибке в AutoCAD_Civil_3D_2011_API_Developer_s_Guide вот это:
Цитировать
NOTE You may see warnings about types not being found in various Autodesk.AutoCAD.Interop namespaces
(warning type 1684). To disable these warnings, enter 1684 under Supress Warnings on the Build tab of the
project’s properties.
На это стоит обращать внимание?
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 23-04-2015, 16:40:07
Вопрос 1: насчёт транзакции. Надо ли её использовать при обращении к объектам через COM? Так то всё работает.
Если работаешь только через COM, то транзакция необязательна, но желательна для группировки действий для отмены.

Вопрос 2: Код ниже обязательно в каждой функции прописывать или же достаточно один раз где то?
Можешь это сделать и один раз и объявить эти переменные не локальными в методе, а на уровне класса. Но тут есть нюансы. 
У каждого документа (чертежа) своё значение oDocument. Поэтому вычислить его один раз и навсегда не получится.

На это стоит обращать внимание?
Можешь не обращать внимание или сделать как написано в руководстве, т.е. подавить предупреждение с кодом 1684 в настройке проекта.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 23-04-2015, 17:05:31
P.S.: Как я понимаю следующая строка:
Код - C# [Выбрать]
  1. oPoint1 = oPoints.Find(3);
при отсутствии точки с номером 3 приводит к исключению, которое у тебя не обрабатывается. Так что не забудь поставить там try/catch
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Дмитрий Загорулькин от 23-04-2015, 17:13:30
Нашёл по этой ошибке в AutoCAD_Civil_3D_2011_API_Developer_s_Guide вот это
Так-так-так! А можно поподробнее? Где нашли это руководство и где в нем эта запись? Меня эти предупреждения об ошибках очень уже очень сильно достали.
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Александр Ривилис от 23-04-2015, 17:16:39
Дмитрий Загорулькин, а поиском не пробовал? ;)
http://knowledge.autodesk.com/support/autocad-civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/Civil3D-DevGuide/files/GUID-DD447A5A-DF8B-4905-8BFC-4CBFA1C7C121-htm.html
Там как раз про это предупреждение.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F5502%2F7842324.3%2F0_fcef3_dc96f0ab_orig.png&hash=9df1f5cc9f6b4f6e31446f377b0a6224)
Название: Re: Re: Создание и редактирование точек COGO
Отправлено: Stoner от 24-04-2015, 12:11:26
Так что не забудь поставить там try/catch
Спасибо за совет
Название: Re: Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012
Отправлено: Stoner от 28-04-2015, 09:35:24
Получилось написать таки некое подобие чего хотелось. Спасибо большое за подсказки
Подключенные библиотеки (подскажите, если что лишнее):
---- Мною ----
acdbmgd.dll
acmgd.dll
AecBaseMgd.dll
AeccDbMgd.dll
Autodesk.AEC.Interop.Base.dll
Autodesk.AEC.Interop.UIBase.dll
Autodesk.AECC.Interop.Land.dll
Autodesk.AECC.Interop.UiLand.dll
Autodesk.AutoCAD.Interop.dll
Autodesk.AutoCAD.Interop.Common.dll
---- Были в стандартном проекте Visual Studio ----
Microsoft.CSharp.dll
stdole.dll
System.dll
System.Core.dll
System.Data.dll
System.Data.DataSetExtensions.dll
System.Xml.dll
System.Xml.Linq.dll

Сам код:
Код - C# [Выбрать]
  1. using System;
  2. //-----------------------------------------
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. //-----------------------------------------
  9. using Autodesk.AutoCAD.Interop;
  10. using Autodesk.AECC.Interop.Land;
  11. using Autodesk.AECC.Interop.UiLand;
  12.  
  13. namespace LineObstacles
  14. {
  15.     public class PolylineObs:IExtensionApplication
  16.     {
  17.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  18.         public void Initialize()
  19.         {
  20.             ed.WriteMessage("Поздравляю вас, сборка загружена.");
  21.         }
  22.         public void Terminate()
  23.         {
  24.             ed.WriteMessage("Сборка выгружена. До свидания");
  25.         }
  26.         //Подключение к документу через COM
  27.         static AcadApplication oAcadApp = (AcadApplication)Application.AcadApplication;
  28.         static AeccApplication oCivApp = (AeccApplication)oAcadApp.GetInterfaceObject("AeccXUiLand.AeccApplication.9.0");
  29.         static AeccDocument oDoc = (AeccDocument)oCivApp.ActiveDocument;
  30.         //---------------------------------
  31.         static Document acDoc = Application.DocumentManager.MdiActiveDocument;
  32.         static Database acCurDb = acDoc.Database;
  33.         AeccPoints oPoints = (AeccPoints)oDoc.Points;
  34.         AeccPoint oPointTMP = null;
  35.         AeccPoint oPointA = null;
  36.         AeccPoint oPointB = null;
  37.         bool exit=false;
  38.  
  39.         [CommandMethod("plineCOGO")]
  40.         public void plineCOGO()
  41.         {
  42.             do//Создание полилинии циклично пока не ESC
  43.             {
  44.                 PromptIntegerResult intResult;
  45.                 //Сообщения для ввода номера
  46.                 intResult = inputNumCogo("\nВведите номер начальной точки [Выход - ESC]: ");
  47.                 if (intResult.Status == PromptStatus.OK)
  48.                 {
  49.                     oPointA = oPointTMP;
  50.                     ed.WriteMessage("\nВыбрана точка с номером " + oPointA.Number);
  51.                     ed.WriteMessage("\nКоординаты точки: Y={0}; X={1}", oPointA.Northing, oPointA.Easting);
  52.                     intResult = inputNumCogo("\nВведите номер конечной точки [Выход - ESC]: ");
  53.                     if (intResult.Status == PromptStatus.OK)
  54.                     {
  55.                         oPointB = oPointTMP;
  56.                         ed.WriteMessage("\nВыбрана точка с номером " + oPointB.Number);
  57.                         ed.WriteMessage("\nКоординаты точки: Y={0}; X={1}", oPointB.Northing, oPointB.Easting);
  58.                         //Переменные minX,minY,maxX,maxY для зума на созданную полилинию
  59.                         double minY = Math.Min(oPointA.Northing, oPointB.Northing);
  60.                         double minX = Math.Min(oPointA.Easting, oPointB.Easting);
  61.                         double maxY = Math.Max(oPointA.Northing, oPointB.Northing);
  62.                         double maxX = Math.Max(oPointA.Easting, oPointB.Easting);
  63.                         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  64.                         {
  65.                             BlockTable acBlkTbl;
  66.                             acBlkTbl = (BlockTable)acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead);
  67.                             BlockTableRecord acBlkTblRec;
  68.                             acBlkTblRec = (BlockTableRecord)acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  69.                             Polyline acPoly = new Polyline();
  70.                             //Задание свойств полилинии (в будущем сделать окно выбора при загрузке сборки с дефолтом)
  71.                             acPoly.SetDatabaseDefaults();
  72.                             acPoly.ColorIndex = 7;
  73.                             acPoly.LineWeight = LineWeight.LineWeight060;
  74.                             acPoly.Layer = "11_Препятствия";//Сделать проверку на наличие
  75.                             int num = oPointA.Number;
  76.                             int v = 0;//Счётчик вершин полилинии
  77.                             bool status;//Статус пропуска отсутствующий номеров
  78.                             while (num <= oPointB.Number)//В будущем сделать с реверсом, если oPointA.Number>oPointB.number
  79.                             {
  80.                                 status = true;
  81.                                 try
  82.                                 {
  83.                                     oPointTMP = oPoints.Find(num);
  84.                                 }
  85.                                 catch (ArgumentException)
  86.                                 {
  87.                                     ed.WriteMessage("\nПолучен отсутствующий номер - " + num);
  88.                                     status = false;
  89.                                 }
  90.                                 if (status == true)
  91.                                 {
  92.                                     acPoly.AddVertexAt(v, new Point2d(oPointTMP.Easting, oPointTMP.Northing), 0, 0, 0);
  93.                                     v++;
  94.                                     minX = Math.Min(minX, oPointTMP.Easting);
  95.                                     minY = Math.Min(minY, oPointTMP.Northing);
  96.                                     maxX = Math.Max(maxX, oPointTMP.Easting);
  97.                                     maxY = Math.Max(maxY, oPointTMP.Northing);
  98.                                 }
  99.                                 num++;
  100.                             }
  101.                             //Запись полилинии в базу (в будущем сделать возможность замыкания)
  102.                             acBlkTblRec.AppendEntity(acPoly);
  103.                             acTrans.AddNewlyCreatedDBObject(acPoly, true);
  104.                             acTrans.Commit();
  105.                             //Зум с офсетом 100
  106.                             double[] lower = new double[3] { minX - 100, minY - 100, 0 };
  107.                             double[] upper = new double[3] { maxX + 100, maxY + 100, 0 };
  108.                             oCivApp.ZoomWindow(lower, upper);
  109.                         }
  110.                     }
  111.                     else
  112.                     {
  113.                         ed.WriteMessage("\nПроизведён выход");//Выход при нажатии ESC
  114.                         exit = true;
  115.                     }
  116.                 }
  117.                 else
  118.                 {
  119.                     ed.WriteMessage("\nПроизведён выход");
  120.                     exit = true;
  121.                 }
  122.             } while (exit == false);
  123.            
  124.         }
  125.         //Ввод номеров точек с поиском по базе, возвращает результат поиска
  126.         //На входе сообщение для ввода данных (в будущем сделать ввод интервала через "-")
  127.         public PromptIntegerResult inputNumCogo(string Message)
  128.         {
  129.             PromptIntegerResult intResult;
  130.             PromptIntegerOptions intOption = new PromptIntegerOptions("");
  131.             intOption.AllowNone = false;
  132.             intOption.AllowZero = false;
  133.             intOption.AllowNegative = false;
  134.             intOption.Message = Message;
  135.             int num;
  136.             bool status;
  137.             do
  138.             {
  139.                 intResult = ed.GetInteger(intOption);
  140.                 num = intResult.Value;
  141.                 status = true;
  142.                 if (intResult.Status == PromptStatus.OK)
  143.                 {
  144.                     try
  145.                     {
  146.                         oPointTMP = oPoints.Find(num);
  147.                     }
  148.                     catch (ArgumentException)
  149.                     {
  150.                         status = false;
  151.                         ed.WriteMessage("\nПолучен отсутствующий номер!");
  152.                     }
  153.                 }
  154.             } while ((status == false) && (intResult.Status == PromptStatus.OK));
  155.             return intResult;
  156.         }
  157.     }
  158. }
Может что то в смысле алгоритмизации не так?
Транзакцию использовал только при создании полилинии. Подумал, что точки COGO только читаются, поэтому нафиг.
Всем спасибо
ЗЫ: код должен строить полилинию с заданными свойствами по интервалу номеров точек COGO, заданным пользователем.
Название: Re: Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012
Отправлено: Дмитрий Загорулькин от 28-04-2015, 10:30:39
Я бы убрал реализацию IExtensionApplication - она тут не нужна. Или, если нужно как-то просигнализировать о загрузке сборки, выводить более информативное сообщение вместо "Поздравляю, сборка загружена". Какая сборка? Кто автор? Какие команды она добавляет? Такая информация будет более полезна.
Если нужен зум по полилинии, то можно воспользоваться ее свойством acPoly.GeometricExtents. Тогда, возможно, не надо будет танцев с определением минимальных и максимальных координат. В любом случае, использование Extents3d в данном случае будет удобнее.
А по алгоритму сложно что-то сказать - по комментариям сложно понять, что должен делать код.
Название: Re: Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012
Отправлено: Stoner от 28-04-2015, 11:43:04
Я бы убрал реализацию IExtensionApplication - она тут не нужна. Или, если нужно как-то просигнализировать о загрузке сборки, выводить более информативное сообщение вместо "Поздравляю, сборка загружена". Какая сборка? Кто автор? Какие команды она добавляет? Такая информация будет более полезна.
Если нужен зум по полилинии, то можно воспользоваться ее свойством acPoly.GeometricExtents. Тогда, возможно, не надо будет танцев с определением минимальных и максимальных координат. В любом случае, использование Extents3d в данном случае будет удобнее.
А по алгоритму сложно что-то сказать - по комментариям сложно понять, что должен делать код.
Спасибо. Учёл замечания. GeometricExtents - хорошо, а то я лясик изобретать начал.
Код должен строить полилинию с заданными свойствами по интервалу номеров точек COGO, заданным пользователем