Перейти к содержанию
aerohost

Lisp с нумерацией вершин полилинии

Рекомендуемые сообщения

Добрый день! прошу помощи, прошу подсказать как реализовать Лисп( скрипт) или что то прочее, что бы был следующий функционал. 

 

Берешь блок, в нем есть атрибут с нумерации, кликаешь по полилинии и этот блок расставляется в вершинах с автоматической нумерацией 1,2,3 и.тд

 

Так же указывать с какого номера начинать другую нумерацию полилинии 

 

dfcf965ca3f01178ba00433e52ab7161.png
 

Изменено пользователем aerohost

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел похожий лисп,но как его переназначить нe на дистанцию ,а на вершину ?

 

Изменено пользователем aerohost
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 часов назад, aerohost сказал:

как его переназначить нe на дистанцию ,а на вершину


Этот LISP надо проверять. 

А координаты вершин можно попробовать вытащить чем то вроде вот этого

(vl-load-com); if needed

(defun C:CoordList (/ plent plobj coords num pt)
  (setq
    plent (car (entsel "\nSelect Polyline: "))
    plobj (vlax-ename->vla-object plent)
    coords (vlax-get plobj 'Coordinates); un-differentiated list of X Y [& Z if applicable] coordinate values
  ); setq
  (setq num (if (= (cdr (assoc 0 (entget plent))) "LWPOLYLINE") 2 3))

    ; LW Polylines have only X & Y; "heavy" 2D & 3D have X Y & Z
  (repeat (/ (length coords) num)
    (repeat num ; number of coordinates to separate into a point list
      (setq
        pt (append pt (list (car coords)))
        coords (cdr coords)
      )
    ); repeat
    (setq
      ptlist (cons pt ptlist); put that point into list of points
      pt nil ; reset for next point
    ); setq
  ); repeat
  (setq ptlist (reverse ptlist)); list of coordinates divided up into point lists
); defun

P.S. Мне одному кажется странным, что на форуме nanoCAD при вставке кода отсутствует подсветка синтаксиса LISP ?

Изменено пользователем A.Kudrjashov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
17 минут назад, A.Kudrjashov сказал:


Этот LISP надо проверять. 

А координаты вершин можно попробовать вытащить чем то вроде вот этого

(vl-load-com); if needed (defun C:CoordList (/ plent plobj coords num pt) (setq plent (car (entsel "\nSelect Polyline: ")) plobj (vlax-ename->vla-object plent) coords (vlax-get plobj 'Coordinates); un-differentiated list of X Y [& Z if applicable] coordinate values ); setq (setq num (if (= (cdr (assoc 0 (entget plent))) "LWPOLYLINE") 2 3)) ; LW Polylines have only X & Y; "heavy" 2D & 3D have X Y & Z (repeat (/ (length coords) num) (repeat num ; number of coordinates to separate into a point list (setq pt (append pt (list (car coords))) coords (cdr coords) ) ); repeat (setq ptlist (cons pt ptlist); put that point into list of points pt nil ; reset for next point ); setq ); repeat (setq ptlist (reverse ptlist)); list of coordinates divided up into point lists ); defun


(vl-load-com); if needed

(defun C:CoordList (/ plent plobj coords num pt)
  (setq
    plent (car (entsel "\nSelect Polyline: "))
    plobj (vlax-ename->vla-object plent)
    coords (vlax-get plobj 'Coordinates); un-differentiated list of X Y [& Z if applicable] coordinate values
  ); setq
  (setq num (if (= (cdr (assoc 0 (entget plent))) "LWPOLYLINE") 2 3))

    ; LW Polylines have only X & Y; "heavy" 2D & 3D have X Y & Z
  (repeat (/ (length coords) num)
    (repeat num ; number of coordinates to separate into a point list
      (setq
        pt (append pt (list (car coords)))
        coords (cdr coords)
      )
    ); repeat
    (setq
      ptlist (cons pt ptlist); put that point into list of points
      pt nil ; reset for next point
    ); setq
  ); repeat
  (setq ptlist (reverse ptlist)); list of coordinates divided up into point lists
); defun

P.S. Мне одному кажется странным, что на форуме nanoCAD при вставке кода отсутствует подсветка синтаксиса LISP ?

Подскажи как это в тот лисп засунуть ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
(vl-load-com) 

(defun c:MD ( / snp cmdh name_of_bl pln krd num j my_blok my_att spis_att
 att_old att_new spis_att strt stp)
(command "_.undo" "_begin")
(setq snp (getvar "Osmode"))
(setq cmdh (getvar "CMDECHO"))
(setvar "Osmode" 0) 
(setvar "CMDECHO" 0)
(setq name_of_bl (getstring "\nБлок  <Блок_Нумерации>"))
(setq pln (car (entsel)))
(setvar "attreq" 0)
(setq krd (vlax-curve-getPointAtParam pln 0))
(command "_.insert" name_of_bl krd 1.0 1.0 0)
(setq num (fix(-(vlax-curve-getEndParam pln) 1)))
(progn
(setq j 0)
(repeat num
   (setq j (1+ j))
   (setq krd (vlax-curve-getPointAtParam pln j))
   (command "_.insert" name_of_bl krd 1.0 1.0 0)
   (setq my_blok (entlast))
   (setq my_att (entnext my_blok))
   (setq spis_att (entget my_att)) ;spisok
   (setq att_old (assoc 1 spis_att)) ;name
   (setq num_new (itoa j))
   (setq num_new (strcat pref num_new suff)))
   (setq att_new (cons 1 num_new)) ;
   (setq spis_att (subst att_new att_old spis_att))
   (entmod spis_att)
   (entupd (cdr (assoc -1 spis_att)))
 ) ;progn
(setvar "Osmode"  snp) 
(setvar "CMDECHO" cmdh)
)
    
   
   
   

Помогите найти ошибку, почему автоматически не нумеруется 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 часа назад, aerohost сказал:

Помогите найти ошибку, почему автоматически не нумеруется 


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

А вообще это все не совсем то. Данный набор функций, насколько я понимаю, ориентирован на параметризованные кривые - сплайны, а не на полилинии, как в вашем случае.

Я так понимаю, что вот здесь предполагалось получить количество вершин ? Но данная функция возвращает нечто совершенно иное.

Спойлер

image.thumb.png.909f07ba71fd974736425a7d0611890c.png


https://books.google.ru/books?id=nByAZkS-H6AC&pg=PA352&lpg=PA352&dq=vlax-curve-getEndParam&source=bl&ots=GqA5G4KNcK&sig=ACfU3U1UM8G_kq89BCggbBcNVlasFwCGDA&hl=ru&sa=X&ved=2ahUKEwj3hr-ihpjoAhUEp4sKHWRzADAQ6AEwBHoECAoQAQ#v=onepage&q=vlax-curve-getEndParam&f=false

Там ИМХО надо по другому. Пока нет времени смотреть подробно.
На следующей неделе посмотрю.

Upd.
Скачал. Там блок - это единичка посередине "*U13" ?
Только, для информации, это динамический блок, а nanoCAD динамические блоки не понимает с точки зрения редактирования.
 

Спойлер

image.png.34638fc7d73a4358eac3a813e65c6177.png

 

Изменено пользователем A.Kudrjashov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
(vl-load-com) 

(defun c:MD ( / snp cmdh name_of_bl pln krd num j my_blok my_att spis_att
 att_old att_new spis_att strt stp)
(command "_.undo" "_begin")
(setq snp (getvar "Osmode"))
(setq cmdh (getvar "CMDECHO"))
(setvar "Osmode" 0) 
(setvar "CMDECHO" 0)
(setq name_of_bl (getstring "\nБлок  <Блок_Нумерации >"))
(setq pln (car (entsel)))
(setvar "attreq" 0)
(setq krd (vlax-curve-getPointAtParam pln 0))
(command "_.insert" name_of_bl krd 1.0 1.0 0)
(progn
(setq num (fix(-(vlax-curve-getEndParam pln) 1)))
(setq j 0)
(repeat num
   (setq j (1+ j))
   (setq krd (vlax-curve-getPointAtParam pln j))
   (command "_.-insert" name_of_bl krd 1.0 1.0 0)
   (setq my_blok (entlast))
   (setq my_att (entnext my_blok))
   (setq spis_att (entget my_att))
   (setq att_old (assoc 1 spis_att)) 
   (setq num_new (itoa j))
   (setq num_new (strcat num_new )))
   (setq att_new (cons 1 num_new)) ;
   (setq spis_att (subst att_new att_old spis_att))
   (entmod spis_att)
   (entupd (cdr (assoc -1 spis_att)))
 ) ;progn
(setq krd (vlax-curve-getPointAtParam pln (+ 1 num)))
(command "_.-insert" name_of_bl krd 1.0 1.0 0)
(setvar "Osmode"  snp) 
(setvar "CMDECHO" cmdh)
)
    
   
   
   

Без имени0.dwg

 

нумеруется только последняя точка и то , почему то на одну единицу отличается. Я так понял у меня не получается автонумирацию в цикл засунуть.Блоки у меня ставятся по всем вершинам, но число ставится именно только в последний блок 

 

ed35005e2d17d9d735c4f6c755607ccd.png
 

Изменено пользователем aerohost

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
54 минуты назад, A.Kudrjashov сказал:

Скачал. Там блок - это единичка посередине "*U13" ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 часов назад, aerohost сказал:

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


Я бы посоветовал для отладки включить ECHO в командную строку. Хоть какая то информация о выполнении.
(С отладкой в nanoCAD все плохо)

И еще текст надо структурировать. Тяжело читать.

А вообще, как то вот так:

Спойлер

image.thumb.png.0bb620b3781af7e071befee2deb339c7.png

 

Спойлер

 

(vl-load-com) 

(defun c:MD3 ( / snp cmdh name_of_bl pln krd num j my_blok my_att spis_att
 att_old att_new spis_att strt stp)
    (command "_.undo" "_begin")
    (setq snp (getvar "Osmode"))
    (setq cmdh (getvar "CMDECHO"))
    (setvar "Osmode" 0) 
    (setvar "CMDECHO" 0)
    (setq name_of_bl (getstring "\nБлок  <Блок_Нумерации >"))
    (setq pln (car (entsel)))
    (setvar "attreq" 0)
    (setq krd (vlax-curve-getPointAtParam pln 0))
    ;(command "_.insert" name_of_bl krd 1.0 1.0 0)
    (progn
        (setq num (1+ (fix(-(vlax-curve-getEndParam pln) 1))))
        (setq j 0)
        (repeat num
            ;(setq j (1+ j))
            (setq krd (vlax-curve-getPointAtParam pln j))
            (command "_.-insert" name_of_bl krd 1.0 1.0 0)
            (setq my_blok (entlast))
            (setq my_att (entnext my_blok))
            (setq spis_att (entget my_att))
            (setq att_old (assoc 1 spis_att)) 
            (setq num_new (itoa (1+ j)))
            (setq num_new (strcat num_new ))
            (setq att_new (cons 1 num_new)) ;
            (setq spis_att (subst att_new att_old spis_att))
            (entmod spis_att)
            (entupd (cdr (assoc -1 spis_att)))
            (setq j (1+ j))
        )
    ) ;progn
    (setq krd (vlax-curve-getPointAtParam pln (+ 1 num)))
    (command "_.-insert" name_of_bl krd 1.0 1.0 0)
    (setvar "Osmode"  snp) 
    (setvar "CMDECHO" cmdh)
)

 

 

MD3.lsp

MD3_test.dwg

Изменено пользователем A.Kudrjashov
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все отлично работает ! Спасибо !

 

upd. добавил префиксы и суффиксы и численную нумерацию с любого числа, теперь бомба !

Изменено пользователем aerohost
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@aerohost, теперь можете готовый рабочий вариант с доработками выложить тут на радость всем :)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
19 часов назад, A.Kudrjashov сказал:

Upd.
Скачал. Там блок - это единичка посередине "*U13" ?
Только, для информации, это динамический блок, а nanoCAD динамические блоки не понимает с точки зрения редактирования.


информация не совсем точная. Динамические блоки в нанокаде, действительно, не редактируются. Но это не касается атрибутов. Атрибуты можно менять (точнее, устанавливать новые значения) в динамических блоках и программно, и штатными средствами оболочки. Во всяком случае, это относится к именованным динамическим блокам ( не «*U...”, на них не проверял).

Изменено пользователем EdwardSt
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

×
×
  • Создать...