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

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

Команда _pline и список точек переменной длины

Ответ
Поиск в этой теме
Непрочитано 15.01.2007, 13:54 #1
Команда _pline и список точек переменной длины
Fogel
 
люблю мастерить
 
Челябинск
Регистрация: 21.01.2005
Сообщений: 10,332

У меня возникла проблемка: есть список координат точек (получен в предшствующей части). По этому списку надо отстроить замкнутую область. Написать цикл с использованием команды _pline и редактированием полилинии конечно не проблема, но закрадываются сомнения что можно проще. В общем как наиболее рационально сделать этот участок? Спиок заранее неизвестной длины. Нужно для отстройки трехмерной карты города - там все углы зданий заданы координатами, а углов бывает и по многу
Просмотров: 6572
 
Непрочитано 15.01.2007, 14:45
#2
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Если на VBA - то проще простого. Только одно уточнение: _pline строит двухмерную полилинию.
Список координат нужно перевести в одномерный массив: X 1-й вершины, Y 1-й вершины, X 2, Y 2.... X n, Y n.
А потом этот массив присвоить объекту AcadLWPolyline
Полилиния строится так:
Код:
[Выделить все]
Sub Example_AddPolyline()
    ' This example creates a polyline in model space.
    
    Dim plineObj As AcadPolyline
    Dim points(0 To 14) As Double
    
    ' Define the 2D polyline points
    points(0) = 1: points(1) = 1: points(2) = 0
    points(3) = 1: points(4) = 2: points(5) = 0
    points(6) = 2: points(7) = 2: points(8) = 0
    points(9) = 3: points(10) = 2: points(11) = 0
    points(12) = 4: points(13) = 4: points(14) = 0
        
    ' Create a lightweight Polyline object in model space
    Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)
    ZoomAll
    
End Sub
P.S. Массив points нужно создавать, ессно, динамическим.
Код:
[Выделить все]
Dim points() As Double
'.....
ReDim Preserve points(n)
где n - (число вершин*2)-1

Управление замкутостью/разомнкнутостью полилинии - через свойство Closed

Код:
[Выделить все]
plineObj.Closed = True 'Замкнута
или
Код:
[Выделить все]
plineObj.Closed = False 'Не замкнута
Если возникнут вопросы, могу рассказать подробнее.
den001 вне форума  
 
Непрочитано 15.01.2007, 15:08 Re: Команда _pline и список точек переменной длины
#3
ShaggyDoc

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


Цитата:
Сообщение от Fogel
У меня возникла проблемка: есть список координат точек (получен в предшствующей части). По этому списку надо отстроить замкнутую область. Написать цикл с использованием команды _pline и редактированием полилинии конечно не проблема, но закрадываются сомнения что можно проще. В общем как наиболее рационально сделать этот участок? Спиок заранее неизвестной длины. Нужно для отстройки трехмерной карты города - там все углы зданий заданы координатами, а углов бывает и по многу
Надо написать специальную функцию и использовать всегда. С command проще всего, но "не гламурно". Можно на основе entmake. А можно и объектными методами.

Вот так строятся все полилинии в ruCAD

Код:
[Выделить все]
(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
Это для примера, напрямую не воспользуешься, использованы несколько библиотечных функций. Да и строится LwPolyline, то есть двухмерная. Другие варианты быстро подкинут.
ShaggyDoc вне форума  
 
Непрочитано 15.01.2007, 22:28
#4
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Не помню где я это нашел
Надеюсь поможет

Код:
[Выделить все]
;;  minimum to entmake lwpolyline - by Michael Puckett
;;  arguments: a point list, flag for close and pline width
(defun entmakelwpline (plist flag width)
(entmake
(append
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(8 . "0")
'(100 . "AcDbPolyline")
(cons 90 (length plist)) ;number of verticies
(cons 70 flag)
(cons 43 width) ;constant width
)
(mapcar '(lambda (x) (cons 10 x)) plist)
)
)
)
; Call for closed polyline with zero width
(entmakelwpline plist T 0.0)
~'J'~
fixo вне форума  
 
Непрочитано 16.01.2007, 08:50
#5
ShaggyDoc

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


Тогда еще вариант - на entmake, с возможностью создавать трехмерную полилинию. Здесь, вроде бы, нет никаких нестандартных функций
Код:
[Выделить все]
 
(defun ru-pline-entmake (points is_closed is_3d width lineweight / elst entl)
;;; (ru-pline-entmake (список_вершин) флаг_замкнутости
;;; флаг_делать_3М_ПЛИНИЮ)
;;; возвращает имя примитива - полилинии или NIL, если что-то не
;;; вышло.
  ;|
(ru-pline-entmake (list (list 0 0) (list 1000 100) (list 1000 2000) (list 0 2000)) nil nil  0 50)

|;
  (if is_3d
    (progn
      (setq entl
             (list
               '(0 . "POLYLINE")
               '(100 . "AcDbEntity")
               '(100 . "AcDb3dPolyline")
               '(66 . 1)
               '(10 0.0 0.0 0.0)
               (cons 70
                     (logior 8
                             (if is_closed
                               1
                               0
                             ) ;_ end of if
                             (if (= 1 (getvar "PLINEGEN"))
                               128
                               0
                             ) ;_ end of if
                     ) ;_ end of logior
               ) ;_ end of cons
             ) ;_ end of list
      ) ;_ end of setq
      (if (entmake entl)
        (progn
          (foreach v points
              (setq entl
                     (list
                       '(0 . "VERTEX")
                       '(100 . "AcDbEntity")
                       '(100 . "AcDbVertex")
                       '(100 . "AcDb3dPolylineVertex")
                       (append '(10) v)
                       '(70 . 32)
                     ) ;_ end of list
              ) ;_ end of setq
              (entmake entl)
          ) ;_ end of foreach
          (if (entmake '((0 . "SEQEND") (100 . "AcDbEntity")))
            (entupd (entlast))
            nil
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
    ) ;_ end of progn
    (progn
      (setq elst (append
                   (list
                     '(0 . "LWPOLYLINE")
                     '(100 . "AcDbEntity")
                     '(100 . "AcDbPolyline")
                                        ;(cons 8 (getvar "CLAYER"))
                     (cons 90 (length points))
                     (cons 43 width)
                     (cons 370 lineweight)
                     (cons 70
                           (logior (if is_closed
                                     1
                                     0
                                   ) ;_ end of if
                                   (if (= 1 (getvar "PLINEGEN"))
                                     128
                                     0
                                   ) ;_ end of if
                           ) ;_ end of logand
                     )                  ; _ end of cons;;;
                   ) ;_ end of list
                   (mapcar (function (lambda (p)
                                       (list 10 (car p) (cadr p))
                                     ) ;_ end of lambda
                           ) ;_ end of function
                           points
                   ) ;_ end of mapcar
                 ) ;_ end of append
      ) ;_ end of setq
      (if (entmake elst)
        (entupd (entlast))
        nil
      ) ;_ end of if
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
Ждем вариант с командой :roll:
ShaggyDoc вне форума  
 
Непрочитано 17.01.2007, 16:00
#6
Елпанов Евгений

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


Цитата:
Сообщение от Fatty
Не помню где я это нашел
Надеюсь поможет

..............

~'J'~
Puckett, Michael
Date: Oct/03/99 - 01:49 (MSD)
Елпанов Евгений вне форума  
 
Непрочитано 17.01.2007, 16:47
#7
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,290


Пусть l1 - список точек
Код:
[Выделить все]
(apply 'command (append (list "_pline") l1 (list "_close")))
Pilot вне форума  
 
Непрочитано 17.01.2007, 21:47
#8
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от Fatty
Не помню где я это нашел
Надеюсь поможет

..............

~'J'~
Puckett, Michael
Date: Oct/03/99 - 01:49 (MSD)
Спасибо

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 19.01.2007, 14:08
#9
Fogel

люблю мастерить
 
Регистрация: 21.01.2005
Челябинск
Сообщений: 10,332


Господа, спасибо за помощь Конструкцию на ЛИСПе я конечно соорудил сам с использование цикла по условию, просто надеялся что все это можно решить гораздо проще. Поэтому вариант Pilot'а мне нравится больше всех. Опробую.
Извините что спросил и не заглядывал три дня, но обрабатывал базу данных как раз для этого софта - полное описание вершин всех зданий в городе :wink:
Fogel вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Команда _pline и список точек переменной длины