Получение измерений на растяжение - PullRequest
0 голосов
/ 04 мая 2020

Я создаю алгоритм, который поможет мне расширить поля до правильного размера, например:

inteded result

Я создал код, который запрашивает две точки это должно быть новая глубина и измеряет их. Затем вычитает исходную глубину блока (0.51), а затем просит сторону растянуть.

(defun mystretchh ( dis / pt1 pt2 sel )
    (while
        (and
            (setq pt1 (getpoint "\nFirst point of selection window: "))
            (setq pt2 (getcorner pt1 "\nSecond point of selection window: "))
            (not (setq sel (ssget "_C" pt1 pt2)))
        )
        (princ "\nNo objects where found in the selection window.")
    )
    (if sel
        (progn
            (command "_.stretch" sel "" "_non" '(0 0) "_non" (list dis 0))
            t
        )
    )
)
(defun c:test (/ a x c p)
;ungroup
(command "pickstyle" 0)
;variables
(initget (+ 1 2 4))
(setq p (getpoint "\nSelect first point: "))
(setq c (getpoint "\nSelect second point: "))
(command "_.dist" p c)
(setq x (rtos (getvar 'distance) 2 3))


    ;calculate distance to stretch
    (setq a (- x 0.51))


    ;stretch
    (mystretchh a)

    ;regroup
    (command "pickstyle" 1)
    (print "Module modified.")
    (princ)
)

У меня две проблемы:

  1. Растяжение работает в обратном направлении, я пытался использовать отрицательные значения безрезультатно.
  2. Сообщается о синтаксической ошибке, но я не могу ее найти.

Я не касался AutoLISP в течение полугода - возможно, некоторые из вас могут найти проблемы в мгновение ока.

1 Ответ

1 голос
/ 04 мая 2020

Вы можете рассчитать расстояние между двумя точками, используя стандартную функцию distance, вместо вызова команды DIST и последующего извлечения значения DISTANCE системная переменная.

Следовательно, это:

(command "_.dist" p c)
(setq x (rtos (getvar 'distance) 2 3))

Может стать:

(setq x (rtos (distance p c) 2 3))

Однако вы получаете синтаксическую ошибку, потому что у вас есть преобразовал расстояние в строку, используя rtos, и затем вы пытаетесь выполнить арифметику c для строки здесь:

(setq a (- x 0.51))

Нет необходимости преобразовывать расстояние в строку, и поэтому эти выражения могут стать:

(setq a (- (distance p c) 0.51))

Вы также можете проверить, является ли (distance p c) больше 0.51 перед выполнением этого вычитания, чтобы избежать неожиданных результатов.

Чтобы определить правильное направление, поскольку ваш текущий код может растягиваться только вдоль оси x, вам нужно проверить, больше ли координата x точки p, чем координата точки c.

...