Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012

Автор Тема: Создание полилинии по точкам COGO в AutoCAD Civil 3d 2012  (Прочитано 32910 раз)

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Насколько я знаю, они и раньше там же лежали. Сейчас на работе нет ничего ранее 2014, вечером из дома могу уточнить.
P.S. Уточнил. Действительно, в версиях 2009 и 2012 их там нет. В промежуточных, наверное, тоже. Буду знать :)
« Последнее редактирование: 21-04-2015, 09:27:50 от Дмитрий Загорулькин »

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Список 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 версии

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил инсталляционный пакет 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

Так что их при желании можно взять оттуда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Все эти dll-файлы есть в её составе в двух следующих каталогах:
x64\C3D\Program Files\root
........
x64\C3D\Program Files\root\GACD056
Спасибо, всё нашлось. Подключил - работает

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
В Civil 3D 2012 .NET API не было возможности работать с CogoPoint.
А как тогда понимать вот это:


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Хм... Вот тут 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,
Может быть, в справке есть, а по факту - не реализовано? Надо проверять.

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Подскажите плиз в чём проблема здесь:
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. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А как тогда понимать вот это:
Могу заблуждаться, т.к. с Civil 3d не работаю. Если сравнить набор методов и свойств у CogoPoint и PointEntity: http://docs.autodesk.com/CIV3D/2014/ENU/API_Reference_Guide/html/163778ae-9fa7-6737-5afc-37c955f6f541.htm то отличие очень заметно.

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Цитировать
Подскажите плиз в чём проблема здесь:

Код - C# [Выбрать]
  1. PointEntity ptEnt = tr.GetObject(objId, OpenMode.ForRead) as PointEntity;
  2. или
  3. PointEntity ptEnt = (PointEntity)tr.GetObject(objId, OpenMode.ForRead);
C# требует явного приведения объектов к нужному типу. VB это прощает :)

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
C# требует явного приведения объектов к нужному типу. VB это прощает
Вот спасибо. Ха ха, я уже два дня бьюсь. Вот что значит неучь

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Создание и редактирование точек COGO
« Ответ #25 : 22-04-2015, 13:23:19 »
Я помню тоже вначале на этом споткнулся. Смотрел видео с примерами кода на VB и переписывал под C#. На видео все отлично работало, а у меня - нет :) Тоже довольно долго разбирался почему.

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Re: Создание и редактирование точек COGO
« Ответ #26 : 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. }
Вот, наконец-то получилось. Но тут он просто перебирает все точки чертежа.
А вот как бы узнать координаты точки, задав номер?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Создание и редактирование точек COGO
« Ответ #27 : 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. }

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

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Код - C# [Выбрать]
  1. if (myPoint.PointNumber = 1)
Это в голове моей крутилось. Просто не хочется велосипедов изобретать. Вдруг есть у Autodesk какой-нибудь метод.
Опять же в дальнейшем нужно будет строить полилинию по интервалу номеров точек (и да, в civil есть прозрачная команда 'PN, но когда постоянно делаешь одного и тоже, начинаешь лениться нажимать лишние кнопки, опять же надо будет ещё сделать, чтобы полилиния с нужными свойствами была)

ЗЫ: а с точки зрения программирования "break" - хорошо?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Создание и редактирование точек COGO
« Ответ #29 : 22-04-2015, 15:45:54 »
...с точки зрения программирования "break" - хорошо?
А что плохого то? Точка нашлась, цикл продолжать не имеет смысла.
Я, правда, не в курсе,  номер точки уникален или их может быть много с одним номером.