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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание 3d полилинии макрасом

Создание 3d полилинии макрасом

Ответ
Поиск в этой теме
Непрочитано 18.09.2008, 12:57 #1
Создание 3d полилинии макрасом
Mazai
 
Москва
Регистрация: 04.04.2008
Сообщений: 97

Добрый день. Вопрос в следующем. Как создать 3Д полилинию используя макрос. Я интуитивно понимаю что это возможно, но макросы у меня плохо получаются.
Нужно: Вызвав команду 3DПЛИНИЯ получить координаты курсора XY и позволить пользователю задать в этой точке координату Z. После чего поставить там вершину и продолжить задавать таким же методом остальные.
Важно привязаться к существующей в 2Д-чертеже точке и ввести новую трёхмерную координату.
Просмотров: 4024
 
Непрочитано 18.09.2008, 13:04
#2
Кулик Алексей aka kpblc
Moderator

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


Что-то такое на форуме уже было... Вроде нечто типа http://dwg.ru/f/showthread.php?p=281695
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.09.2008, 14:49
#3
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Я так понимаю, что опять всё придёться делать вручную - создавать свои функции. Сперва я создаю 3D-полилинию, а затем её изменяю - добавляя вершину за вершиной к ней.
И тут передо мной возникла следующая сложность. Для создания я пользуюсь функцией ENTMAKE и передаю ей следующий список:
Код:
[Выделить все]
(entmake
    (append
      (list	'(0 . "POLYLINE" )
	'(100 . "AcDbEntity" )
	'(100 . "AcDb3dPolyline" )
	(cons 8  "0")
	'(70 . 8)			;флаг 3Д-полилинии
      )
      (mapcar '(lambda (x) (cons 10 x)) plist) ;plist - список координат точек
    )
)
Но полилиния не создаётся. Чую, что я что-то напортачил, но чего именно пока не пойму. Если есть более простой и надёжный способ создать\изменить 3Д объекты - подскажите пожалуйста.
Mazai вне форума  
 
Непрочитано 22.09.2008, 15:13
#4
Кулик Алексей aka kpblc
Moderator

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


У 3д-полилинии формат описания другой. По-моему, там проще идти через activex-методы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.09.2008, 15:33
#5
VVA

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


Надо Добавлять еще VERTEX и SEQEND
Посмотри ru-pline-entmake
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.09.2008, 16:05
#6
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Спасибо, теперь я ищу документацию для изучения activeX-методов... думал что смогу обойтись без них А всё из-за того, что нельзя в автокаде обязать "в ручную" задавать третью координату
Mazai вне форума  
 
Непрочитано 22.09.2008, 16:31
#7
Кулик Алексей aka kpblc
Moderator

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


Как вариант (еще один):
Код:
[Выделить все]
(defun test-3d (/ adoc *error* count pt z ent pt_next z_next coords)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (setq count 1)
  (if
    (and (= (type (setq pt (vl-catch-all-apply
                             '(lambda ()
                                (getpoint (strcat "\nУкажи вершину №"
                                                  (rtos count 2 0)
                                                  " <Отмена> : "
                                                  ) ;_ end of strcat
                                          ) ;_ end of getpoint
                                ) ;_ end of lambda
                             ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'list
            ) ;_ end of =
         (= (type (setq z (vl-catch-all-apply
                            '(lambda ()
                               (cond
                                 ((getreal (strcat "\nZ-координата вершины "
                                                   (rtos count 2 0)
                                                   " <0.0> : "
                                                   ) ;_ end of strcat
                                           ) ;_ end of getreal
                                  )
                                 (t 0.)
                                 ) ;_ end of cond
                               ) ;_ end of lambda
                            ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'real
            ) ;_ end of =
         (= (type (setq pt_next
                         (vl-catch-all-apply
                           '(lambda ()
                              (getpoint pt
                                        (strcat "\nУкажи вершину №"
                                                (rtos (setq count (1+ count)) 2 0)
                                                " <Отмена> : "
                                                ) ;_ end of strcat
                                        ) ;_ end of getpoint
                              ) ;_ end of lambda
                           ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'list
            ) ;_ end of =
         (= (type (setq z_next (vl-catch-all-apply
                                 '(lambda ()
                                    (cond
                                      ((getreal (strcat "\nZ-координата вершины "
                                                        (rtos count 2 0)
                                                        " <"
                                                        (rtos z 2 4)
                                                        "> : "
                                                        ) ;_ end of strcat
                                                ) ;_ end of getreal
                                       )
                                      (t z)
                                      ) ;_ end of cond
                                    ) ;_ end of lambda
                                 ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'real
            ) ;_ end of =
         ) ;_ end of and
     (progn
       (setq ent (vla-add3dpoly
                   (vla-get-modelspace adoc)
                   (vlax-make-variant
                     (vlax-safearray-fill
                       (vlax-make-safearray
                         vlax-vbdouble
                         (cons 0 5)
                         ) ;_ end of vlax-make-safearray
                       (list (car pt)
                             (cadr pt)
                             z
                             (car pt_next)
                             (cadr pt_next)
                             z_next
                             ) ;_ end of list
                       ) ;_ end of vlax-safearray-fill
                     ) ;_ end of vlax-make-variant
                   ) ;_ end of vla-Add3DPoly
             pt  pt_next
             z   z_next
             ) ;_ end of setq
       (while
         (and (= (type (setq pt_next
                              (vl-catch-all-apply
                                '(lambda ()
                                   (getpoint pt
                                             (strcat "\nУкажи вершину №"
                                                     (rtos (setq count (1+ count)) 2 0)
                                                     " <Отмена> : "
                                                     ) ;_ end of strcat
                                             ) ;_ end of getpoint
                                   ) ;_ end of lambda
                                ) ;_ end of vl-catch-all-apply
                             ) ;_ end of setq
                       ) ;_ end of type
                 'list
                 ) ;_ end of =
              (= (type (setq z_next (vl-catch-all-apply
                                      '(lambda ()
                                         (cond
                                           ((getreal (strcat "\nZ-координата вершины "
                                                             (rtos count 2 0)
                                                             " <"
                                                             (rtos z 2 4)
                                                             "> : "
                                                             ) ;_ end of strcat
                                                     ) ;_ end of getreal
                                            )
                                           (t z)
                                           ) ;_ end of cond
                                         ) ;_ end of lambda
                                      ) ;_ end of vl-catch-all-apply
                             ) ;_ end of setq
                       ) ;_ end of type
                 'real
                 ) ;_ end of =
              ) ;_ end of and
          (setq coords (vlax-safearray->list
                         (vlax-variant-value (vla-get-coordinates ent))
                         ) ;_ end of vlax-safearray->list
                ) ;_ end of setq
          (vla-put-coordinates
            ent
            (vlax-make-variant
              (vlax-safearray-fill
                (vlax-make-safearray
                  vlax-vbdouble
                  (cons 0 (+ (length coords) 2))
                  ) ;_ end of vlax-make-safearray
                (append coords (list (car pt_next) (cadr pt_next) z_next))
                ) ;_ end of vlax-safearray-fill
              ) ;_ end of vlax-make-variant
            ) ;_ end of vla-put-Coordinates
          (setq pt pt_next
                z  z_next
                ) ;_ end of setq
          ) ;_ end of while
       ) ;_ end of progn
     ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.09.2008, 17:27
#8
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Кулик Алексей aka kpblc, Спасибо... работает так как и планировалось. Сейчас буду внимательно изучать код, как учебное пособие Буду учиться!!!
Mazai вне форума  
 
Непрочитано 22.09.2008, 21:53
#9
Кулик Алексей aka kpblc
Moderator

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


Код можно прилично укоротить, если вводить локальные функции. Мне было просто лениво этим заниматься
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.09.2008, 23:06
#10
Солидворкер
Moderator

Конструктор (машиностроение)
 
Регистрация: 23.10.2006
Россия
Сообщений: 22,997
<phrase 1=


Не по основной теме топика: желательно автору все же определиться, чем создавать 3d полилинию, макросом или матрасом
Солидворкер вне форума  
 
Автор темы   Непрочитано 23.09.2008, 11:01
#11
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Солидворкер, при желании Лисп можно запихнуть и в макрос
А решить сходу данную задачку с помощью простого макроса не получилось
Mazai вне форума  
 
Непрочитано 23.09.2008, 11:20
#12
Солидворкер
Moderator

Конструктор (машиностроение)
 
Регистрация: 23.10.2006
Россия
Сообщений: 22,997
<phrase 1=


Mazai, я вижу, что метод тонких ироничных намеков не сработал...
Орфографическую ошибку в названии темы исправь
Солидворкер вне форума  
 
Непрочитано 23.09.2008, 12:40
#13
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Цитата:
Сообщение от Солидворкер Посмотреть сообщение
Mazai, я вижу, что метод тонких ироничных намеков не сработал...
Орфографическую ошибку в названии темы исправь
Во модераторы вредные пошли
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 23.09.2008, 12:58
#14
Солидворкер
Moderator

Конструктор (машиностроение)
 
Регистрация: 23.10.2006
Россия
Сообщений: 22,997
<phrase 1=


Цитата:
Сообщение от DEM Посмотреть сообщение
Во модераторы вредные пошли
Дело не в вредности, поиск по слову "макрОс" эту тему может не увидеть
Солидворкер вне форума  
 
Непрочитано 23.09.2008, 13:25
#15
Кулик Алексей aka kpblc
Moderator

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


DEM, модераторы пока никуда не пошли Туточки мы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.09.2008, 14:34
#16
Красин


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


почему бы просто не воспользоваться координатными фильтрами?
Код:
[Выделить все]
(defun c:my3dpoly()
  (command "_.3dpoly" ".xy" pause)
  (while (> (getvar "cmdactive") 0)
    (command ".xy" pause)
    )
)
Красин вне форума  
 
Непрочитано 23.09.2008, 14:38
#17
Кулик Алексей aka kpblc
Moderator

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


А координату Z как вводить?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.09.2008, 14:56
#18
Красин


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


координату z - с клавиатуры, правда нет защиты от неправильного ввода, нет значения по умолчанию и т.д., так что этот макрос хуже, чем прога в посте №7, но всё-таки он попроще
Красин вне форума  
 
Автор темы   Непрочитано 23.09.2008, 16:05
#19
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Красин, здорово, я знал что это существует фильтр координат, но не видел как это работает! Меня бы устроил и такой вариант, он дейсвительно проще. Но пользоваться буду всё же из поста #7
Mazai вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание 3d полилинии макрасом

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание полилинии в листе и Подрезка PViewport DANZZ Программирование 17 03.09.2008 12:03
Создание 3D куб из отдельных отрезков...? Автокад Владимир Егорьев AutoCAD 6 02.05.2007 12:33
Создание surface из сплайна или полилинии WinDer AutoCAD 2 02.02.2006 10:17