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

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

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

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

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

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


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

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


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


посмотрел пример в хелпе по этому свойству. там сначала создается список точек, а потом создается вся полилиния - это для меня понятно как сделать.
непонятно как мне указывая точки на экране рисовать полилинию уже с нужной толщиной. Я уверен что код для этого не более 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,262


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,262


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

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


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


Ну вариантов пока не много )).
Подскажите, что в этом коде не правильно:
Код:
[Выделить все]
 (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
Сообщений: 20


а куда его вставить и как он должен выглядеть?
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,519


Если рисовать 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
Сообщений: 20


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

Код:
[Выделить все]
 	(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
Сообщений: 20


Если использовать функцию 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,519


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

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


Код:
[Выделить все]
 (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
Сообщений: 20


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

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


Не за что. Оно примитивно работает: строится полилиния заданного веса по двум указанным точкам, извлекается список с ее характеристиками, в цикле пока указываются точки этот список дополняется и по нему модифицируется полилиния.
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 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нарисовать программно полилиню заданной толщины

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

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


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