Последние сообщения

Последние сообщения

Страницы: 1 ... 4 5 [6] 7 8 ... 10
51
ObjectARX / Почему полилиния не AcDb2dPolyline а AcRxClass?
« Последний ответ от DimVer 27-08-2024, 00:32:29 »
Добрый ночи. Изучаю примеры, которые идут в комплекте с ObjectARX, в частности pliniter_dg.
Добавил в модель полилинию. Загружаю приложение, запускаю команду, а приложение выводит ошибку:
Цитировать
Selected entity is not an AcDb2dPolyline.
Make sure the setvar PLINETYPE is set to 0 before createing a polyline

Попытался вывести в консоль, объектом какого класса является созданная полилиния с помощью:
Цитировать
acutPrintf(_T("Class name is: %s"), pObj->desc()->className());

Выяснилось следующее: Class name is: AcRxClass

Какие свойства полилинии надо поменять или как её правильно создать, чтобы программа пример видела её как полилинию?
52
... Задавал вопрос в уверенности, что задача уже решалась не раз.
Востребованность обычная - ускорить и исключить ошибки по сравнению с ручной работой. Чтобы делать "десять" прямых действий вместо "ста", в т.ч. дополнительных.
Кадры из видео с повторением части объекта в найденном мной под AutoCAD:

На существующем объекте указываются только две точки. Вероятно, по умолчанию выбирается кратчайший путь.
В одном стороннем ПО для повторения участка существующего объекта требуется три точки: начала, примерной середины и конца. Что однозначнее для общего случая.
53
Все то же самое можно получить с небольшими доп. построениями и использованием команды _boundary, так ли востребована эта функция и стоит ли заморачиваться?
54
В неавтокадовском ПО есть возможность создавать линейные объекты, точно повторяющие части существующих объектов указанием точек начала и конца нужных их фрагментов. Там называют это "прилипанием", "трассированием", "отслеживанием" или т.п.
Т.е. чертится полилиния с любого нужного места, доводится до существующего объекта, на нем указываются точки начала и конца его части, которую нужно повторить-продублировать, и полилинию чертят дальше на свободном месте или же аналогично - повторяя части других объектов.
Вымышленный пример с разными типами примитивов, разными случаями их расположения:

Когда-то и несколько раз видел на форумах похожие вопросы, но сейчас ничего не могу найти.
---------
Нашел отечественное приложение под AutoCAD, в котором есть и такая возможность, но целиком приложение не нужно. Главное, показывает, что под AutoCAD задача нормально решаема.
55
Когда я меняю значения Position - у меня ничего не происходит.
Когда я меняю значения AlignmentPoint - атрибут перемещается на новую позицию.

В зависимости от AttachmentPoint может потребоваться указывать Position или AlignmentPoint  либо обе точки одновременно, другое применение может привести к ошибке.
Варианты использования можно посмотреть тут:
https://vbamodel.narod.ru/AutoCAD/idh_alignment.htm

Расскажите пожалуйста какая функция у этих методов? Для чего они? Если можно поподробнее (для новичка).
По описанию функций смотри в API, NET и ARX
https://adn-cis.org/forum/index.php?topic=61.0
arxmgd
arxdoc
Еще можешь посмотреть в ActiveX/COM
https://adn-cis.org/forum/index.php?topic=909.0

Или поискать в интернете
https://vbamodel.narod.ru/AutoCAD/idh_insertionpoint.htm
https://vbamodel.narod.ru/AutoCAD/idh_textalignmentpoint.htm
56
Добрый день. Расскажите пожалуйста какая функция у этих методов? Для чего они? Если можно поподробнее (для новичка).
Код - C# [Выбрать]
  1. acAttDef1.Position = new Point3d(20.0, 0, 0);
  2. acAttDef1.AlignmentPoint = new Point3d(20, 0, 0);
  3. acAttDef1.AdjustAlignment(bt.Database);

В библиотеке я нашел следующее определение, но мне это не помогло.
Position - эта функция возвращает точку вставки текста в координатах WCS.
AlignmentPoint - эта функция возвращает точку выравнивания текста.
AdjustAlignment - этот метод позволяет настроить текст для текстовых объектов, не являющихся резидентами базы данных, или текстовых объектов в транзакциях.

Когда я меняю значения Position - у меня ничего не происходит.
Когда я меняю значения AlignmentPoint - атрибут перемещается на новую позицию.
А AdjustAlignment вообще выдет исключение)))
57
AutoCAD .NET API / Re: Реализовать аналог ssget"_X" на NET
« Последний ответ от Алексей Кулик 15-08-2024, 16:55:44 »
58
AutoCAD .NET API / Re: Реализовать аналог ssget"_X" на NET
« Последний ответ от Привалов Дмитрий 15-08-2024, 16:51:52 »
Но уже при попытке обработки space я получаю ошибку, приводящую к падению ACAD (space == null). Отпуск совсем мне остатки мозгов привел в невменяемое состояние? Что я делаю не так?

Очевидно в LayoutDictionary хранятся Id Layout, а не BlockTableRecord

Код - C# [Выбрать]
  1. var layoutDictionary = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
  2. var layoutEntrys = layoutDictionary.Cast<DictionaryEntry>();
  3. var layoutIds = layoutEntrys.Select(entry => (ObjectId)entry.Value);
  4. var layouts = layoutIds.Select(id => (Layout)tr.GetObject(id, OpenMode.ForRead));
  5. layouts = layouts.Where(l => !l.ModelType); //Отсекаем пространство модели.
  6. foreach (Layout layout in layouts)
  7. {
  8.         string LayoutName = layout.LayoutName;
  9.         ed.WriteMessage($"\nLayoutName:{LayoutName}");
  10.  
  11.         BlockTableRecord layoutBlock = (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForRead);
  12. }
59
AutoCAD .NET API / Re: Реализовать аналог ssget"_X" на NET
« Последний ответ от Алексей Кулик 15-08-2024, 16:45:20 »
было бы интересно посмотреть на c# код в стиле лиспа) наверно F# больше подходит
Не знаю, я на F# не работал )
блоки вложены в блоки в них еще примитивы. таким образом будут выбраны примитивы верхнего уровня решит ли это задачу "выбрать все примитивы".
В поставленных условиях именно так и надо было, без учета вложенных.
Возможно так, если нужны все примитивы в чертеже
Спасибо за пример, буду думать ;)
60
AutoCAD .NET API / Re: Реализовать аналог ssget"_X" на NET
« Последний ответ от Привалов Дмитрий 15-08-2024, 16:40:39 »
выбрать все примитивы
Возможно так, если нужны все примитивы в чертеже
Код - C# [Выбрать]
  1. Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  2. Editor ed = doc.Editor;
  3. Database db = HostApplicationServices.WorkingDatabase;
  4.  
  5. using (DocumentLock dl = doc.LockDocument())
  6. {
  7.         using (Transaction tr = db.TransactionManager.StartTransaction())
  8.         {
  9.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  10.                 var blocks = bt.Cast<ObjectId>().Select(id => (BlockTableRecord)tr.GetObject(id, OpenMode.ForWrite, false));
  11.                 blocks = blocks.Where(b => (!b.IsDependent && !b.IsResolved));
  12.  
  13.                 foreach (BlockTableRecord block in blocks)
  14.                 {
  15.                         IEnumerable<ObjectId> plineIds1 = block.Cast<ObjectId>().Where(id => !id.IsErased && id.ObjectClass.Name == "AcDbPolyline");
  16.                         IEnumerable<Polyline> plines1 = plineIds1.Select(id => (Polyline)tr.GetObject(id, OpenMode.ForWrite, false, true));
  17.                 }
  18.  
  19.                 tr.Commit();
  20.         }
  21. }
Страницы: 1 ... 4 5 [6] 7 8 ... 10