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

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

Страницы: [1] 2 3 ... 10
1
Добрый день. С такими вопросами хорошо справляется deepseek.
Вот пример запроса: "LISP: defun c:MTextSize, выбор MText, вывод ширины (41) и высоты (46) через rtos 2 3, обработка ошибок." (запрос тоже deepseek написал).
Вот пример кода от deepseek:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:MTextSize ( / ent data width height)
  2.   (setq ent (car (entsel "\nВыберите MText: ")))
  3.   (if ent
  4.     (progn
  5.       (setq data (entget ent))
  6.       (setq width (cdr (assoc 41 data)))  ; ширина опорного прямоугольника
  7.       (setq height (cdr (assoc 46 data)))  ; высота фона
  8.      
  9.       (princ (strcat "\n?? Ширина (DXF 41): " (rtos width 2 3)))
  10.       (princ (strcat "\n?? Высота (DXF 46): " (rtos height 2 3)))
  11.     )
  12.     (princ "\n? Объект не выбран или это не MText.")
  13.   )
  14.   (princ)
  15. )
  16. ;Важно! Свойство мтекста столбцы должно быть НЕТ, а не динамический как по умолчанию.
2
Отключить процедурность у солида легко: практически любая команда модификации ломает процедурность. Например, solid.CleanBody();

Штатные методы типа СhamferEdges не ломают, как показал опыт.
А .CleanBody() действительно то, что нужно. Спасибо!

Хотя изначальный вопрос с выбором субобъекта однократным кликом не снят. Т.к. удаленный пользователь, пользующийся сторонним плагином запросто может захотеть применить кастомный модификатор в отношении такого тупикового тела (модифицированного, но не потерявшего статус процедурного). Он просто не сможет выбрать субобъект одним кликом, только с предварительным выбором всего тела.
Но большая часть сопутствующих проблем решается.
3
История солидов - это отдельная песня. В DWT шаблоне чертежа надо прописать сразу SOLIDHIST=0 и забыть обо всех этих проблемах.
4
Затрудняюсь сказать как вам удалось получить такой спецэффект.
Если на только что созданном Box при включенной истории создать фаску, то потом ничего не помогает в части выделения субобъектов. Только отмена фаски, отключение истории и создание фаски повторно. После этого норм.
У вас поведение в интерфейсе отличается от этого?
5
Картинка в вашем сообщении не отображается.
"штатный примитив Box" - Это называется процедурный бокс. Ни у кого никогда (до этого вашего сообщения) не было проблем с выбором граней на процедурных солидах. Затрудняюсь сказать как вам удалось получить такой спецэффект.
Определить, что солид процедурный можно, например, так:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Interop.Common;
  2.  
  3.     /// <summary>
  4.     /// процедурный солид. Это солиды, созданные командами: BOX,CYLINDER,CONE,SPHERE,WEDGE,TORUS
  5.     /// Пока пользователь не выполнял никаких операций, эти объекты остаются процедурными, и AutoCAD позволяет редактировать размеры.
  6.     /// После любой операции они превращаются в обычный BREP-солид.
  7.     /// </summary>
  8.     public static bool
  9.     IsProcedural(this Solid3d solid)
  10.     {
  11. #if !BRICS
  12.       if (solid is null || solid.ObjectId.IsNull)
  13.         return false; // солид без Id (созданный программно) никак не может быть процедурным и вызывает Exception на solid.AcadObject
  14.       try
  15.       {
  16.         Acad3DSolid comSolid = solid?.AcadObject as Acad3DSolid;
  17.         return !IsNullOrEmpty(comSolid?.SolidType);
  18.       }
  19.       catch { }
  20. #endif
  21.       return false;
  22.     }

Отключить процедурность у солида легко: практически любая команда модификации ломает процедурность. Например, solid.CleanBody();
6
Итак, борьба продолжается:).
На картинке два тела, изначально созданные как штатный примитив Box.



Если после наложения каких-либо простых штатных модификаций (например фаска) неважно какими способом, - программно или через интерфейс, объект может по-прежнему идентифицировать себя как Box, то выбрать субобъект интерактивно не удается. Ни через интерфейс (Ctrl+Space) ни программно через .GetSelection() выделить грань или ребро не получается. Под мышкой принудительно подсвечивается исходный Box (как на картинке справа).
Не помогает ни ручное/программное выключение записи/показа истории, ни всевозможные перерисовки экрана после того же создания фаски программно.
При попытке программно выделить грань и вывести тип грани, выводится тип Class из этого перечисления:

public enum SubentityType {
  Null,
  Face,
  Edge,
  Vertex,
  MlineCache,
  Class
}

Который видимо и характеризует исходный объект Box. Но что с ним делать для доступа к субобъектам текущего или хотя бы исходного тела, из справки не понятно.
Если объект перестал себя идентифицировать как Box, например после наложения Shell (как тело слева), то проблема с принудительным подсовыванием исходного Box при попытке выбора субобъекта исчезает.

Правда, если отключить вручную запись истории для тела ДО применения Chamfer, то проблема тоже решается.

Но в части возможностей API вопрос по-прежнему актуален. Есть ли какой-либо способ через API заставить Box/Frustum/Sphere и прочих забыть о том, кем они были при создании и стать нормальным телом?
7
Есть многострочный текст в автокаде, выравнивание "середина по центру". Возможно ли программно установить точные размеры ограничивающей рамки вокруг Мтекста с помощью LISP?
8
Добрый день. может ли кто-либо помочь с программой? выходит ошибка: eFileSharingViolation
9
Да, открываете солид на запись и RecordHistory = false. Вся история сбрасывается. Конечно, это свойство солида есть во всех версиях API.
Да, действительно. Что-то от усиленного перечитывания дерева вдоль и поперек уже начинаются глюки. Пора отдохнуть.
10
Да, открываете солид на запись и RecordHistory = false. Вся история сбрасывается. Конечно, это свойство солида есть во всех версиях API.
Да, C# это промышленный (без почти) уровень. API полностью повторяет ObjectARX за очень малыми исключениями (динамические свойства создавать нельзя, например). Производительность ниже чем у ObjectARX. Возможность несоизмеримы с примитивным API VBA или скриптами LISP.
Да, проблем и глюков воз и маленькая тележка.
Страницы: [1] 2 3 ... 10