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

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
Ссылка на сообщение
Поделиться на другие сайты
Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...