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

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

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

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

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

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

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

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


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

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,537
<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,450


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

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,537
<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,537
<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,537
<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,537
<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,537
<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 Кб, 141 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 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,537
<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,537
<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 вне форума  
 
Непрочитано 04.01.2009, 12:51
#21
Дима_

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


Твой пример решается классическим динамическим блоком.
Вложения
Тип файла: dwg
DWG 2007
Пояснения.dwg (70.5 Кб, 898 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.01.2009, 15:24
#22
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Red Nova Посмотреть сообщение
У меня возникла несколько иная ситуация, но по той же тематике. Имею блок (не динамический). Блок находится в тул палетке. Требуется вставить его в чертеж так, чтобы затем указывались сперва угол вставки а затем и scale блока (причем scale не вводится в ком строке а указывается реал тайм, то есть точками на чертеже). Если объяснил не очень ясно, то смотрите аттач.
Элементарно решается при помощи простого макроса:
Код:
[Выделить все]
^C^C_-insert;1;_Rotate;-45;_Scale;$M=$(if,$(getvar,dimscale),$(*,$(getvar,dimscale),5),5);\_rotate;_l;;@;0;_rotate;_l;;@;\_scale;_p;;@;_r;$M=$(if,$(getvar,dimscale),$(*,$(getvar,dimscale),5),5);$M=$(if,$(getvar,dimscale),$(*,$(getvar,dimscale),5),5);_scale;_p;;@;_r;$M=$(if,$(getvar,dimscale),$(*,$(getvar,dimscale),5),5);
Рабоать вот с этим блоком. Вставка реагирует на переменную Dimscale, т.е. если dimscale = 1, то радиус этого полукруга будет равен 5, если 3, то 15 (ну это канечно если обрывать визуальную указку масштаба). В "_units" должны быть установлены мм (ты в инчах работаешь?). Работает и в AutoCAD LT.
Вложения
Тип файла: dwg
DWG 2004
BlockInsert.dwg (48.0 Кб, 878 просмотров)
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 04.01.2009, 21:49
#23
Red Nova

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


Дима_,
Нужно чтобы запросы на поворот и размер выходили тут же, а дин. блок нужно сперва вставить, а потом тянуть его за гриспы, нудно...
Krieger,
Спасибо, Почти работает. Только вот проблема возникла. Я скопировал файл в дирректорию прописанную в акаде, переименовал его в 1.dwg (так требует -insert). Но Блок вставляется только если в файле уже вставляли блок под именем "1", иначе пишет
Код:
[Выделить все]
Command: _-insert
Enter block name or [?]: 1
Block 1 references itself
*Invalid*
Кроме того напрягает зависимость от dimscale, так как пользуюсь CПДС ...
(Тока чур не надо про его вредоносность )
Твой макрос натолкнул меня на создание вот какого лиспа. Блок сварного катета можно создавать прямо в файле, и потом вставлять его куда угодно, таким образом можно избежать трудностей возникших у меня. Когда-то VVA дал мне пару похожих уроков. Щас попробую навоять.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.01.2009, 22:51
#24
Red Nova

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


Блин. Забыл самую элементарную вешь. Как создать набор объектов в лиспе?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 04.01.2009, 23:21
#25
Кулик Алексей aka kpblc
Moderator

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


ssget тебе в помощь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.01.2009, 23:47
#26
Red Nova

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


Кулик Алексей aka kpblc,
Спасибо, пока ждал ответа сам докопался. правда побился об стенку прилично, В результате сделал с ssadd.
Вот какой лиспик получился.
Код:
[Выделить все]
(defun C:weld (/ selection1 pt0 OldLAY)

(vl-load-com)
(vla-StartUndoMark  (vla-get-activedocument (vlax-get-acad-object)))
(defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if OldLAY (setvar "clayer" OldLAY)) 
 ) 

 (setq OldLAY (getvar "clayer"))

  (if (not (tblsearch "block" "Сварной катет"))
   (progn
     (command "_-layer" "_set" "0" "")
     (setq selection1 (ssadd)) 
     (command "_pline" "0,0" "1,0" "a" "s" "0.7071,0.7071" "0,1" "l" "c")
     (ssadd (entlast) selection1)
     (command "_hatch" "s" "l" "p" "s" "")
     (ssadd (entlast) selection1)
     (command "_chprop" selection1 "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Сварной катет" "0,0" selection1 "")
   )
  )
  (setq pt0 (getpoint)) 
  (command "_-insert" "Сварной катет" "s" pt0 pause pt0 pause "")

 (setvar "clayer" OldLAY)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))  

)
Теперь надо подумать как обточить покрасивше.
1. Напомните плиз что написать вмето (setq pt0 (getpoint)) чтобы выходил запрос "Укажите точку вставки"
2. Еще надо бы подумать как сделать так, чтобы когда указываешь размер блока сам блок уже висел на курсоре.
__________________
Блог

Последний раз редактировалось Red Nova, 05.01.2009 в 00:39.
Red Nova вне форума  
 
Непрочитано 05.01.2009, 00:28
#27
Red Nova

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


Блок на курсор вроде как повесил, хотя не сказать что это идеальный вариант, ведь при указании курсором размера блок всегда занимает одно положение а курсор иногда нужно направить в другую строну. Вот если бы был вариант чтобы при скейле блок еще и поворачивался с курсором было бы супер. А пока получилось вот так
Код:
[Выделить все]
(defun C:weld2 (/ selection1 pt0 OldLAY)

(vl-load-com)
(vla-StartUndoMark  (vla-get-activedocument (vlax-get-acad-object)))
(defun *error*(msg) 
 (princ msg) ; Отменено пользователем
 (if OldLAY (setvar "clayer" OldLAY)) 
 );end of defune 

 (setq OldLAY (getvar "clayer"))

  (if (not (tblsearch "block" "Сварной катет"))
   (progn
     (command "_-layer" "_set" "0" "")
     (setq selection1 (ssadd)) 
     (command "_pline" "0,0" "1,0" "a" "s" "0.7071,0.7071" "0,1" "l" "c")
     (ssadd (entlast) selection1)
     (command "_hatch" "s" "l" "p" "s" "")
     (ssadd (entlast) selection1)
     (command "_chprop" selection1 "" "_color" "_byblock" "_ltype" "_byblock" "_lweight" "_byblock" "")
     (command "_-block" "Сварной катет" "0,0" selection1 "")
   );end of progn
  );end of if
  (setq pt0 (getpoint)) 
  (command "_-insert" "Сварной катет" "0,0" "" "" "")
  (command "_move" "_l" "" "0,0" pt0)
  (command "_scale" "_p" "" pt0 pause)
  (command "_rotate" "_p" "" pt0 pause)

 (setvar "clayer" OldLAY)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))  

);end of defune
__________________
Блог

Последний раз редактировалось Red Nova, 05.01.2009 в 00:39.
Red Nova вне форума  
 
Непрочитано 05.01.2009, 03:02
#28
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?t=11905
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.01.2009, 09:54
#29
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Спасибо, Почти работает. Только вот проблема возникла. Я скопировал файл в дирректорию прописанную в акаде, переименовал его в 1.dwg (так требует -insert). Но Блок вставляется только если в файле уже вставляли блок под именем "1", иначе пишет
Код:
[Выделить все]
Command: _-insert
Enter block name or [?]: 1
Block 1 references itself
*Invalid*
Для этого надо в пустом файле вставить этот блок в точку 0,0,0 с углом поворота 0, потом его расчленить. Очистить файл от этого блока. Сохранить файл под именем "1.dwg", кинуть файл в путь поддержки када. Тогда команда "_-insert" будет вставлять весь этот файл как блок "1".

Цитата:
Кроме того напрягает зависимость от dimscale, так как пользуюсь CПДС ...
Ну и пользуйся на здоровье, т.к. при смене масштаба в СПДС меняется и dimscale. Да и что мешает убрать эту зависимость? Кстати, в СПДС ведь есть вставка катета?

Цитата:
Твой макрос натолкнул меня на создание вот какого лиспа. Блок сварного катета можно создавать прямо в файле, и потом вставлять его куда угодно, таким образом можно избежать трудностей возникших у меня.
Все уже сделано до нас...

http://dwg.ru/dnl/2527

Кстати, обновлю сегодня.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 05.01.2009, 11:20
#30
Red Nova

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


Krieger,
Цитата:
Кстати, в СПДС ведь есть вставка катета?
Хочу получить округлый шов.
Кулик Алексей aka kpblc, Почитал, но быстро заблудился. Дай пожалуйста ссылку на конкретный пост.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 05.01.2009, 15:52
#31
Red Nova

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


Krieger,
Покопался в твоей программе. Понравилося твой алгоритм вставки катета шва. Хотелось бы приспособить его к моему блоку. Я не имею понятия о расширении vlx, если есть в простом lsp выложи плиз.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 05.01.2009, 16:17
#32
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Krieger,
Покопался в твоей программе. Понравилося твой алгоритм вставки катета шва. Хотелось бы приспособить его к моему блоку. Я не имею понятия о расширении vlx, если есть в простом lsp выложи плиз.
VLX это компилированный лисп. Никому не показываю, т.к. на нем учится не стоит, очень примитивный. Однако работает, а переписывать в лом. Отправил тебе в ЛС.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 05.01.2009, 17:32
#33
Red Nova

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


Спасибо. Я думал что скомпилированный lsp это только fas... Попытаюсь разобраться в твоем коде.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 05.01.2009, 18:20
#34
Кулик Алексей aka kpblc
Moderator

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


Krieger, а можно тоже полюбопытствовать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.01.2009, 02:35
#35
Кулик Алексей aka kpblc
Moderator

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


Сообщение получил, спасибо. Понял, что мой вариант менее гибок для повседневной работы Ну не выбрасывать же... Саму вставку оставил в режиме "сделано хоть как-то", т.к. прицеплять половину CADWare сюда смысла не вижу никакого (кстати, и сам вариант использования блока вызывает баальшие сомнения...)
Вложения
Тип файла: lsp weld.LSP (11.8 Кб, 111 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.01.2009, 07:09
#36
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
кстати, и сам вариант использования блока вызывает баальшие сомнения...
Почему? Самому не очень нравится, но оставил, так как в одном файле этих треугольничков может быть ну очень много. Вот сейчас произволно открыл один файл малюсенького КМ, посчитал эти блоки, получилось 289. Чуть посложнее и за полтыщи перевалит, но там уже и кад не ворочается, приходится разбивать по файлам...
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
Ответ
Вернуться   Форум 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