Во-первых, я подозреваю, что проблема с вашими текущими попытками заключается в влиянии активных режимов объектной привязки при подаче точек команде LINE
.
Есть несколько способов избежать этого:
1. Используйте модификатор объектной привязки «Нет».
При вводе точек в команду AutoCAD с помощью выражения AutoLISP command
можно избежать влияния любых активных режимов объектной привязки, указав перед точкой модификатор объектной привязки none
или non
.
Это похоже на то, как вы можете поставить перед точкой end
, чтобы принудительно активировать модификатор Endpoint Object Snap, но в этом случае none
или non
означает "игнорировать все режимы Object Snap". Полный список доступных префиксов можно найти здесь.
Вот пример этого метода:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(command "_.line" "_non" p "_non" q "")
Несколько замечаний по вышеизложенному:
Префиксы подчеркивания _
(используемые в "_.line"
и "_non"
) заставляют AutoCAD интерпретировать ввод как ввод нелокализованной команды (т. на неанглийском языке.
Префикс точки/точки .
(используемый в "_.line"
) заставляет AutoCAD всегда использовать исходное определение команды, а не переопределенную версию (которая может существовать, если пользователь использовал файл UNDEFINE
команду).
2. Временно отключить объектную привязку
В то время как вышеприведенный метод признает, что могут быть активные режимы объектной привязки, заставляя такие режимы игнорироваться для каждого ввода точки, если вы выполняете много командных вызовов, включающих множество вводов точек, вы можете найти более простым временное отключение объектной привязки вообще, а затем снова включите ранее активные режимы после завершения вашей программы.
Очевидным способом добиться этого было бы сохранить текущее значение системной переменной OSMODE
, установить для этой системной переменной значение 0
перед выдачей выражения command
, а затем сбросить системную переменную OSMODE
до ее предыдущего значения, например:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
m (getvar 'osmode) ;; Store current OSMODE
)
(setvar 'osmode 0) ;; Set OSMODE to 0 (disables all snaps)
(command "_.line" p q "")
(setvar 'osmode m) ;; Reset OSMODE to stored value
Однако этот метод имеет тот недостаток, что если ошибка возникает в то время, когда OSMODE
установлено на 0
, при отсутствии соответствующего обработчик ошибок, OSMODE
останется равным 0
, и пользователь будет в шоке, когда обнаружит, что потерял свои настройки объектной привязки.
Следовательно, более «изящный» способ временно отключить OSMODE
— использовать бит 16384, который, если он установлен, указывает, что объектная привязка отключена.
Теперь вместо того, чтобы использовать оператор if
для проверки наличия бита 16384
в значении OSMODE
и, если да, вычесть его из значения, мы можем использовать функцию AutoLISP logior
(включая побитовое OR
) для учета обоих сценариев в одно выражение:
(setvar 'osmode (logior 16384 (getvar 'osmode)))
Это вернет результат побитовой операции OR
между битом 16384
и текущим значением системной переменной OSMODE
. Следовательно, если 16384
уже присутствует в значении, оно будет возвращено, иначе оно будет добавлено.
Это может быть реализовано следующим образом:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
m (getvar 'osmode) ;; Store current OSMODE
)
(setvar 'osmode (logior 16384 m)) ;; Turn off Object Snap
(command "_.line" p q "")
(setvar 'osmode m) ;; Reset OSMODE to stored value
Теперь, если код обнаруживает ошибку при отключении объектной привязки, настройки объектной привязки не теряются — пользователю может просто потребоваться снова включить объектную привязку с помощью F3.
3. Полностью избегайте вызовов команд
Конечно, самый надежный способ избежать влияния объектной привязки на ввод командной точки — это полностью избегать команд!
Вместо этого вы можете использовать entmake
или entmakex
для непосредственного добавления данных DXF в базу данных чертежей:
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q)))
Или вы можете следовать маршруту Visual LISP ActiveX и использовать AddLine
метод соответствующего блочного контейнера, например. для создания линии в Modelspace вы можете использовать:
(vl-load-com)
(setq p '(0.0 0.0 0.0)
q '(1.0 1.0 0.0)
)
(vla-addline
(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3D-point p)
(vlax-3D-point q)
)
person
Lee Mac
schedule
29.07.2019