Помогите новичку разобраться

Автор Тема: Помогите новичку разобраться  (Прочитано 6174 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Здравствуйте.
Недавно начал заниматься программированием для autocad. Уже написал пару *.dll с командами для autocad и приложение с доступом через com типа “Hello Word”. Объем работ, который приходится выполнять в autocad заставляет писать что-то более практичное и тут возникает множество вопросов и непонимания. Надеюсь, вы поможете разобраться.
Итак, нужно написать *.dll библиотеку, с командой, которая должна считать количество блоков с определённым именем, получать координаты расположения базовой точки каждого блока (относительно оси координат), осуществлять чтение\ запись в атрибуты, которые находятся в блоке и получать состояние видимости каждого блока.
Пока команда умеет находить блоки, проверять имя, и считать их кол-во:
Код - C# [Выбрать]
  1.         [CommandMethod("MyCommand")]
  2.         public void iterateThroughAllObjects()
  3.         {
  4.             var Editor = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             int countOfBlock = 0;
  6.             // получаем текущую БД
  7.             Database db = HostApplicationServices.WorkingDatabase;
  8.  
  9.             // начинаем транзакцию
  10.             using (Transaction tr = db.TransactionManager.StartTransaction())
  11.             {// получаем ссылку на пространство модели (ModelSpace)
  12.                 BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
  13.                 // "пробегаем" по всем объектам в пространстве модели
  14.                 foreach (ObjectId id in ms)
  15.                 {
  16.                     // приведение типов
  17.                     Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead);
  18.                     BlockTable blocktab = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  19.                     //BlockTableRecord mybtr = (BlockTableRecord)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  20.  
  21.                     if (blocktab.GetType() == typeof(BlockReference))
  22.                    {
  23.                        Editor.WriteMessage("typeof(BlockReference");
  24.                     }
  25.  
  26.                     string name= "ABCD";
  27.                        
  28.                     if (blocktab.Has(name))
  29.                         {
  30.                          countOfBlock += 1;
  31.                         Editor.WriteMessage(blocktab.Id.ToString());
  32.                         Editor.WriteMessage(blocktab.AcadObject.ToString());
  33.                         }
  34.                 }
  35.  
  36.                 Editor.WriteMessage("Кол-во =" + countOfBlock.ToString());
  37.  
  38.                 tr.Commit();
  39.             }            
  40.  

Основная моя проблема в том, что у меня не складывается полного представление о том, что содержится в accoremgd.dll, acdbmgd.dll, acdbmgd.dll, где  в них находятся нужные мне параметры и функции, и где какие типы нужно использовать.
Про иерархию читал  тут https://sites.google.com/site/bushmansnetlaboratory/translate-manual/osnovy-autocad-net-api/ponimanie-ierarhii-obektov-autocad и на http://docs.autodesk.com/ . И используемые *.dll смотрел в object browser.
Вот к примеру:
Код - C# [Выбрать]
  1. string name= "ABCD";
  2. if (blocktab.Has(name))
Я так понимаю, что вернется true, если имя блока будет включать себя то, что содержится в переменной name. Т.е. если название блока будет "ABCDF" или "ABCD1" то тоже вернется true. ".Has" я использую т.к. blocktab типа BlockTable не имеет поля "Имя".  У типа BlockTableRecord есть поля "Name" и "Origin" (последнее, вроде бы расположение базовой точки блока).  Но этот тип используется для записи в чертеж, и при преобразовании:
Код - C# [Выбрать]
  1. BlockTableRecord mybtr = (BlockTableRecord)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
выдает ошибку.

Далее. Для загрузки *.dll в autocad используется команду Netload. А какой командой ее выгрузить? Приходится закрывать автокад, для того что бы завершить процесс чтения с *.dll.

Далее. Можно ли использовать пространства имен Autodesk.AutoCAD.ApplicationServices.Core.Application в WindowsForms приложении?
Т.е. есть приложение, которое связывается с автокадом через com:

Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. using Autodesk.AutoCAD.ApplicationServices;
  11. using Autodesk.AutoCAD.DatabaseServices;
  12. using Autodesk.AutoCAD.Geometry;
  13. using Autodesk.AutoCAD.Runtime;
  14. using Autodesk.AutoCAD.EditorInput;
  15.  
  16. using Autodesk.AutoCAD.Interop;
  17. using Autodesk.AutoCAD.Interop.Common;
  18. using System.Runtime.InteropServices;
  19.  
  20.  
  21. //using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
  22. using acadCore= Autodesk.AutoCAD.ApplicationServices.Core;
  23.  
  24. namespace WindowsFormsApplication1
  25. {
  26.     public partial class Form1 : Form
  27.     {
  28.         public Form1()
  29.         {
  30.             InitializeComponent();
  31.         }
  32.  
  33.         private void button1_Click(object sender, EventArgs e)
  34.         {
  35.             // Создаем объект приложения
  36.             AcadApplication acadApp = null;
  37.            
  38.             try
  39.             {
  40.                 object obj = Marshal.GetActiveObject("AutoCAD.Application.19");
  41.                 if (obj != null)
  42.                 {                     MessageBox.Show("ok");
  43.  
  44.                     acadCore.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Test Message");
  45.                  }
  46.  
  47.             }
  48.             catch
  49.             {
  50.                 MessageBox.Show("AutoCAD is not open or version is not right.");
  51.             }
  52.             finally
  53.             {
  54.                 if (acadApp != null) Marshal.FinalReleaseComObject(acadApp);
  55.             }
  56.  
  57.         }
  58.  

Ругается на
Код - C# [Выбрать]
  1. Application.Run(new Form1());
  2.  
Выдает ошибку: An unhandled exception of type 'System.IO.FileNotFoundException' occurred in System.Windows.Forms.dll
Additional information: Could not load file or assembly 'accoremgd.dll' or one of its dependencies. The specified module could not be found.
Если убрать строчку:
Код - C# [Выбрать]
  1. acadCore.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Test Message");
  2.  
то, все работает.
Я так понимаю, accoremgd.dll уже занят, и получить к нему доступ не получится? Скопировал этот файл в отдельную папку (что не рекомендуется), результат не изменился.

ps извините что так много букв

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Помогите новичку разобраться
« Ответ #1 : 17-12-2015, 07:11:48 »
1. Есть "Описание Блока" и "Вставка Блока" - это разные вещи
1.1. BlockReference (это "Вставка Блока") наследует Entity
1.2. Public Function Has(key As String) As Boolean - я понимаю, выполняется полное соответсвие
2. "А какой командой ее выгрузить?" - никакой https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/netunload
3. "Можно ли использовать пространства имен Autodesk.AutoCAD.ApplicationServices.Core.Application в WindowsForms приложении?" - нет
« Последнее редактирование: 17-12-2015, 07:49:49 от trir »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите новичку разобраться
« Ответ #2 : 17-12-2015, 10:00:34 »
alex44
Приветствую на форуме!
Пока команда умеет находить блоки, проверять имя, и считать их кол-во:
Похоже пока она и этого не умеет.
Основная моя проблема в том, что у меня не складывается полного представление о том, что содержится в accoremgd.dll, acdbmgd.dll, acdbmgd.dll, где  в них находятся нужные мне параметры и функции, и где какие типы нужно использовать.
Это приходит с опытом с изучением готовых примеров. Кроме того в составе ObjectARX SDK (http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=785550) есть документация, которую следует использовать.

Вот к примеру:
Код - C# [Выбрать]

    string name= "ABCD";
    if (blocktab.Has(name))

Я так понимаю, что вернется true, если имя блока будет включать себя то, что содержится в переменной name. Т.е. если название блока будет "ABCDF" или "ABCD1" то тоже вернется true.
Нет. Только точное соответствие (без учета регистра) - читай документацию.
Код - C# [Выбрать]

    BlockTableRecord mybtr = (BlockTableRecord)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

выдает ошибку.
Так и должно быть - ты путаешь таблицу блоков (BlockTable) с записью таблицы блоков (BlockTableRecord)

Далее. Для загрузки *.dll в autocad используется команду Netload. А какой командой ее выгрузить? Приходится закрывать автокад, для того что бы завершить процесс чтения с *.dll.
Выгрузить из AutoCAD .NET приложение загруженное при помощи _NETLOAD нельзя.
Далее. Можно ли использовать пространства имен Autodesk.AutoCAD.ApplicationServices.Core.Application в WindowsForms приложении?
Нельзя. Нельзя использовать сборки acmgd.dll, accoremgd.dll и acdbmgd.dll (и еще ряд других из состава AutoCAD) не из dll-сборок, загруженных внутрь AutoCAD.
« Последнее редактирование: 08-06-2017, 13:49:01 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Помогите новичку разобраться
« Ответ #3 : 17-12-2015, 10:01:51 »
ps извините что так много букв
Это нормально. Только вот каждый вопрос у нас принято оформлять отдельной темой. Тем более, что они у тебя никак между собой не связаны. Это замечание на будущее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Помогите новичку разобраться
« Ответ #4 : 18-12-2015, 05:44:25 »
Большое спасибо за ответы. Буду разбираться.