Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нарисовать программно полилиню заданной толщины

Нарисовать программно полилиню заданной толщины

Ответ
Поиск в этой теме
Непрочитано 30.03.2014, 10:33 #1
Нарисовать программно полилиню заданной толщины
remlin
 
Регистрация: 12.05.2008
Сообщений: 22

Здравсвуйте! сам я программист Delphi, с лиспом не очень. Помогите написать функцию лисп, которая рисует полилинию заданной толщиной. (Global width).
т.е. рисование должно быть аналогично комманде pline, только сразу должно рисоваться с толщиной, переданной в параметре функции. Спасибо!
Просмотров: 4566
 
Непрочитано 30.03.2014, 19:42
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,650


У LightWeightPolyline есть свойство ConstantWidth. Его и устанавливай
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2014, 22:26
#3
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


посмотрел пример в хелпе по этому свойству. там сначала создается список точек, а потом создается вся полилиния - это для меня понятно как сделать.
непонятно как мне указывая точки на экране рисовать полилинию уже с нужной толщиной. Я уверен что код для этого не более 10 строк, но для меня это не тривиальная задача, поэтому прошу привести образец функции.
remlin вне форума  
 
Непрочитано 31.03.2014, 22:47
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


переменная PLINEWID не поможет?
gomer вне форума  
 
Непрочитано 31.03.2014, 22:50
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,650


gomer, так ее потом восстанавливать обратно надо будет... ИМХО геморрой лишний.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.03.2014, 22:52
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


рисование програмноручками сам по себе геморрой...
gomer вне форума  
 
Непрочитано 31.03.2014, 22:53
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,650


Ну, в общем, у автора топика варианты уже есть
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.03.2014, 23:25
#8
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


Ну вариантов пока не много )).
Подскажите, что в этом коде не правильно:
Код:
[Выделить все]
 (defun c:DrawPline ( )
  (setvar 'plinewid 3.0)
  (command "_pline")
  (setvar 'plinewid 1.0)
)
Вроде бы по моему мнению должно перед началом рисования толщина устанавливаться на 3.0, а после рисования на 1.0.
Но в данном случае толщина сразу сбрасывается на 1.0. Где-то что-то пошло не так?
remlin вне форума  
 
Непрочитано 31.03.2014, 23:55
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


Цитата:
Сообщение от remlin Посмотреть сообщение
Подскажите, что в этом коде не правильно:
А где цикл указания точек?
gomer вне форума  
 
Автор темы   Непрочитано 01.04.2014, 19:13
#10
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


а куда его вставить и как он должен выглядеть?
remlin вне форума  
 
Непрочитано 01.04.2014, 19:57
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


Вставить - это на других сайтах, а вам нужно научиться мыслить алгоритмически иначе ничего не получится
gomer вне форума  
 
Непрочитано 01.04.2014, 20:25
#12
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,877


Если рисовать LWPOLYLINE командным методом, то физическую ширину можно указать опцией после задания первой точки:
Код:
[Выделить все]
 (vl-cmdf "_.PLINE"       first_point     "_Width"   pline_width     pline_width     next_point ... .... "")
Здесь точки в текущей ПСК, ширина полилинии с учетом масштаба, т.е. явно не 1.0, а например 500.0

Если делать через VLA, то наподобие:
Код:
[Выделить все]
 (defun ru-pline-add (points is_closed width lineweight ltype / obj)
                    ;|
Пример:
(ru-pline-add (list (list 0 0) (list 10000 1000) (list 10000 20000) (list 0 20000)) nil  0 50 "HIDDEN")

|;
  (ru-error-catch
    (function
      (lambda ()
        (setq
          obj (vla-addlightweightpolyline ;; создать полилинию
                (ru-obj-active-space)
                (ru-conv-list-points-to-variant-array
                  (apply
                    'append
                    (mapcar 'ru-conv-3dpoint-to-2dpoint
                            points
                    ) ;_ end of mapcar
                  ) ;_ end of apply
                ) ;_ end of ru-conv-list-points-to-variant-array
              ) ;_ end of vla-addlightweightpolyline
        ) ;_ end of setq
        (cond
          ((and
             (vlax-read-enabled-p obj)
             (vlax-write-enabled-p obj)
           ) ;_ end of and
           (if is_closed
             (vla-put-closed obj :vlax-true)
           ) ;_ end of if
           (if width
             vla-put-constantwidth obj width) ;; установить ширину
           ) ;_ end of if
           (ru-lw-set-for-obj obj lineweight)
           (if Ltype
             (ru-ltype-apply obj Ltype)
           ) ;_ end of if
           (vla-update obj)
           obj
          )
        ) ;_ end of cond
      ) ;_ end of lambda
    ) ;_ end of function
    (function (lambda (x)
                (princ (strcat "\nОШИБКА RU-PLINE-ADD " x))
                nil
              ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of ru-error-catch                
) ;_ end of defun
Здесь точки передаются списком, могут быть заданы is_closed (замкнутость), width (физическая ширина), lineweight (вес) и ltype. Да еще и ловушка ошибок предусмотрена.

Ну и можно через entmake, но более муторно.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 01.04.2014, 20:57
#13
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


мне наверное больше подходит это:

Код:
[Выделить все]
 	(vl-cmdf "_.PLINE"       first_point     "_Width"   pline_width     pline_width     next_point ... .... "")
но после выполнения данной процедуры, переменной 'plinewid присваиваеться новое значение. Как мне вернуть это значение обратно, какое оно было до выполнения данной процедуры?
remlin вне форума  
 
Непрочитано 02.04.2014, 11:20
#14
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 420
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от remlin Посмотреть сообщение
наверное больше подходит это
Даже на мой взгляд лучше программные методы, чем командные. как в команду передать переменое количество точек? лучше уж разобраться как вершины хранятся в чертеже и в том же виде передавать их программе либо dxf-кодами либо vla
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 02.04.2014, 19:34
#15
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


Если использовать функцию ru-pline-add, то для построения полилинии надо знать заранее координаты её вершин, чтобы передать их в функцию.
При использовании ru-pline-add сначало, как я понимаю, нужно набрать точки, передать их в функцию, а уж потом построится полилиния.
Но в моем случае мне нужен аналог комманды _.pline, когда полилиния "тянется" за курсором, и точки набираются последовательно.
Как можно использовать эту функцию для моего случая?
remlin вне форума  
 
Непрочитано 02.04.2014, 19:54
1 | #16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,877


Цитата:
Как можно использовать эту функцию для моего случая?
Для таких интерактивных случаев надо делать совершенно иначе. Надо использовать (vl-cmdf "_.PLINE"). Если необходимы какие-то действия, отсутствующие в штатной команде, то функцию vl-cmdf надо применять несколько раз, не завершая.. После каждого неполного применения делать что надо, потом снова вызывать vl-cmdf, передавая ей следующие ожидаемые аргументы. И в самом конце завершить.
ShaggyDoc вне форума  
 
Непрочитано 03.04.2014, 16:51
1 | #17
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 285


Код:
[Выделить все]
 (defun c:emupline  (/ x00 x01 x02)
  (setq x01 (entget
              (entmakex
                (append '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline") (90 . 2) (370 . 30))
                        (mapcar (function (lambda (e00) (list 10 (car e00) (cadr e00))))
                                (list (progn (initget 1) (setq x00 (getpoint "\nУкажите начальную точку полилинии...")))
                                      (progn (initget 1) (setq x00 (getpoint "\nУкажите следующую точку полилинии... " x00))))))))
        x02 1)
  (while (and (progn (initget "Завершить")
                     (setq x00 (getpoint "\nУкажите следующую точку полилинии или <Завершить>... " x00)))
              (not (eq "Завершить" x00)))
    (entmod (setq x01 (append (subst (cons 90 (+ 2 x02)) (cons 90 (setq x02 (1+ x02))) x01)
                              (list (list 10 (car x00) (cadr x00)))))))
  (princ))
ciril вне форума  
 
Автор темы   Непрочитано 03.04.2014, 21:25
#18
remlin


 
Регистрация: 12.05.2008
Сообщений: 22


Спасибо ciril. Не знаю как - но это работает, так как мне и было нужно!
remlin вне форума  
 
Непрочитано 04.04.2014, 10:38
#19
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 285


Не за что. Оно примитивно работает: строится полилиния заданного веса по двум указанным точкам, извлекается список с ее характеристиками, в цикле пока указываются точки этот список дополняется и по нему модифицируется полилиния.
ciril вне форума  
 
Непрочитано 06.01.2020, 11:32
#20
Tesan


 
Регистрация: 21.07.2018
Сообщений: 9


Доброго дня, возможно ли чтобы линия чертилась не с заданным весом, как у вас а именно шириной ?
Нашел такой макрос для вычерчивания полилинии с заданной шириной: ^C^C(setq pwid (getvar "plinewid");plinewid;<требуемая ширина>;_pline;(while (> (getvar "cmdactive") 0) (команда пауза)(setvar "plinewid" pwid) но почему то не работает
Tesan вне форума  
 
Непрочитано 09.01.2020, 11:33
#21
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 285


Код:
[Выделить все]
 (defun c:emupline  (/ x00 x01 x02)
 (setq x01 (entget
             (entmakex
               (append '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline") (43 . 10.0) (90 . 2))
                       (mapcar (function (lambda (e00) (list 10 (car e00) (cadr e00))))
                               (list (progn (initget 1) (setq x00 (getpoint "\nУкажите начальную точку полилинии...")))
                                     (progn (initget 1) (setq x00 (getpoint "\nУкажите следующую точку полилинии... " x00))))))))
       x02 1)
 (while (and (progn (initget "Завершить")
                    (setq x00 (getpoint "\nУкажите следующую точку полилинии или <Завершить>... " x00)))
             (not (eq "Завершить" x00)))
   (entmod (setq x01 (append (subst (cons 90 (+ 2 x02)) (cons 90 (setq x02 (1+ x02))) x01)
                             (list (list 10 (car x00) (cadr x00)))))))
 (princ))
Иначе говоря, 370 код заменен на 43, с cdr - глобальной шириной.
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 09.01.2020, 17:57
#22
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,879
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от ciril Посмотреть сообщение
(setq x00 (getpoint "\nУкажите следующую точку полилинии... " x00)
Должно быть наоборот
Цитата:
(setq x00 (getpoint x00 "\nУкажите следующую точку полилинии... " )
Код:
[Выделить все]
(defun c:emupline  (/ x00 x01 x02)
(setq x01 (entget
            (entmakex
              (append '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline") (43 . 10.0) (90 . 2))
                      (mapcar (function (lambda (e00) (list 10 (car e00) (cadr e00))))
                              (list (progn (initget 1) (setq x00 (getpoint "\nУкажите начальную точку полилинии...")))
                                    (progn (initget 1) (setq x00 (getpoint x00 "\nУкажите следующую точку полилинии... " ))))))))
      x02 1)
(while (and (progn (initget "Завершить")
                   (setq x00 (getpoint x00 "\nУкажите следующую точку полилинии или <Завершить>... ")))
            (not (eq "Завершить" x00)))
  (entmod (setq x01 (append (subst (cons 90 (+ 2 x02)) (cons 90 (setq x02 (1+ x02))) x01)
                            (list (list 10 (car x00) (cadr x00)))))))
(princ))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.01.2020, 19:31
#23
Семёныч


 
Регистрация: 08.12.2018
Сообщений: 163


Простейшая программа вычерчивания полилинии с заданной шириной всех сегментов без использования PLINEWID:
Код:
[Выделить все]
(defun C:PLW ( / osm шир)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq шир (getreal "Ширина всех сегментов полилинии: "))
(vl-cmdf "_PLINE")
(while (/= (logand (getvar "cmdactive") 31) 0)
       (vl-cmdf pause)
)
(vl-cmdf "_PEDIT" "_l" "_w" шир "")
(setvar "OSMODE" osm)
(princ)
)
Семёныч вне форума  
 
Непрочитано 09.01.2020, 19:47
#24
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,650


Семёныч, ИМХо восстанавливать привязки надо значительно раньше (если вообще имеет смысл их менять)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.01.2020, 20:02
#25
Семёныч


 
Регистрация: 08.12.2018
Сообщений: 163


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
восстанавливать привязки надо значительно раньше
Это как? Восстанавливать привязки ДО вычерчивания полилинии? Смешно, IMHO.
А если их вообще не менять, то ты первый и придрался бы.
Два раза IMHO.
Семёныч вне форума  
 
Непрочитано 09.01.2020, 20:07
#26
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,650


Не, ну объясни серому, как штаны пожарника - на фига их вообще трогать? getreal глубоко фиолетово привязки. Человек выставил - и нехай оно будет, работе лиспа оно не мешает ни разу.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.01.2020, 22:57
#27
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 285


Цитата:
Сообщение от VVA Посмотреть сообщение
Должно быть наоборот
Строго говоря, да. Но мне больше нравиться не наоборот.
ciril вне форума  
 
Непрочитано 09.01.2020, 23:46
#28
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,879
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от ciril Посмотреть сообщение
Строго говоря, да. Но мне больше нравиться не наоборот.
Все время следовал справке, даже в мыслях не было сделать наоборот. Посчитал опиской. Проверил в Автокаде - работает
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.01.2020, 09:37
#29
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 285


Цитата:
Сообщение от VVA Посмотреть сообщение
Все время следовал справке, даже в мыслях не было сделать наоборот. Посчитал опиской. Проверил в Автокаде - работает
Как ни странно, все get функции с двумя параметрами так работают, я уже и забыл как в справке
__________________
На работе было скучно:shout:
ciril вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нарисовать программно полилиню заданной толщины

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отклонение не более 10% от заданной толщины стяжки Picnic Технология и организация строительства 9 07.01.2014 20:16
Помогите программно нарисовать профильную трубу! Владимир М Программирование 19 20.12.2006 11:10