Мой код работает, хотя только на моей машине - PullRequest
1 голос
/ 14 октября 2019

Я создаю несколько команд AutoLisp для своей команды, и теперь, когда я закончил, код распадается на их компьютере, и я не могу понять, почему. У меня отлично работает.

Идея кода в том, чтобы растянуть ломаную линию и обновить сгруппированные атрибуты блока. Код просит выбрать блок, фактическую ширину ломаной линии и долю, которая должна быть взята (например, 0,75, чтобы уменьшить до 75%). Затем, и вот, где начинается проблема, выберите стороны для растяжения. На своих компьютерах он не позволяет выбирать, он просто прыгает вперед.

(defun c:MRV (/ a b c d e)
;ungroup
(command "pickstyle" 0)
;variables
(setq blk (entsel "\nSelect block to modify: "))
(initget (+ 1 2 4))
(setq a (getreal "\nWidth?"))
(initget (+ 1 2 4))
(setq b (getreal "\nNew module fraction? (>0;1<)"))


    ;distance to reduce
    (setq c (- 1 b))
    (setq d (* a c -0.5))
    (setq e (* -1 d))

    ;stretch
    (command "stretch" pause pause "" "0,0" (polar '(0 0) (/ pi 2) d))

    (command "stretch" pause pause "" "0,0" (polar '(0 0) (/ pi 2) e))

    ;open layer
    (setq LayerTable (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(if (and (tblsearch "LAYER" "MC_BLOCO_INFO_AREAS")
         (setq layname (vla-item layertable "MC_BLOCO_INFO_AREAS"))
         (= (vlax-get-property layname 'lock) :vlax-true)
         )
  (vla-put-lock layname :vlax-false))
    ;change attribute
    (setq l (cons "CAMPO_6" (rtos b 2 2)))
    (LM:SetAttributeValues (car blk) (list l))



    ;close layer
    (setq LayerTable (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(if (and (tblsearch "LAYER" "MC_BLOCO_INFO_AREAS")
         (setq layname (vla-item layertable "MC_BLOCO_INFO_AREAS"))
         (= (vlax-get-property layname 'lock) :vlax-false)
         )
  (vla-put-lock layname :vlax-true))


    ;update block width
    (command "regenall")
    ;regroup
    (command "pickstyle" 1)
    (print "Modulo modificado.")
    (princ)
    )
(defun LM:SetAttributeValues ( blk lst / enx itm )
    (if (= "ATTRIB" (cdr (assoc 0 (setq enx (entget (setq blk (entnext blk)))))))
        (if (setq itm (assoc (strcase (cdr (assoc 2 enx))) lst))
            (progn
                (if (entmod (subst (cons 1 (cdr itm)) (assoc 1 enx) enx))
                    (entupd blk)
                )
                (LM:SetAttributeValues blk lst)
            )
            (LM:SetAttributeValues blk lst)
        )
    )
)

Что должно происходить:

what should be happening

1 Ответ

0 голосов
/ 16 октября 2019

Когда команда AutoCAD STRETCH выдает подсказку для выбора объектов, выбранных с использованием окна пересечения (пересекающего сегменты, которые должны быть растянуты), подсказка является стандартной подсказкой выбора, и впоследствии команда STRETCH получитинформация о том, как выбор был получен таким же образом, как вы могли бы использовать функцию AutoLISP ssnamex.

В связи с этим, я бы предложил предоставить команде STRETCH набор выбора, который уже был получен с использованиемметод выбора окна пересечения.

Например, вы можете определить такую ​​функцию, как:

(defun mystretch ( dis / pt1 pt2 sel )
    (while
        (and
            (setq pt1 (getpoint "\nSpecify first point of crossing window: "))
            (setq pt2 (getcorner pt1 "\nSpecify opposite point of crossing window: "))
            (not (setq sel (ssget "_C" pt1 pt2)))
        )
        (princ "\nNo objects were found within the crossing window.")
    )
    (if sel
        (progn
            (command "_.stretch" sel "" "_non" '(0 0) "_non" (list 0 dis))
            t
        )
    )
)

Затем вы можете оценить вышеуказанную функцию с расстоянием, на которое вы хотите растянуть объекты. направление Y, например:

(mystretch 10.0)

Или, используя переменные в вашем коде:

(mystretch d)
(mystretch e)

Затем функция вернет t (True), если пользователь предоставилдве действительные точки и введена команда STRETCH - вы можете проверить это в своей программе, прежде чем продолжить.

Используя этот подход, вы можете убедиться, что пользователь предоставил две точки, определяющие окно пересечения, которое пересекает один или несколько объектов до , для выдачи команды AutoCAD STRETCH.

Использованиестрока ssget режима пересечения (C) также гарантирует, что вы всегда вводите команду STRETCH, полученную с использованием метода выбора пересечения.

Вы также можете обратиться к этот ответ относительно использования модификатора привязки объекта _non, а также префикса команды _. в приведенном выше примере кода.

...