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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать объект REGIION без применения Command?

Как создать объект REGIION без применения Command?

Ответ
Поиск в этой теме
Непрочитано 23.04.2009, 03:44 #1
Как создать объект REGIION без применения Command?
KAI
 
геологоразведка, строительство
 
Магадан
Регистрация: 14.10.2003
Сообщений: 311

Господа!
При создании объектов Region при помощи функции Command в текстовое окно выводятся не нужные собщения:
1 loop extracted.
1 Region created.
Мало того, что они забивают текстовое окно (если создается много регионов), но ведь еще и время тратится на вывод текста.
Поскольку я совершенно слаб в vla-Add... прошу помощи LISP программистов.
Требуется функция, где на входе список точек или entname полилинии, на выходе - entname созданного региона.
Вчера полдня рылся в интернете (в том числе и в dwg.ru), но разжеванного решения для регионов не нашел.
__________________
Лень - великий двигатель прогресса!
Просмотров: 2826
 
Непрочитано 23.04.2009, 07:36
#2
ShaggyDoc

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


Вот некоторые примеры:
1. Создание региона из одного объекта:
Код:
[Выделить все]
(defun ru-obj-make-region-from-obj (obj / vla_arr)
  (setq vla_arr (vlax-make-safearray vlax-vbobject '(0 . 0))
  ) 
  (vlax-safearray-put-element vla_arr 0 obj)
  (ru-obj-make-region-from-vla-array vla_arr)
)
Внутри используется 2:
Код:
[Выделить все]
(defun ru-obj-make-region-from-vla-array (vla_arr)
  ;; предотвратить ошибку
  (ru-error-catch
    (function (lambda ()
                (car
                  (vlax-safearray->list
                    (vlax-variant-value
                      (vla-addregion
                        (ru-obj-active-space)
                        vla_arr
                      ) ;_ end of vla-addregion
                    ) ;_ end of vlax-variant-value
                  ) ;_ end of vlax-safearray->list
                ) ;_ end of car
              ) ;_ end of lambda
    ) ;_ end of function
    (function (lambda (x)
                (princ (strcat "\nОШИБКА СОЗДАНИЯ REGION (возможно, контур имеет недопустимую форму): " x))
                nil
              ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of ru-error-catch                
)
Где взять ru-error-catch ты знаешь (помнишь - "600 руб в Магадане"). Или можно заменить на полный аналог dwgru-error-catch( в dwgru-lisp-lib где-то здесь)

В результате функция 1 вернет объект региона, который легко превратить в примитив. Если надо.

Создать объект для передачи аргументом в 1 можно, например, так (полилиния):

Код:
[Выделить все]
(defun ru-pline-add (points is_closed width lineweight ltype / obj)
 ;|
Аргументы:
points - список координат точек
is_closed - признак замкнутости T|nil
width  - ширина или NIL
lineweight  - вес линии 
ltype - имя типа линии или nil
Пример вызова:
(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
Возвращает созданный объект или NIL при ошибке. Во всех функциях программа не прервется при ошибках, но выдаст сообщение. Все используемые ru-xxx у тебя есть (окупятся 600 руб) или очевидны.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 23.04.2009, 09:27
#3
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


С.А.!
Мое спасибо не поддается lispописанию! Я счастлив!

Правда в функции создания полилинии в ruCAD не нашел функции ru-lw-set-for-obj, заменил на стандартную vla-put-lineweight

p.s. И как это я прежде чем задавать вопрос не полазил по ruCAD?
__________________
Лень - великий двигатель прогресса!
KAI вне форума  
 
Непрочитано 23.04.2009, 09:59
#4
ShaggyDoc

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


Код:
[Выделить все]
(defun ru-lw-set-for-obj (obj lineweight)
  (if lineweight

    (vla-put-lineweight
      obj
      (if (= lineweight 0)
        (ru-lw-0)
        lineweight
      ) ;_ end of if
    ) ;_ end of vla-put-lineweight
  ) ;_ end of if

)
ru-lw-set-for-obj дополнительно проверяет варинт задания 0. Если так задано, то подставится не 0 (это бывает слишком тонко), а предпочитаемый конкретным пользователем. Задается в INI-файле, по умолчанию - LWDEFAULT.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать объект REGIION без применения Command?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение дуг, линий в единый объект, Как объединить? Vladimir.P AutoCAD 41 25.01.2015 08:03
как создавать в ADT 2008 объект в 2 этажа dasus Вертикальные решения на базе AutoCAD 6 09.06.2008 22:48
Как найти определенный объект в чертеже? Shoorup Программирование 7 27.03.2008 09:11
Как создать блок не командными методами Дима_ Программирование 9 20.03.2008 12:31
Как полностью перенести картику в чертёж без ссылок? Brulik3000 AutoCAD 17 11.05.2007 15:49