рисование линии рядом с ломаной

У меня есть треугольник в виде полилинии, и я хочу нарисовать высоту. Я даю команду "line" или "_line" на правильные точки, но AutoCAD рисует линию от вершины к соседней вершине.

Это не только в AutoLISP, AutoCAD не позволяет мне рисовать линию от вершины до середины ребра полилинии.

Как я могу это сделать?

Я думал добавить вершину в полилинию, но это не очень помогло. Пробовал добавить коннектор: круг или другой объект достаточно близко к линии и подключить к нему высоту, но и это не помогло.

Какие-либо предложения?


person Baraa Natour    schedule 29.07.2019    source источник
comment
Может быть, я мог бы помочь. Но я совершенно не понимаю, чего вы ожидаете. Вам нужно нарисовать линию с помощью команды AutoCAD? или Вы хотите что-то закодировать на LISP? Не могли бы вы показать образец изображения, на котором мы могли бы увидеть, что вы хотите? Что вы имеете в виду под высотой? Насколько я помню из начальной школы: это линия, соединяющая вершину с его проекцией на противоположное ребро, которое только для равнобедренного треугольника является серединой ребра, это Ваш случай? Использование командной строки Вы можете просто использовать 'osnap'. что не так с таким решением?   -  person CAD Developer    schedule 29.07.2019
comment
В геометрии высота треугольника — это отрезок прямой, проходящий через вершину и перпендикулярный (то есть образующий прямой угол с) линией, содержащей основание (сторону, противоположную вершине). мне не нужно писать функцию/команду в auto lisp, чтобы нарисовать линию   -  person Baraa Natour    schedule 29.07.2019
comment
я использовал оснап. спасибо что очень помогли   -  person Baraa Natour    schedule 29.07.2019


Ответы (1)


Во-первых, я подозреваю, что проблема с вашими текущими попытками заключается в влиянии активных режимов объектной привязки при подаче точек команде 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