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

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

Программная вставка динамических блоков

Ответ
Поиск в этой теме
Непрочитано 28.02.2008, 06:58 #1
Программная вставка динамических блоков
wetr
 
инженер
 
Владивосток
Регистрация: 09.08.2006
Сообщений: 1,536

Уважаемые господа программисты! Есть интересная задачка которую не решить штатными средствами АКАД(но если кто знает - подскажите).
Суть:
Рисую динамическими блоками ЖБ узлы. Там и арматурные сетки, арматурные стержни и прочее, прочее. В этих блоках основа - допустим, полярный параметр. Так вот я сейчас вставляю через тул палеттс, и после вставки блок всегда в одинаковом положении. После его приходится выделять его и тягать за "ручки". А хочется чтобы вставлялся указанием двух точек в модели. Ну типа как линию рисуешь. Это было бы СУПЕР!!!
Пример файла прилагается.

Вложения
Тип файла: dwg
DWG 2007
пример.dwg (92.6 Кб, 2134 просмотров)

__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
Просмотров: 10289
 
Непрочитано 28.02.2008, 08:46
#2
Кулик Алексей aka kpblc
Moderator

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


А предупредить о формате файла что мешало?
Посмотри аттач - оно?
Миниатюры
Нажмите на изображение для увеличения
Название: block_set.jpg
Просмотров: 410
Размер:	43.4 Кб
ID:	3799  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2008, 09:37
#3
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А предупредить о формате файла что мешало?
Посмотри аттач - оно?
Сорри, пересохранил в 2000.
Немного не то. Тут получается вставка блока - указываешь точку вставки, а затем угол задаешь.
А я хочу чтобы указанием двух точек вставлялся. Т.е. ситуация:
нарисовал два сечения стержня, а потом надо вставить шпильку(из файла пример.dwg) указанием центров сечений.
Тут наверное надо использовать твою функцию
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=36637zq
только насколько я понял, не получится сделать 1 универсальный лисп, для всех блоков
Вложения
Тип файла: dwg
DWG 2000
пример_2.dwg (74.7 Кб, 1345 просмотров)
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 28.02.2008, 12:00
#4
Кулик Алексей aka kpblc
Moderator

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


Сейчас, наверное, скажу глупость, но... По-моему, такое невозможно.
Все, что приходит в голову, и так достаточно очевидно - установить индексируемые свойства в значения "по умолчанию", повторная вставка по пробелу и т.п.,- и вдобавок все равно не решает поставленной задачи
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2008, 12:41
#5
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


http://dwg.ru/f/showthread.php?t=132...ight=brakeline
пост 36. Здесь Krieger решал подобную задачу...
Я попробовал - именно так как надо! Но для другого блока.
И еще: не работает в 2008 каде, в 2006 и 2007 работает...
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)

Последний раз редактировалось wetr, 28.02.2008 в 12:55.
wetr вне форума  
 
Автор темы   Непрочитано 29.02.2008, 08:30
#6
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Похоже кроме меня эта проблема никого не интересует
Хоть сам начинай лисп изучать...!
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 29.02.2008, 11:05
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Да в принципе понятно как делать-то, но мне не удается твой блок с функцией Крыса объеденить - а в дин. блоки самому лезть - это на долго.

(defun c:shp ( / p1 p1 ang)
(setq p1 (getpoint "Первая точка ")
p2 (getpoint p1 " Вторая ")
ang (angle p1 p2))
(command "_-insert" "Шпилька_2" p1 1 (* (/ ang pi) 180.0))
(_kpblc-block-dyn-change-values (entlast) (list ("Длина*" . (dist p1 p2)) )); не хочет растягивать, по правде еще точку вставки в соответствии с блоком чуть подправить надо - но это не проблема.
)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 29.02.2008, 11:43
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Все въехал:
(запускать командой shp, блок шпильки уже должен быть в рисунке)

Код:
[Выделить все]
(defun c:shp ( / p1 p1 ang tmpos)
(setq 	p1 (getpoint "Первая точка ")
	p2 (getpoint p1 " Вторая ")
	ang (angle p1 p2)
	tmpos (getvar "osmode"))
(setvar "osmode" 0)
(command "_-insert" "Шпилька_2" (polar p1 (+ ang (* pi 1.5)) 21) 1 (* (/ ang pi) 180.0))
(setvar "osmode" tmpos)
(_kpblc-block-dyn-change-values (entlast) (list (cons "Длина*" (distance p1 p2))))
)

;;;;;;;;;;; Благодаря Крысу ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun _kpblc-block-dyn-change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )
                                      ;|
	ent	указатель на вхождение блока
	lst	список вида:
      '((<property> . <value>)
	(<property> . <value>)
	)
*    примеры вызова:
(_kpblc-block-dyn-change-values (car(entsel))'(("dist*" . 162.56) ("ang*" . 5.)))
;; Углы надо задавать в радианах!
(_kpblc-block-dyn-change-values (car (entsel)) (list ("type" . "minimum")))
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (vlax-safearray->list value)
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)

  (vl-catch-all-apply
    '(lambda ()
       (setq
         ent (cond
               (ent)
               (t (car (entsel "\nУкажите вхождение дин.блока <Отмена> : ")))
               ) ;_ end of cond
         ) ;_ end of setq
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (if (and ent
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (strcase (vla-get-objectname ent) t) "acdbblockreference")
           (= (vla-get-isdynamicblock
                (vla-item
                  (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end of vla-get-blocks
                  (vla-get-effectivename ent)
                  ) ;_ end of vla-item
                ) ;_ end of vla-get-isdynamicblock
              :vlax-true
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq
        prop_lst (vlax-safearray->list
                   (vlax-variant-value (vla-getdynamicblockproperties ent))
                   ) ;_ end of vlax-safearray->list
        ) ;_ end of setq
      (foreach item (mapcar '(lambda (a) (cons (strcase (car a)) (cdr a))) lst)
        (if (setq prop
                   (car
                     (vl-remove-if-not
                       '(lambda (x)
                          (wcmatch (strcase (vla-get-propertyname x)) (car item))
                          ) ;_ end of lambda
                       prop_lst
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of car
                  ) ;_ end of setq
          ;; Имя совпало
          (vl-catch-all-apply
            '(lambda ()
               (vla-put-value
                 prop
                 (vlax-make-variant
                   (cdr item)
                   (vlax-variant-type (vla-get-value prop))
                   ) ;_ end of vlax-make-variant
                 ) ;_ end of vla-put-value
               (vla-update ent)
               ) ;_ end of lambda
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Кулик Алексей aka kpblc, 29.02.2008 в 11:51. Причина: Тэги [code] не забывай...
Дима_ вне форума  
 
Автор темы   Непрочитано 29.02.2008, 16:24
#9
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Дима_, кланяюсь в ноженьки!
Все так как надо!
А как мне настроить другие блоки, чтобы тоже их можно было вставлять.
Я попробовал просто поменять имя блока в лиспе - вставляет, только повернуто на 90градусов!
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 29.02.2008, 22:29
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Либо в блоке поверни, либо в строке где имя менял исправь (* (/ ang pi) 180.0) на (+ (* (/ ang pi) 180.0) ХХХ) где ХХХ - количество градусов на которое надо повернуть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 02.03.2008, 07:03
#11
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Что-то у меня ручки кривые.
Повернул в редакторе блоков - стало вставлять но со смещением...
Переделал лисп как ты говоришь - вставляет указанием 2 точек, а затем просит указать угол, вставленному блоку...
Попробовал переделать лисп под третий блок(изменил имя блока в лиспе) - так автокад на меня матюгнулся и вылетел...
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)

Последний раз редактировалось wetr, 02.03.2008 в 15:32.
wetr вне форума  
 
Непрочитано 02.03.2008, 14:05
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В общем надо блоки под один стандарт подогнать (можно конечно и лиспы под каждый блок свои писать - но по моему это не правильно) - блок по умолчанию должен быть горизонтальным, точка вставки совпадает с левой ручкой растяжения (ну либо ручки вообще нет), тогда никаких проблем - (command "_-insert" "Имя_блока" p1 1 (* (/ ang pi) 180.0)), растягиваемый параметр - "Длина".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.03.2008, 03:11
#13
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Вроде все сделал, но акад вылетает с ошибкой...
Вложения
Тип файла: rar 1.rar (26.7 Кб, 99 просмотров)
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 14.03.2008, 11:57
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ну в общем так - лисп я немного переделал - можешь добавлять любые блоки сделанные подобным образом (с параметром), а акад вылетает судя по всему из-за командного метода вставки блока, то есть программа вместо параметров начинает пытаться изменить еще не вставленный блок - к сожалению, как это исправить я слабо представляю, по поводу совмещения точки вставки и ручек - смотри приложенный dwg - то что указанно стрелками надо объединить и тогда все будет правильно, да обрати внимание - немного исправил имена блоков (назвал их попроще иначе выборка может ошибаться - это на случай если новые решишь добавлять).
Вложения
Тип файла: rar блок.rar (37.8 Кб, 124 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.03.2008, 20:00
#15
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А забыл здесь исправленно, чтобы в любой ПСК работал.
Вложения
Тип файла: lsp shp.lsp (4.1 Кб, 140 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.03.2008, 13:15
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я извиняюсь, за беспокойство, но у меня тоже есть сходная проблема с вставкой блоков. Может и вас заинтересует.
Я и еще два товарища, сидящих в разных уголках страны, а то и в разных странах одновременно делаем одну 3D модель. Я делаю одну часть, второй товарищ - другую и третий свою естественно. Но видеть мы должны все элементы модели, поскольку не охота наехать своими элементами на чужие.
Связь мы поддерживаем через СКАЙП. У нас у троих в модели абсолютно одинаковые базы блоков. Не хватает только сведений, какие блоки куда должны быть вставлены и какие свойства у них должны быть установлены (если они динамические).
Блоки, которые я вставляю автоматически помечаются в атрибуте моим именем их блоки имеют свое значение этого атрибута.
Периодически я нажимаю кнопку типа регенерации и макрос автоматически создает ini файл, в котором описаны все мои вхождения блоков, а чужие ini файлы с подобным описанием с начала проверяет на предмет наличия этих блоков в самой модели и если они там есть, то либо перемещает элемент по новым координатам, либо оставляет на месте. Если такого элемента нет, то он его вставляет из базы блоков.

Забыл сказать. Имя блока *Unnn дублируется во второй атрибут, поскольку на другой машине оно будет другим.

Передать ini файл - секунда и у тебя построен новый кусок модели. Всю модель туда-сюда не погоняешь. По таким ini файлам можно модель заново собирать в новом файле. Правда его базу блоков надо будет заново загружать библиотекой. С Kpblc-ом мы такую штуку на внешние ссылки делали, но не доделали.

Кто хочет поучаствовать в этой затее?
Supermax вне форума  
 
Автор темы   Непрочитано 12.12.2008, 07:41
#17
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Все те же на манеже
Задача та же - вставка блока КМ-ЭЛЕМЕНТ (vcBlockPos_KM-1) а-ля рисование элементов.
Дима_, твой последний вариант лиспа сделанный с помощью entmakex, вообще не видит атрибуты у блока. Т.е. когда вставляем блок "шпилька" все ОК! Но при вставке блока "vcBlockPos_KM-1" все атрибуты просто отсекаются. Такое ощещение, что entmakex создает блок, а не вставляет его вхождение.
Кстати это имя блока "vcBlockPos_KM-1" - уникально. Его менять нежелательно, т.к. на него завязан VetCAD (для автоматического создания спецификаций). Но если испльзовать такое сложное имя блока, то автокад вылетает.
Первый вариант лиспа, где вставка с помощью command, работает нормально если вставка значений атрибутов по умолчанию (ATTREQ=0). Если ATTREQ=1, то кад вылетает с ошибкой. Т.е. опять атрибуты...
Как решить эти проблемы?
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 12.12.2008, 12:21
#18
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Толком я не понял что у тебя отсекает но в чем там проблема сказать могу ...
В варианте Дима_ выбор вставленного блока для модификации дин свойств производится функцией
Цитата:
(entlast)
а если у блока есть атрибуты то последним примитивом является атрибут а не блок. Поэтому на функцию крыса передается ename атрибута а не входжения.
Чтобы это побороть нужно переписать лисп с учетом этой темы, обрати внимание что там тоже было через
Цитата:
(entlast)
- я внизу привел поправленный код.
Вообщем задача у тебя мне не очень понятна, но попробуй вдруг заработает:
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item sl_listent)
  (repeat (setq tab  nil
                item (sslength value)
                ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
    ) ;_ end repeat
  )

;;;* Mark data base to allow KB:catch.
;;;* http://www.theswamp.org/index.php?topic=15863.0
(defun mip:mark ( )
 (progn (entmake '((0 . "point") (10 0.0 0.0 0.0)))
       (setq *mip:mark (entlast))(entdel *mip:mark))
  (princ))
;;;* returns selection set of entities since last mip:mark.
(defun mip:get-last-ss (/ ss tmp val)
(setq val (getvar "cmdecho"))(setvar "cmdecho" 0)
(if *mip:mark (progn (setq ss (ssadd))
 (while (setq *mip:mark (entnext *mip:mark))(ssadd *mip:mark ss))
 (command "._select" ss "")(setq tmp ss ss nil));_progn
 (alert "*mip:mark not set. \n run (mip:mark) before mip:get-last-ss."));_if
 (setvar "cmdecho" val) tmp)

(defun c:shp ( / p1 p1 ang tmpos)
(setq 	p1 (getpoint "Первая точка ")
	p2 (getpoint p1 " Вторая ")
	ang (angle p1 p2)
	tmpos (getvar "osmode"))
(setvar "osmode" 0)
  (mip:mark)

     

	     

(command "_-insert" "Шпилька_2" (polar p1 (+ ang (* pi 1.5)) 21) 1 (* (/ ang pi) 180.0))
(setvar "osmode" tmpos)
    (setq sl_listent (_dwgru-conv-pickset-to-list (mip:get-last-ss)))

   (foreach ent sl_listent
     
(_kpblc-block-dyn-change-values ent (list (cons "Длина*" (distance p1 p2))))
  )
)

;;;;;;;;;;; Благодаря Крысу ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun _kpblc-block-dyn-change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )
                                      ;|
	ent	указатель на вхождение блока
	lst	список вида:
      '((<property> . <value>)
	(<property> . <value>)
	)
*    примеры вызова:
(_kpblc-block-dyn-change-values (car(entsel))'(("dist*" . 162.56) ("ang*" . 5.)))
;; Углы надо задавать в радианах!
(_kpblc-block-dyn-change-values (car (entsel)) (list ("type" . "minimum")))
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (vlax-safearray->list value)
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)

  (vl-catch-all-apply
    '(lambda ()
       (setq
         ent (cond
               (ent)
               (t (car (entsel "\nУкажите вхождение дин.блока <Отмена> : ")))
               ) ;_ end of cond
         ) ;_ end of setq
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (if (and ent
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (strcase (vla-get-objectname ent) t) "acdbblockreference")
           (= (vla-get-isdynamicblock
                (vla-item
                  (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end of vla-get-blocks
                  (vla-get-effectivename ent)
                  ) ;_ end of vla-item
                ) ;_ end of vla-get-isdynamicblock
              :vlax-true
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq
        prop_lst (vlax-safearray->list
                   (vlax-variant-value (vla-getdynamicblockproperties ent))
                   ) ;_ end of vlax-safearray->list
        ) ;_ end of setq
      (foreach item (mapcar '(lambda (a) (cons (strcase (car a)) (cdr a))) lst)
        (if (setq prop
                   (car
                     (vl-remove-if-not
                       '(lambda (x)
                          (wcmatch (strcase (vla-get-propertyname x)) (car item))
                          ) ;_ end of lambda
                       prop_lst
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of car
                  ) ;_ end of setq
          ;; Имя совпало
          (vl-catch-all-apply
            '(lambda ()
               (vla-put-value
                 prop
                 (vlax-make-variant
                   (cdr item)
                   (vlax-variant-type (vla-get-value prop))
                   ) ;_ end of vlax-make-variant
                 ) ;_ end of vla-put-value
               (vla-update ent)
               ) ;_ end of lambda
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Sleekka вне форума  
 
Автор темы   Непрочитано 18.12.2008, 13:10
#19
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Задачу вставки блока КМ-ЭЛЕМЕНТ вроде решить удалось. Не все гладко, но уже похоже на то что нужно.
Код:
[Выделить все]
; Программа вставки динамического блока "vcBlockPos_KM-1" (КМ-ЭЛЕМЕНТ)
; для работы c VetCAD++ ( v.1.2. от 21 января 2009)
;;;;;;;;;;;;;;; Соавторы;;;;;;;;;;;;;;;
; Slade - автор динамического блока
; Дима_ - основной код программы
; Кулик Алексей aka kpblc - функция извлечения данных динамических блоков
; Vitaliy Beli aka VetalBY - функция извлечения масштаба VetCAD
; Сергей Морозов aka Krieger - пример действующего кода для вставки блока "Kr_BreakWipeout" 
; Васюк Влад aka WETR - модернизация блока, сбор кода в кучу ;)
(vl-load-com)
(defun remember_wetr ()
  (setq    tmpos_wetr (getvar "osmode")
           tmpatt_wetr (getvar "attreq")
           tmplayer_wetr(getvar "clayer")
           cmd_wetr (getvar "cmdecho")
  )
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
   
  (setq older_wetr *error*)
  (setq *error* wetr-error)
  (princ)
)

(defun recover_wetr ()
    (setq  *error* older_wetr)

    (setvar "osmode" tmpos_wetr)
    (setvar "attreq" tmpatt_wetr)
    (setvar "clayer" tmplayer_wetr)    
    (setvar "cmdecho" cmd_wetr)

    (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
    (princ)
)

;;;Обработчик ошибок
(defun wetr-error (msg)
    (recover_wetr)
    (princ)
)

(defun c:KM_VC ( / p1 p2 ang )

  (remember_wetr)
  
  (setq 	p1 (getpoint "\nПервая точка <Выход>: ")
	        p2 (getpoint p1 " \nВторая <Выход>: ")
             	ang (angle p1 p2)
        	
    );_end of setq
  (setvar "CMDECHO" 0)
  (setvar "osmode" 0)
  (setvar "attreq" 0)
;;;  (command "_.layer" "_M" "_Металл" "_C" "150" "" "_LW" "0.5" "" "");Создаем слой с именем _Металл цветом 150 и толщиной 0.5
  (if (not (tblobjname "block" "vcBlockPos_KM-1"))
	(progn
	  	(setq path (findfile "Drawing_vcBlockPos_KM-1.dwg"))
  		(command "_-insert" path)
  		(command)
  		(vl-cmdf "_-purge" "_blocks" "Drawing_vcBlockPos_KM-1" "_n")
	  	(princ)
	  );progn
	);if
  (command "_-insert" "vcBlockPos_KM-1" (polar p1 (+ ang (* pi 1.5)) 0) (get_vetcad_scale) (* (/ ang pi) 180.0))
(_kpblc-block-dyn-change-values (entlast) (list (cons "Длина*" (distance p1 p2)))
)
    (recover_wetr);;;уходим
  (setq pickset (ssadd))                     ;
  (sssetfirst nil (ssadd (entlast) pickset)) ; Закоментируйте эти строки если хотите, 
  (command "pos_vc" )                        ; чтобы окно установки сечения не появлялось
  (princ)
);_end of defun

; Функция извлечения масштаба VetCAD++ от VetalBY
(defun get_vetcad_scale ( / strScale vetscale)
(if (= (getvar "TILEMODE") 1) (setq strScale "Scale") (setq strScale "PScale"))
  
 (if (not (setq vetscale (vetcad_data_get++ strScale "D" "VETCAD_DICT" "General" nil)));;глобальный масштаб
    (progn
     (princ "\nНе установлен глобальный масштабный коэффициент. Принимаем равным 1")
     (setq vetscale 1)
    )
  )
vetscale
)
;;;;;;;;;;; Благодаря Крысу ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun _kpblc-block-dyn-change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )
                                      ;|
	ent	указатель на вхождение блока
	lst	список вида:
      '((<property> . <value>)
	(<property> . <value>)
	)
*    примеры вызова:
(_kpblc-block-dyn-change-values (car(entsel))'(("dist*" . 162.56) ("ang*" . 5.)))
;; Углы надо задавать в радианах!
(_kpblc-block-dyn-change-values (car (entsel)) (list ("type" . "minimum")))
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (vlax-safearray->list value)
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)

  (vl-catch-all-apply
    '(lambda ()
       (setq
         ent (cond
               (ent)
               (t (car (entsel "\nУкажите вхождение дин.блока <Отмена> : ")))
               ) ;_ end of cond
         ) ;_ end of setq
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (if (and ent
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (strcase (vla-get-objectname ent) t) "acdbblockreference")
           (= (vla-get-isdynamicblock
                (vla-item
                  (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end of vla-get-blocks
                  (vla-get-effectivename ent)
                  ) ;_ end of vla-item
                ) ;_ end of vla-get-isdynamicblock
              :vlax-true
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq
        prop_lst (vlax-safearray->list
                   (vlax-variant-value (vla-getdynamicblockproperties ent))
                   ) ;_ end of vlax-safearray->list
        ) ;_ end of setq
      (foreach item (mapcar '(lambda (a) (cons (strcase (car a)) (cdr a))) lst)
        (if (setq prop
                   (car
                     (vl-remove-if-not
                       '(lambda (x)
                          (wcmatch (strcase (vla-get-propertyname x)) (car item))
                          ) ;_ end of lambda
                       prop_lst
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of car
                  ) ;_ end of setq
          ;; Имя совпало
          (vl-catch-all-apply
            '(lambda ()
               (vla-put-value
                 prop
                 (vlax-make-variant
                   (cdr item)
                   (vlax-variant-type (vla-get-value prop))
                   ) ;_ end of vlax-make-variant
                 ) ;_ end of vla-put-value
               (vla-update ent)
               ) ;_ end of lambda
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
В архиве лисп и файл с блоком для VetCADa
Вложения
Тип файла: rar KM for VetCAD.rar (19.0 Кб, 135 просмотров)
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)

Последний раз редактировалось wetr, 05.02.2009 в 07:47.
wetr вне форума  
 
Непрочитано 04.01.2009, 11:46
#20
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


У меня возникла несколько иная ситуация, но по той же тематике. Имею блок (не динамический). Блок находится в тул палетке. Требуется вставить его в чертеж так, чтобы затем указывались сперва угол вставки а затем и scale блока (причем scale не вводится в ком строке а указывается реал тайм, то есть точками на чертеже). Если объяснил не очень ясно, то смотрите аттач.
Вложения
Тип файла: dwg
DWG 2004
Пояснения.dwg (41.4 Кб, 1288 просмотров)
__________________
Блог
Red Nova вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программная вставка динамических блоков



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Руководство по созданию динамических блоков tanushka_ch Динамические блоки 20 25.11.2015 20:46
подсчет динамических блоков AAI Программирование 37 25.06.2012 15:05
Проблема вставки Динамических блоков Владимир М Программирование 11 12.09.2007 15:42
Библиотека динамических блоков Коробейников Алексей Динамические блоки 2 05.04.2005 16:08