Jump to content

Функции AutoCAD, которых не хватает


Recommended Posts

8 минут назад, kpblc сказал:

Ай, неправильно понимаешь :)

(setq lst (sysvar-save '(("osmode" . 0)("aflags" . 16))))

; ...

(sysvar-restore lst)

Ай, поправь, если я не прав:

 (sysvar-save   сохраняет и устанавливает новые значения, а 

(sysvar-restore только восстанавливает (т.е. устанавливает).

 

Если так, то ЛЮБОЙ из указанных мной вызовов должен дать ошибку в 5.1

Link to comment
Share on other sites

Посмотри код: в sysvar-save проверяется - если устанавливаемая переменная не существует (getvar для несуществующей переменной возвращает nil), то функция и не пытается что-то там куда-то установить. Результирующий список получает только перечень измененных системных переменных с их начальным значением.

Судя по всему, в NC5.1 попытка вызова (getvar "aflags") вернет nil - так что в результат sysvar-save эта переменная просто не попадет.

Переменные установили, сохранили исходное значение - и после этого уже выполняем восстановление, используя результаты выполнения sysvar-save.

По крайней мере логика именно такая у меня была.

P.S. NC5.1 в наличии нет и вряд ли появится.

  • Like 2
Link to comment
Share on other sites

7 минут назад, kpblc сказал:

Судя по всему, в NC5.1 попытка вызова (getvar "aflags") вернет nil

Скорее всего, да.

Но немаленькая вероятность, что считать сможет, а установить - нет.

Т.е., без краш-теста (sysvar-save в 5.1 однозначно сказать нельзя.

 

Link to comment
Share on other sites

Ну я предлагаю автору вопроса скачать мой код, сохранить как lsp, загрузить в NC и тут же в ком.строке:

(setq lst (sysvar-save '(("osmode" . 0)("aflags" . 16)))) 

Привести здесь результаты выполнения (если скриншотом, то лучше всего сделать только ком.строку), а потом

(sysvar-restore lst) 

И сюда результаты. Иначе мы гарантированно ничего не сможем ни сделать, ни придумать ;)

  • Like 1
Link to comment
Share on other sites

Не хотелось вмешиваться в Ваши жаркие баталии (весьма интересные), но для себя нашел выход в функции "разметки" ("Черчение" - "Точка" - "Разметка"). NC v5.1. Понимаю, что не "по Фен-Шую", но за неимением времени подойдет!

Link to comment
Share on other sites

20 минут назад, Иван_ сказал:

Не хотелось вмешиваться в Ваши жаркие баталии

Вмешательства, собственно, и не требовалось. Это были вялые комменты в ожидании подробностей о результатах предлагаемых решений, т.к. самостоятельно проверить не можем (версия 5.1 нам недоступна).

Не дождались ... 

Link to comment
Share on other sites

Спойлер

М-да, и надо же было забыть про стандартные команды _measure и _divide! Позор!

 

Link to comment
Share on other sites

7 минут назад, Иван_ сказал:

я не совсем понял о "...скачать мой код".

 

Код из поста  

Его нужно сохранить в файл *.lsp., загрузить этот файл и выполнить команды из

 

  • Like 1
Link to comment
Share on other sites

Спасибо!

Я в программировании полный профан, но не пойму как вызвать вышеуказанный lisp.

Код скопировал - вставил в блокнот (файл pikettest.txt) - через UnrealCommander переименовал в pikettest.lsp - загрузил в NC 5.1...

добавлено через 4 минут

Такое выдает 

pikettest1.jpg

Link to comment
Share on other sites

21 час назад, kpblc сказал:

(getvar для несуществующей переменной возвращает nil), 

К сожалению, оказалось несколько напряжнее. Кроме nil еще и тревожное сообщение.

 

17 минут назад, Иван_ сказал:

pikettest2.jpg

Спасибо.

Предлагаю опробовать минимально модифицированный код

Спойлер

image.png.28ff9fc7ac5cdabccf2c92983659ef7b.png

 

 

c_piket.lsp

Link to comment
Share on other sites

13 минут назад, EdwardSt сказал:

К сожалению, оказалось несколько напряжнее. Кроме nil еще и тревожное сообщение.

Ну а с чего бы ему не быть-то :) Пробуй такой код

 

test2.lsp

Link to comment
Share on other sites

8 минут назад, Иван_ сказал:

Выдает это.

Вызывал командой PIKET.

По-видимому, кроме отсутствующей переменной еще и синтаксис команды "_block" в 5.1 отличается.

Попробуй из прилагаемого файла блок скопировать в свой чертеж и сразу удалить его.

А после этого запустить команду piket.

Если заработает, тот проблема остается на этапе создания нового описания блока.

Криво, неудобно, но решаемо...

Блок-пикет.dwg

добавлено через 1 минуту
10 минут назад, kpblc сказал:

Ну а с чего бы ему не быть-то :) Пробуй такой код

Это не ко мне. У меня 5.1 не установлен

Link to comment
Share on other sites

Спойлер
(defun fun_save-layer-status (doc / res)
                               ;|
  *    Сохранение статуса слоев.
  *    Параметры вызова:
    doc  ; активный документ, в котором надо работать
  |;
    (vlax-for item (vla-get-layers doc)
      (setq res (cons (cons item
                            (mapcar
                              (function
                                (lambda (prop / temp)
                                  (setq temp (vlax-get-property item prop))
                                  (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (vlax-put-property item prop :vlax-false)
                                      ) ;_ end of lambda
                                    ) ;_ end of function
                                  ) ;_ end of vl-catch-all-apply
                                  (cons prop temp)
                                ) ;_ end of lambda
                              ) ;_ end of function
                              '("freeze" "lock")
                            ) ;_ end of mapcar
                      ) ;_ end of cons
                      res
                ) ;_ end of cons
      ) ;_ end of setq
    ) ;_ end of vlax-for
    res
  ) ;_ end of defun

  (defun fun_restore-layer-status (layers)
                                  ;|
  *    Восстановление статуса слоев
  *    Параметры вызова:
    layers  ; список типа '((<vla-указатель на слой> ("freeze" . <Заморожен слой>) ("lock" . <Слой заблокирован>) ...)
  |;
    (foreach item layers
      (foreach prop (cdr item)
        (vl-catch-all-apply
          (function
            (lambda ()
              (vlax-put-property item (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
  ) ;_ end of defun

  (defun fun_make-block-picket (doc name / blk_def layers height att_def)
                               ;|
  *    Создание блока для расстановки
  *    Параметры вызова:
    doc    ; указатель на документ, в котором создается блок
    name   ; имя создаваемого блока
  |;
    (if (/= (type (setq blk_def (vl-catch-all-apply
                                  (function
                                    (lambda ()
                                      (vla-item (vla-get-blocks doc) name)
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of type
            'vla-object
        ) ;_ end of /=
      (progn
        (setq layers  (fun_save-layer-status doc)
              height  1.25
        ) ;_ end of setq
        (setq blk_def (vla-add (vla-get-blocks doc) (vlax-3d-point '(0. 0. 0.)) name))
        (vla-addline
          blk_def
          (vlax-3d-point (list 0. (* height -0.5)))
          (vlax-3d-point (list 0. (* height 0.5)))
        ) ;_ end of vla-addline
        (setq att_def (vla-addattribute
                        blk_def
                        height
                        acattributemodeverify
                        "Пикет"
                        (vlax-3d-point '(0.5 0.5 0.))
                        "picket"
                        ""
                      ) ;_ end of vla-addattribute
        ) ;_ end of setq
        (vla-put-stylename att_def "Standard")
        (vlax-for ent blk_def
          (vla-put-layer ent "0")
          (vla-put-lineweight ent aclnwtbyblock)
          (vla-put-color ent 0)
          (vla-put-linetype ent "ByBlock")
        ) ;_ end of vlax-for
        (fun_restore-layer-status layers)
      ) ;_ end of progn
    ) ;_ end of if
    blk_def
  ) ;_ end of defun

Код не проверял, если что.

 

  • Like 1
Link to comment
Share on other sites

pikettest5.jpg

добавлено через 2 минуты

теперь блок picket предлагает (в окне редактора блоков), но после установки его (блока) в начальную точку процесс не идет. 

Link to comment
Share on other sites

В общем, нужно полностью уходить от использования (command  ...

Тогда есть шанс, что взлетит в 5.1.

Если руки дойдут до переделки, то пригодятся и наводки от @kpblc

Отлаживать в режиме сообщений на форуме слишком напряжно.

Link to comment
Share on other sites

kpblc.

Ещё раз объясните тугодуму. Скопировал код в блокнот - переименовал в .lsp - загрузил приложение... 

А какой командой его вызвать?

PIKET вызывает старую версию.

добавлено через 1 минуту

EdwardSt

в любом случае - спасибо за участие!

Link to comment
Share on other sites

Мой код предназначался @EdwardSt, каюсь. Там, грубо говоря, служебные функции, которые можно использовать в написании кода.

Link to comment
Share on other sites

1 час назад, kpblc сказал:
  Некомандный метод создания блока (Показать контент)

 

(defun fun_save-layer-status (doc / res)
                               ;|
  *    Сохранение статуса слоев.
  *    Параметры вызова:
    doc  ; активный документ, в котором надо работать
  |;
    (vlax-for item (vla-get-layers doc)
      (setq res (cons (cons item
                            (mapcar
                              (function
                                (lambda (prop / temp)
                                  (setq temp (vlax-get-property item prop))
                                  (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (vlax-put-property item prop :vlax-false)
                                      ) ;_ end of lambda
                                    ) ;_ end of function
                                  ) ;_ end of vl-catch-all-apply
                                  (cons prop temp)
                                ) ;_ end of lambda
                              ) ;_ end of function
                              '("freeze" "lock")
                            ) ;_ end of mapcar
                      ) ;_ end of cons
                      res
                ) ;_ end of cons
      ) ;_ end of setq
    ) ;_ end of vlax-for
    res
  ) ;_ end of defun

  (defun fun_restore-layer-status (layers)
                                  ;|
  *    Восстановление статуса слоев
  *    Параметры вызова:
    layers  ; список типа '((<vla-указатель на слой> ("freeze" . <Заморожен слой>) ("lock" . <Слой заблокирован>) ...)
  |;
    (foreach item layers
      (foreach prop (cdr item)
        (vl-catch-all-apply
          (function
            (lambda ()
              (vlax-put-property item (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
  ) ;_ end of defun

  (defun fun_make-block-picket (doc name / blk_def layers height att_def)
                               ;|
  *    Создание блока для расстановки
  *    Параметры вызова:
    doc    ; указатель на документ, в котором создается блок
    name   ; имя создаваемого блока
  |;
    (if (/= (type (setq blk_def (vl-catch-all-apply
                                  (function
                                    (lambda ()
                                      (vla-item (vla-get-blocks doc) name)
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of type
            'vla-object
        ) ;_ end of /=
      (progn
        (setq layers  (fun_save-layer-status doc)
              height  1.25
        ) ;_ end of setq
        (setq blk_def (vla-add (vla-get-blocks doc) (vlax-3d-point '(0. 0. 0.)) name))
        (vla-addline
          blk_def
          (vlax-3d-point (list 0. (* height -0.5)))
          (vlax-3d-point (list 0. (* height 0.5)))
        ) ;_ end of vla-addline
        (setq att_def (vla-addattribute
                        blk_def
                        height
                        acattributemodeverify
                        "Пикет"
                        (vlax-3d-point '(0.5 0.5 0.))
                        "picket"
                        ""
                      ) ;_ end of vla-addattribute
        ) ;_ end of setq
        (vla-put-stylename att_def "Standard")
        (vlax-for ent blk_def
          (vla-put-layer ent "0")
          (vla-put-lineweight ent aclnwtbyblock)
          (vla-put-color ent 0)
          (vla-put-linetype ent "ByBlock")
        ) ;_ end of vlax-for
        (fun_restore-layer-status layers)
      ) ;_ end of progn
    ) ;_ end of if
    blk_def
  ) ;_ end of defun

Код не проверял, если что.

 

 

Можно значительно короче и без COM (проверка наличия существующего описания вынесена за пределы функции)

(defun b_piket ( / el h)
  (setq h 1.25)
  (setq el '((0 . "BLOCK") (2 . "piket") (70 . 2) (10 0.0 0.0 0.0))) 
  (entmakex el)
  (setq el (list '(0 . "LINE") '(8 . "0") '(6 . "ByBlock") '(62 . 0) (list 10 0.0 (* h -0.5) 0.0) (list 11 0.0 (* h 0.5) 0.0)))
  (entmakex el)
  (setq el (list '(0 . "ATTDEF") '(8 . "0") '(62 . 0) (cons 40 h) '(1 . "") '(7 . "Standard") (list 10 0.0 0.0 0.0) '(3 . "Пикет") '(2 . "PICKET") '(70 . 8) '(280 . 0)))
  (entmakex el)  
  (setq el '((0 . "ENDBLK")))
  (entmakex el)
  )

 

Не столь академически тяжеловесно, но очень наглядно. ИМХО

Edited by EdwardSt
Link to comment
Share on other sites

Можно, не спорю. Я просто DXF и entmake[x] методы не очень жалую. Тяжелое детство, мина в кроватке, VBA в полный рост...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт Разработка? Tell a friend!
×
×
  • Create New...