Нужен лисп (добавить вершину в полилинию) - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (добавить вершину в полилинию)

Нужен лисп (добавить вершину в полилинию)

Ответ
Поиск в этой теме
Непрочитано 28.06.2006, 04:09
Нужен лисп (добавить вершину в полилинию)
Димас
 
джедай
 
Магадан
Регистрация: 31.01.2005
Сообщений: 460

Уважаемые гуру!
Помогите пожалуйста с такой проблемой.
Нужен лисп способный добавлять вершины в полилинию. (нечто такое - ткнул мышем на полилинию примерно в том месте куда хочу добавить вершину, ткнул мышем на точку куда ее поставить)
при этом нужно чтоб и ассоциативность штриховки не потерялась
В инете нашел очень много подобных но у всех есть большой недостаток - не работают в 3D (либо взрывают полилинию при работе)
т.е. если полилиния нарисована не в мировых координатах - работать они отказываются
пробовал написать сам но в лиспе не силен - не смог разобраться с переводом координат((
Просмотров: 14225
 
Непрочитано 28.06.2006, 12:09
#21
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Вот здесь в конце был представлен прототип программы
Последняя версия в архиве (команда pline-strPE), там же меню и утилиты, собранные Владимиром Громовым здесь.
[ATTACH]1151482169.rar[/ATTACH]
VVA вне форума  
 
Автор темы   Непрочитано 29.06.2006, 00:59
#22
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от VVA
Вот здесь в конце был представлен прототип программы
Последняя версия в архиве (команда pline-strPE), там же меню и утилиты, собранные Владимиром Громовым здесь.
[ATTACH]1151482169.rar[/ATTACH]
скопировал ваш архив в моем случае он не работает
работаю в UCS
Димас вне форума  
 
Автор темы   Непрочитано 29.06.2006, 01:03
#23
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to Елпанов Евгений
Цитата:
если тебе нужно работать с полилиниями в своей системе координат, скажи, посмотрю, что можно сделать...
вообще-то да) очень нужно))
Димас вне форума  
 
Непрочитано 29.06.2006, 12:58
#24
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>Димас
Цитата:
работаю в UCS
Один нюанс:
Объект не параллелен ПСК.
Подправил. Должно работать
[ATTACH]1151571496.rar[/ATTACH]
VVA вне форума  
 
Автор темы   Непрочитано 30.06.2006, 01:28
#25
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от "VVA
Подправил. Должно работать
либо я что-то не нак делаю, либо не работает)
нужно использовать команду pline-strPE?
попробовал просто начертить полилинию и добавить в нее вершину - не получилось
вот хистори:
Код:
[Выделить все]
Command:  PLINE-STRPE
Óêàæèòå òî÷êó ðàçðûâà <âûõîä> : _UCS
Current ucs name:  *WORLD*
Enter an option [New/Move/orthoGraphic/Prev/Restore/Save/Del/Apply/?/World] 
<World>: _New
Specify origin of new UCS or [ZAxis/3point/OBject/Face/View/X/Y/Z] <0,0,0>: 
_Object
Select object to align UCS:
Command: Óêàæèòå íîâóþ òî÷êó : ERRNO # 0: no function definition: LIB:PT_EXTENTS
_UCS
Current ucs name:  *NO NAME*
Enter an option [New/Move/orthoGraphic/Prev/Restore/Save/Del/Apply/?/World] 
<World>: _p
это если в новом файле без каких-либо систем координат...
если в файле с ПСК:
Код:
[Выделить все]
Command: PLINE-STRPE
Óêàæèòå òî÷êó ðàçðûâà <âûõîä> :
тыкаю полилинию пишет что ничего не выбрано...
Димас вне форума  
 
Непрочитано 30.06.2006, 09:48
#26
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Извини, забыл включить ф-цию LIB:PT_EXTENTS.
Вот новая (надеюсь последняя) сборка
У меня в твоем файле работает.
[ATTACH]1151646480.rar[/ATTACH]
VVA вне форума  
 
Непрочитано 01.07.2006, 11:59
#27
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Я, конечно, понимаю, что яичко дорого к Христову дню, но вот недосуг было поразвлекаться с программой уважаемого Елпанова Евгения. А поразвлекаться руки чесались - уж больно она у него нерационально построена и избыточна. Вот что получилось:
Код:
[Выделить все]
(defun c:lw_pt (/ adoc lw0 lw gr csp par i lst pt0 pt crs ang anc blg pl)
Начало я менять не стал, потому как оно мне понравилось, только кое что уточнил. Хотя в 2007-м подсветка при движении курсора - встроенная функция.
Код:
[Выделить все]
(princ "\n Укажите новую вершину на Полилинии, Линии, Дуге или Окружности: ")
  (while (and (setq gr (grread 5)) (= (car gr) 5))
    (if lw0 (redraw lw0 4))
    (if (and (setq pt0 (osnap (cadr gr) "_nea,_end"))
             (setq lw0 (ssname (ssget pt0 '((0 . "LWPOLYLINE,LINE,ARC,CIRCLE"))) 0)));and
      (redraw lw0 3)));while
А вот дальше - сугубо мое.
Код:
[Выделить все]
(setq pt (trans pt0 1 lw0)
        lw (vlax-ename->vla-object lw0)
        csp (vla-ObjectIDToObject adoc (vla-get-OwnerID lw))
        par (vlax-curve-getParamAtPoint lw pt0))
  (vla-startundomark adoc)
  (cond ((= (vla-get-ObjectName lw) "AcDbPolyline")
         (setq crs (vlax-get lw 'Coordinates) i 0)         
         (while (<= i (fix par))
           (setq lst (reverse (cons (cadr crs) (cons (car crs) (reverse lst))))
                 crs (cddr crs) i (1+ i)));while
         (setq crs (append lst (vl-remove (last pt) pt) crs)));Pln
        ((= (vla-get-ObjectName lw) "AcDb3DPolyline")
         (setq crs (vlax-get lw 'Coordinates) i 0)
         (while (<= i (fix par))
           (setq lst (reverse (cons (caddr crs) (cons (cadr crs) (cons (car crs) (reverse lst)))))
                 crs (cdddr crs) i (1+ i)));while
         (setq crs (append lst pt crs)));3dPln
        ((or (= (vla-get-ObjectName lw) "AcDbLine")
             (= (vla-get-ObjectName lw) "AcDbArc"));or
         (setq crs (mapcar '(lambda (x) (vlax-get lw x)) '(StartPoint EndPoint))
               crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                                    (list (car crs) pt (cadr crs)))))
         (if (= (vla-get-ObjectName lw) "AcDbArc")
           (setq ang (mapcar '(lambda (x) (vlax-get lw x)) '(EndAngle StartAngle))
                 anc (vla-AngleFromXAxis (vla-get-utility adoc) (vla-get-center lw) (vlax-3d-point pt))
                 blg (mapcar '(lambda (x) (/ (sin (* 0.25 x)) (cos (* 0.25 x))))
                       (list (- (car ang) anc) (- anc (cadr ang)))))));ArcLin
        ((= (vla-get-ObjectName lw) "AcDbCircle")
         (setq crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                      (list pt (vlax-curve-getPointAtParam lw (if (<= par pi) (- par pi) (+ par pi))) pt)))
               blg '(1 1))));cond
  (setq var (vlax-make-variant (vlax-safearray-fill
                    (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length crs)))) crs)))
  (if (wcmatch (vla-get-ObjectName lw) "*Polyline") (vla-put-Coordinates lw var)
    (setq pl (vla-addLightWeightPolyline csp var)));if
  (if (not (wcmatch (vla-get-ObjectName lw) "*line"))
    (progn (vla-delete lw) (mapcar '(lambda (x y) (vla-setBulge pl x y)) '(1 0) blg)));if
    (vl-cmdf "_.stretch" "_C" pt0 pt0 "" pt0 (getpoint "\nУкажите новую точку : ")) 
  (vla-endundomark adoc)
);defun
Да, VVA, ваша проблема у меняя решена. дело было не в приязке а в преходе из МСК в ОСК. Так что пользуйтесь на здоровье.
Лентяй вне форума  
 
Непрочитано 01.07.2006, 14:08
#28
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Лентяй
Я, конечно, понимаю, что яичко дорого к Христову дню, но вот недосуг было поразвлекаться с программой уважаемого Елпанова Евгения. А поразвлекаться руки чесались - уж больно она у него нерационально построена и избыточна.
Спасибо за доделку программы! Возможно, она наконец будет востребованна
Если вы читали тему, в которой она родилась - заметили, что паралельно писалось две программы - Алексеем и мной. Программа, которую разработал kpblc пошла в народ, а я, на свою забил - сначала отвлекся, а потом стало недосуг... То, что выложил ее на этом форуме, было ошибкой - я совсем забыл, в какой она стадии - только помнил, что там изменяется полилиния, а не пересоздается - т.е. ассоциативность обязанна сохраниться
Елпанов Евгений вне форума  
 
Непрочитано 01.07.2006, 14:32
#29
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Посмотрел вашу программу и понял ваши слова о избыточности! В отличие от вашего варианта, она коректно работает с полилиниями имеющими дуговые сегменты и переменную ширину каждого сегмента...
Для решения задач, поставленных в этой теме, такие вещи не нужны! Здесь конкретная задача - все сегменты линейные!
Моя же программа, вычисляет ширину сегмента в любой добавляемой точке и новые тангенсы для получившихся сегментов
Елпанов Евгений вне форума  
 
Непрочитано 02.07.2006, 02:02
#30
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>Лентяй
>Елпанов Евгений
Ребята большое спасибо, сбылась моя мечта иметь ф-цию, добавляющую вершину в полилинию без Pedit и Strech.

Немного критики: Лентяй оправдывает свой ник, команда отрабатывает 1 раз в одном сеансе :wink:
Зато использование этого кода позволили отказаться от кучи ф-ций.
>Димас Теперь я ф-цию LIB:PT_EXTENTS исключил за ненадобностью
[ATTACH]1151791306.rar[/ATTACH]
VVA вне форума  
 
Непрочитано 02.07.2006, 12:34
#31
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Елпанов Евгений
Посмотрел вашу программу и понял ваши слова о избыточности!
Боюсь, что вы их поняли неверно. Избыточночть авшей программы состоит в том, что полилиния отрисовывается заново и затем растягивается внутри каждого условия. Хотя ясно, что растягивается модифицировнная полилиния независимо от того, как она была создана или изменена. Отсюда - пятикратный повтор однократно испульзуемой операции.
Цитата:
В отличие от вашего варианта, она коректно работает с полилиниями имеющими дуговые сегменты и переменную ширину каждого сегмента...
Тоже мне, бином Ньютона! держите дополненнок издание, пока я добрый Кстати, переменную ширину полилнии моя прграмма поддерживает.
Код:
[Выделить все]
(defun c:lw_pt (/ adoc lw0 lw gr csp par i lst pt0 pt crs ang ang1 ang2 cpt anc blgpl ee)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc))
  (princ "\n Укажите новую вершину на Полилинии, Линии, Дуге или Окружности: ")
  (while (and (setq gr (grread 5)) (= (car gr) 5))
    (if lw0 (redraw lw0 4))
    (if (and (setq pt0 (osnap (cadr gr) "_nea,_end"))
             (setq lw0 (ssname (ssget pt0 '((0 . "LWPOLYLINE,LINE,ARC,CIRCLE"))) 0)));and
      (redraw lw0 3)));while
  (setq pt (trans pt0 1 lw0)
        lw (vlax-ename->vla-object lw0)
        csp (vla-ObjectIDToObject adoc (vla-get-OwnerID lw))
        par (vlax-curve-getParamAtPoint lw pt0))
  (vla-startundomark adoc)
  (cond ((= (vla-get-ObjectName lw) "AcDbPolyline")
         (setq crs (vlax-get lw 'Coordinates) i 0)         
         (while (<= i (fix par))
           (setq lst (reverse (cons (cadr crs) (cons (car crs) (reverse lst))))
                 crs (cddr crs) i (1+ i)));while
         (if (/= (setq blg (vla-getBulge lw (1- i))) 0.0)
           (setq ee (if (minusp blg) 0 pi)
                 pts1 (mapcar '(lambda (x y) (list x y (last pt)))
                        (list (cadr (reverse lst)) (car crs)) (list (last lst) (cadr crs)))
                 ang (* 4 (atan blg))
                 ang1 (/ (- pi ang) 2)
                 ang2 (+ (apply 'angle pts1) ang1)
                 cpt (polar (car pts1) ang2 (* 0.5 (/ (apply 'distance pts1) (cos ang1))))
                 anc (vla-AngleFromXAxis util (vlax-3d-point cpt) (vlax-3d-point pt))
                 blg (mapcar '(lambda (x) (/ (sin (* 0.25 x)) (cos (* 0.25 x))))
                       (list (- (+ ang ang2) ee anc) (- anc (- ang2 ee))))));if
         (setq crs (append lst (vl-remove (last pt) pt) crs)));Pln
        ((= (vla-get-ObjectName lw) "AcDb3DPolyline")
         (setq crs (vlax-get lw 'Coordinates) i 0)
         (while (<= i (fix par))
           (setq lst (reverse (cons (caddr crs) (cons (cadr crs) (cons (car crs) (reverse lst)))))
                 crs (cdddr crs) i (1+ i)));while
         (setq crs (append lst pt crs)));3dPln
        ((or (= (vla-get-ObjectName lw) "AcDbLine")
             (= (vla-get-ObjectName lw) "AcDbArc"));or
         (setq crs (mapcar '(lambda (x) (vlax-get lw x)) '(StartPoint EndPoint))
               crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                                    (list (car crs) pt (cadr crs)))))
         (if (= (vla-get-ObjectName lw) "AcDbArc")
           (setq ang (mapcar '(lambda (x) (vlax-get lw x)) '(EndAngle StartAngle))
                 anc (vla-AngleFromXAxis (vla-get-utility adoc) (vla-get-center lw) (vlax-3d-point pt))
                 blg (mapcar '(lambda (x) (/ (sin (* 0.25 x)) (cos (* 0.25 x))))
                       (list (- (car ang) anc) (- anc (cadr ang)))))));ArcLin
        ((= (vla-get-ObjectName lw) "AcDbCircle")
         (setq crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                      (list pt (vlax-curve-getPointAtParam lw (if (<= par pi) (- par pi) (+ par pi))) pt)))
               blg '(1 1))));cond
  (setq var (vlax-make-variant (vlax-safearray-fill
                    (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length crs)))) crs)))
  (if (wcmatch (vla-get-ObjectName lw) "*Polyline") (progn
      (vla-put-Coordinates lw var)
      (if (/= blg 0.0) (mapcar '(lambda (x y) (vla-setBulge lw x y)) (list i (1- i)) blg)));progn
    (setq pl (vla-addLightWeightPolyline csp var)));if
  (if (not (wcmatch (vla-get-ObjectName lw) "*line"))
    (progn (vla-delete lw) (mapcar '(lambda (x y) (vla-setBulge pl x y)) '(1 0) blg)));if
(vl-cmdf "_.stretch" "_C" pt0 pt0 "" pt0 (getpoint "\nУкажите новую точку : ")) 
  (vla-endundomark adoc)
);defun
Цитата:
Для решения задач, поставленных в этой теме, такие вещи не нужны! Здесь конкретная задача - все сегменты линейные!
Моя же программа, вычисляет ширину сегмента в любой добавляемой точке и новые тангенсы для получившихся сегментов
Я вам адын умный вещ сважу (с). Мы здесь обмениваемся идеями, а не прталкиваем свои продукты. Моя цель была - показать, что средствами AtiveX задача модификации и/или постороения полилиниий решается намного проще и легче, чем AutoLISP'ом. Особенно, когда достаточно модифицировать свойство объекта, вместо того, чтобы созавать его с нуля. Своей цели я достиг. Модификация дуговых сегметов стоила мне всего лишь дюжину строк. И уж конечно, мне не прищлось многкратно вычилять косинус 90 градусов, что вы халожили в вш фолиант. Зачем вам вообще это понадобилось? [sm2100]

> VVA
Цитата:
Лентяй оправдывает свой ник, команда отрабатывает 1 раз в одном сеансе
А что бы вам хотелось? Бесконечный цикл с выходом ESC? Так это - пжалста, но за отдельные деньги :twisted: :twisted: . Правда, от удобного вводы по Елпановски, видимо придется отказаться.
Лентяй вне форума  
 
Непрочитано 02.07.2006, 21:02
#32
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>Лентяй
Что то у меня не получается изменить полилинию с дуговыми сегментами, вашей новой программой... Полилинию перекручивает.
Вот полилиния, с которой я пробовал вашу программу:
Код:
[Выделить все]
(entmakex
 '((0 . "LWPOLYLINE")
   (100 . "AcDbEntity")
   (67 . 0)
   (410 . "Model")
   (8 . "0")
   (100 . "AcDbPolyline")
   (90 . 7)
   (70 . 1)
   (38 . 0.0)
   (39 . 0.0)
   (10 207.278 102.271)
   (40 . 1.0)
   (41 . 10.0)
   (42 . 0.232218)
   (10 168.439 181.387)
   (40 . 10.0)
   (41 . 20.0)
   (42 . 0.206912)
   (10 91.5402 201.025)
   (40 . 20.0)
   (41 . 30.0)
   (42 . 0.192812)
   (10 27.7218 162.859)
   (40 . 30.0)
   (41 . 40.0)
   (42 . 0.240241)
   (10 11.5173 73.4626)
   (40 . 40.0)
   (41 . 30.0)
   (42 . 0.210937)
   (10 64.0504 12.0968)
   (40 . 30.0)
   (41 . 20.0)
   (42 . 0.273096)
   (10 165.33 20.8465)
   (40 . 20.0)
   (41 . 1.0)
   (42 . 0.242447)
   (210 0.0 0.0 1.0)
  )
) ;_  entmakex
Вот как она выглядит и результат:
[ATTACH]1151859725.jpg[/ATTACH]
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 03.07.2006, 02:24
#33
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to VVA
спасибо пробовал вашу последнюю программу - работает:
работает и в 3Д и связь с штриховкой не теряется

есть только одна маленькая просьба
после добавления новой вершины, штриховка "забывает" заливаться дальше, приходится брать любую их вершин полилинии и переносить ее в любое место, затем возвращать обратно, тогда весь контур полилиниии заливается штриховкой
можно ли сделать так чтоб штриховка обновлялась сама?
Димас вне форума  
 
Автор темы   Непрочитано 03.07.2006, 08:18
#34
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to VVA
извините разобрался)
не нужно в конце нажимать Ескейп))
Димас вне форума  
 
Непрочитано 03.07.2006, 21:47
#35
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Елпанов Евгений
>Лентяй
Что то у меня не получается изменить полилинию с дуговыми сегментами, вашей новой программой... Полилинию перекручивает.
Не получается баловаться с ширинками ? Посмотрите как работает примененная мной функция
Код:
[Выделить все]
(vla-setBulge lw [value])
и сделайте то же самое с функцией
Код:
[Выделить все]
(vla-setWidth lw [value])
. Например так:
Код:
[Выделить все]
(defun c:lw_pt (/ adoc lw0 lw gr csp par i j lst pt0 pt crs ang cpt blg pl bwl)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc))
  (princ "\n Укажите новую вершину на Полилинии, Линии, Дуге или Окружности: ")
  (while (and (setq gr (grread 5)) (= (car gr) 5))
    (if lw0 (redraw lw0 4))
    (if (and (setq pt0 (osnap (cadr gr) "_nea,_end"))
             (setq lw0 (ssname (ssget pt0 '((0 . "LWPOLYLINE,LINE,ARC,CIRCLE"))) 0)));and
      (redraw lw0 3)));while
  (setq pt (trans pt0 1 lw0)
        lw (vlax-ename->vla-object lw0)
        csp (vla-ObjectIDToObject adoc (vla-get-OwnerID lw))
        par (vlax-curve-getParamAtPoint lw pt))
  (vla-startundomark adoc)
  (cond ((or (= (vla-get-ObjectName lw) "AcDbPolyline")
             (= (vla-get-ObjectName lw) "AcDb3DPolyline"))
         (setq crs (vlax-get lw 'Coordinates) i 0) 
         (while (<= i (fix par))
           (if (= (vla-get-ObjectName lw) "AcDbPolyline")
             (setq lst (reverse (cons (cadr crs) (cons (car crs) (reverse lst))))
                   crs (cddr crs) i (1+ i))
             (setq lst (reverse (cons (caddr crs) (cons (cadr crs) (cons (car crs) (reverse lst)))))
                 crs (cdddr crs) i (1+ i))));while
         (setq j i)
         (if (/= (setq blg (vla-getBulge lw (1- i))) 0.0)
           (setq pts (mapcar '(lambda (x) (vlax-curve-getPointAtParam lw x)) (list (1- i) i))
                 ang (/ (- pi (* 4 (atan blg))) 2) 
                 cpt (polar (car pts) (+ (apply 'angle pts) ang) (* 0.5 (/ (apply 'distance pts) (cos ang))))
                 ans (mapcar '(lambda (x) (vla-AngleFromXAxis util (vlax-3d-point cpt) (vlax-3d-point x)))
                       (cons pt pts))
                 blg (mapcar '(lambda (x) (setq x (rem x (* 2 pi))) (/ (sin (* 0.25 x)) (cos (* 0.25 x))))
                       (list (- (last ans) (car ans)) (+ (* 2 pi) (- (car ans) (cadr ans)))))));if
         (while (< i (vlax-curve-getEndParam lw))
           (vla-getWidth lw i 'sw 'ew)
           (setq bwl (cons (list (vla-getBulge lw i) sw ew) bwl)
                 i (1+ i)));while
         (setq bwl (reverse bwl)
               crs (append lst (if (= (vla-get-ObjectName lw) "AcDbPolyline")
                                 (vl-remove (last pt) pt) pt) crs)));Pln
        ((or (= (vla-get-ObjectName lw) "AcDbLine")
             (= (vla-get-ObjectName lw) "AcDbArc"));or
         (setq crs (mapcar '(lambda (x) (vlax-get lw x)) '(StartPoint EndPoint))
               crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                                    (list (car crs) pt (cadr crs)))))
         (if (= (vla-get-ObjectName lw) "AcDbArc")
           (setq ang (mapcar '(lambda (x) (vlax-get lw x)) '(EndAngle StartAngle))
                 anc (vla-AngleFromXAxis (vla-get-utility adoc) (vla-get-center lw) (vlax-3d-point pt))
                 blg (mapcar '(lambda (x) (/ (sin (* 0.25 x)) (cos (* 0.25 x))))
                       (list (- (car ang) anc) (- anc (cadr ang)))))));ArcLin
        ((= (vla-get-ObjectName lw) "AcDbCircle")
         (setq crs (apply 'append (mapcar '(lambda (x) (vl-remove (last x) x))
                      (list pt (vlax-curve-getPointAtParam lw (if (<= par pi) (- par pi) (+ par pi))) pt)))
               blg '(1 1))));cond
  (setq var (vlax-make-variant (vlax-safearray-fill
                    (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length crs)))) crs)))
  (if (wcmatch (vla-get-ObjectName lw) "*Polyline") (progn
      (vla-put-Coordinates lw var)
      (if (/= blg 0.0) (mapcar '(lambda (x y) (vla-setBulge lw x y)) (list j (1- j)) blg));if
      (vla-setWidth lw j (cadar bwl) (cadar bwl))
      (while (< j (1- (vlax-curve-getEndParam lw)))
        (vla-setBulge lw (1+ j) (caar bwl))
        (vla-setWidth lw (1+ j) (cadar bwl) (caddar bwl))
        (setq bwl (cdr bwl) j (1+ j)));while
      );progn
    (setq pl (vla-addLightWeightPolyline csp var)));if
  (if (not (wcmatch (vla-get-ObjectName lw) "*line"))
    (progn (vla-delete lw) (mapcar '(lambda (x y) (vla-setBulge pl x y)) '(1 0) blg)));if
  (vl-cmdf "_.stretch" "_C" pt0 pt0 "" pt0 (getpoint "\nУкажите новую точку : ")) 
  (vla-endundomark adoc)
);defun
Обратите также внимание на упррощенное вычистение центральных кглов новых сегментов.
Какая уже говорил, моя цель была показать, что (1) решать задачу добавления вершины в полилинию средствами ActiveX намного проще, чем AutoLISP'ом и (2) опреции общего характера следует выносить за границы конкретных условий, всегда, когда это возможно. Результат, я думаю, очевиден.
Лентяй вне форума  
 
Непрочитано 03.07.2006, 22:21
#36
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
(1) решать задачу добавления вершины в полилинию средствами ActiveX намного проще, чем AutoLISP'ом
Не согласен...
Цитата:
(2) опреции общего характера следует выносить за границы конкретных условий, всегда, когда это возможно. Результат, я думаю, очевиден.
Точно! Абсолютно согласен - не нужно два раза писать в программе одно и то-же...
Цитата:
Не получается баловаться с ширинками ? Посмотрите как работает примененная мной функция
Уже посмотрел, правда только в мировой системе координат - дальше не пошел - опять глюки...
Может я что то делаю не так?
[ATTACH]1151950865.jpg[/ATTACH]
Елпанов Евгений вне форума  
 
Непрочитано 03.07.2006, 23:34
#37
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Все нормально. Сначала полилиния искажается, потому как добваляется новая вершина с "нулевыми" свойствами. Затем свойства сегменов переназначаются со сдвигом на единицу, так что перед растяжкой все компенсируется. Так что - верной дорогой идете, товарищи!(с)
Лентяй вне форума  
 
Непрочитано 04.07.2006, 08:57
#38
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Лентяй
Все нормально. Сначала полилиния искажается, потому как добваляется новая вершина с "нулевыми" свойствами. Затем свойства сегменов переназначаются со сдвигом на единицу, так что перед растяжкой все компенсируется. Так что - верной дорогой идете, товарищи!(с)
Видимо, я плохо объяснил - посмотри на картинке ответы в командной строке!
Программа не спрашивает вторую точку, а вылетает раньше и с ошибкой...
Елпанов Евгений вне форума  
 
Непрочитано 04.07.2006, 10:24
#39
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Вот это уже, действительно, странно [sm2100], потому что у меня все получается. ACAD-2005en/SP1
[ATTACH]1151994643.jpg[/ATTACH]
Лентяй вне форума  
 
Непрочитано 04.07.2006, 11:08
#40
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


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


И еще...
После добавления сегмента - ширина делится не правильно!
Т.е. был сегмент с шириной 30-40 а стало два сегмента - один 30-40 другой 30-30...
У меня они делились в соответствии с отношением длинн, т.е. если не двигать новую точку - полилиния будет выглядеть так же, как до добавления вершины, но с дополнительной точкой...

PS. Проверял на акаде 2004en.
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (добавить вершину в полилинию)