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

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

Страницы: [1] 2 3 ... 10
1
Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.

Да, Вы правы. Это наконец решило проблему:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:MTextSize ( / ent data width height coltype)
  2.   (setq ent (car (entsel "\nВыберите MText: ")))
  3.   (if ent
  4.     (progn
  5.       (setq data (entget ent))
  6.      
  7.       ;; --- Проверяем и отключаем динамические столбцы ---
  8.       ;; DXF 75 - тип столбцов:
  9.       ;; 0 = без столбцов (один столбец)
  10.       ;; 1 = динамические столбцы
  11.       ;; 2 = статические столбцы
  12.       (if (assoc 75 data)
  13.         (progn
  14.           (setq coltype (cdr (assoc 75 data)))
  15.           (princ (strcat "\n?? Текущий режим столбцов: " (itoa coltype)))
  16.           (if (/= coltype 0)
  17.             (progn
  18.               (setq data (subst (cons 75 0) (assoc 75 data) data))
  19.               (princ "\n?? Переключено в режим 'Один столбец'")
  20.             )
  21.           )
  22.         )
  23.         (progn
  24.           ;; Если DXF 75 нет, добавляем его (значение 0 = один столбец)
  25.           (setq data (append data (list (cons 75 0))))
  26.           (princ "\n?? Добавлен режим 'Один столбец'")
  27.         )
  28.       )
  29.      
  30.       ;; --- Теперь устанавливаем размеры ---
  31.       (setq width (cdr (assoc 41 data)))
  32.       (setq height (cdr (assoc 46 data)))
  33.      
  34.       (princ (strcat "\n?? Текущая ширина: " (rtos width 2 3)))
  35.       (princ (strcat "\n?? Текущая высота: " (rtos height 2 3)))
  36.      
  37.       ;; Устанавливаем 500 x 500
  38.       (setq data (subst (cons 41 500.0) (assoc 41 data) data))
  39.       (setq data (subst (cons 46 500.0) (assoc 46 data) data))
  40.      
  41.       ;; --- Применяем изменения ---
  42.       (entmod data)
  43.       (entupd ent)
  44.      
  45.       (princ "\n?? Готово! MText: режим 'Один столбец', размер 500 x 500")
  46.     )
  47.     (princ "\n? Объект не выбран или это не MText.")
  48.   )
  49.   (princ)
  50. )
2
Добрый день. Ваш код работает с МТекстом у которого свойство столбцы установлено в нет, вместо динамический.
3
Добрый день. С такими вопросами хорошо справляется deepseek.
Вот пример запроса: "LISP: defun c:MTextSize, выбор MText, вывод ширины (41) и высоты (46) через rtos 2 3, обработка ошибок." (запрос тоже deepseek написал).
Вот пример кода от deepseek:

Спасибо за ответ. Но как раз с этой задачей Deepseek у меня и затупил  :)  Ни одно из предлагаемых им решений не работает правильно.

Ваш код считывает размеры рамки, моя задача в обратном, установить размеры точно. Допустим, хочу сделать рамку 500х500:

Код - 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.      
  7.       ;; --- Чтение текущих значений (для информации) ---
  8.       (setq width (cdr (assoc 41 data)))   ; ширина опорного прямоугольника
  9.       (setq height (cdr (assoc 46 data)))  ; высота фона
  10.      
  11.       (princ (strcat "\n?? Текущая ширина (DXF 41): " (rtos width 2 3)))
  12.       (princ (strcat "\n?? Текущая высота (DXF 46): " (rtos height 2 3)))
  13.      
  14.       ;; --- Установка новых значений 500 x 500 ---
  15.       (setq data (subst (cons 41 500.0) (assoc 41 data) data)) ; меняем ширину на 50
  16.       (setq data (subst (cons 46 500.0) (assoc 46 data) data)) ; меняем высоту на 50
  17.      
  18.       ;; --- Применяем изменения к объекту ---
  19.       (entmod data)
  20.       (entupd ent) ; обновляем экран
  21.      
  22.       (princ "\n?? Рамка MText установлена на 500 x 500.")
  23.     )
  24.     (princ "\n? Объект не выбран или это не MText.")
  25.   )
  26.   (princ)
  27. )
  28.  

Пишет:

Цитировать
?? Текущая ширина (DXF 41): 3.652
?? Текущая высота (DXF 46): 50.000
?? Рамка MText установлена на 500 x 500.

Хотя по факту рамка редактирования вокруг текста как была, так и осталась небольшой, при этом выравнивание "Середина по центру". Deepseek снова убеждает меня, что программно это сделать невозможно.
4
Добрый день. С такими вопросами хорошо справляется 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. ;Важно! Свойство мтекста столбцы должно быть НЕТ, а не динамический как по умолчанию.
5
Отключить процедурность у солида легко: практически любая команда модификации ломает процедурность. Например, solid.CleanBody();

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

Хотя изначальный вопрос с выбором субобъекта однократным кликом не снят. Т.к. удаленный пользователь, пользующийся сторонним плагином запросто может захотеть применить кастомный модификатор в отношении такого тупикового тела (модифицированного, но не потерявшего статус процедурного). Он просто не сможет выбрать субобъект одним кликом, только с предварительным выбором всего тела.
Но большая часть сопутствующих проблем решается.
6
История солидов - это отдельная песня. В DWT шаблоне чертежа надо прописать сразу SOLIDHIST=0 и забыть обо всех этих проблемах.
7
Затрудняюсь сказать как вам удалось получить такой спецэффект.
Если на только что созданном Box при включенной истории создать фаску, то потом ничего не помогает в части выделения субобъектов. Только отмена фаски, отключение истории и создание фаски повторно. После этого норм.
У вас поведение в интерфейсе отличается от этого?
8
Картинка в вашем сообщении не отображается.
"штатный примитив 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();
9
Итак, борьба продолжается:).
На картинке два тела, изначально созданные как штатный примитив 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 и прочих забыть о том, кем они были при создании и стать нормальным телом?
10
Есть многострочный текст в автокаде, выравнивание "середина по центру". Возможно ли программно установить точные размеры ограничивающей рамки вокруг Мтекста с помощью LISP?
Страницы: [1] 2 3 ... 10