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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > entmake и block/insert

entmake и block/insert

Ответ
Поиск в этой теме
Непрочитано 20.02.2006, 09:15 #1
entmake и block/insert
X28
 
Регистрация: 21.07.2005
Сообщений: 7

День добрый всем присутствующим!

Уже всю голову сломал! Как вставить блок в чертеж не используя команды типа (command "_insert")????

emtmake не работает с блоками, которые не определены в таблице блоков.

Прочитал вот это: http://dwg.ru/forum/viewtopic.php?t=350
Полный бред! Ведь в helpe-e русским по белому написано:
For legacy reasons, entmake ignores DXF group code 100 data for the following entity types:
AcDbText
AcDbAttribute
AcDbAttributeDefinition
AcDbBlockBegin
AcDbBlockEnd
и т. д.

Подскажите как все-таки вставить. Либо как добавить описание блока в таблицу блоков, ато в хелпе я что-то не нашел как это делается.
Просмотров: 5984
 
Автор темы   Непрочитано 20.02.2006, 19:58
#2
X28


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


Если комуто интересно, то решил все просто.
Все-таки использовал команду _insert, (command "_insert" <имя блока> nil) При такой команде блок определяется, а в чертеж не вставляется. И после этого можно спокойно использовать entmake когда нужно.

Не спорю. По ламерски.
Но словари описания блоков я "ниасилил".
X28 вне форума  
 
Непрочитано 20.02.2006, 20:21 Re: entmake и block/insert
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от X28
Полный бред!
А в чем бред то? Ну игнорируются, и что с того?

Цитата:
как добавить описание блока в таблицу блоков
Примерно так http://dwg.ru/forum/viewtopic.php?p=2456#2456
В общем, начинаем с
(entmake (list '(0 . "BLOCK") ...
потом примитивы блока
(entmake (list '(0 . "LINE")... - отрезки, окружности полилинии и т.п.
(entmake (list '(0 . "ATTDEF").... - атрибуты, если нужны
и наконец
(entmake (list '(0 . "ENDBLK")..... - усе собственно...

Блок есть, теперьего можно вставлять.

Только без ошибок надо делать, а то не создаст ничего, да еще и молчком.
vk вне форума  
 
Непрочитано 20.02.2006, 23:57
#4
fixo

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


Написано давно, может что не учел
***Создание определения блока из набора плюс
определения для него атрибутов***

Код:
[Выделить все]
;*********************************************************
;;			BLOCK ENTMAKE			;;
;*********************************************************

; Определение заголовка блока :

(defun ent-block-header (name pt)
(entmake (list
(cons 0 "BLOCK")
(cons 2 name)
(cons 8 "0")
(cons 70 2)
(cons 3 "")
(cons 10 pt))))

; Определение отдельного субпримитива блока :
(defun ent-block-sub (ent)
(entmake
    (vl-remove-if
	(function (lambda (x)
	(member (car x) '(5 330))))
	    (cdr (entget ent )))))  

; Определение субпримитивов из набора выбора :
(defun ent-ss (ss / i ss1)
     (setq i 0 ss1 (ssadd))
          (repeat (sslength ss)  
            (ent-block-sub (ssname ss i))
	    (ssadd (entlast) ss1)
            (setq i (1+ i)))
  ss1
  )

;Определение атрибута :
(defun ent-attdef (pt tag pmt val)
(entmake (list
'(0 . "ATTDEF")
'(100 . "AcDbEntity")
(cons 10 pt)
(cons 40 (getvar "TEXTSIZE"))
'(8 . "0")
'(100 . "AcDbText")
(cons 1 val)
(cons 3 pmt)
(cons 7 "Standard")
'(100 . "AcDbAttributeDefinition")
(cons 2 tag)
'(70 . 0)))
)

; Определение окончания блока :
(defun ent-endblk ()
(entmake '((0 . "ENDBLK")(8 . "0"))))

; Основная программа :
(defun C:emake (/ at i name pa pmt pt ss ss1 tag val)
(prompt "\n  >> Указать примитивы для создания определения блока >>\n")
(if (and (setq ss (ssget)
	       pt (getpoint "\nБазовая точка блока:\n")
	       name (getstring "\nИмя блока\n")))  
    (progn
      (setq ss1 (ssadd))
      (ent-block-header name pt)      
      (while (setq pa (getpoint "\nТочка вставки атрибута (Enter без атрибутов) :\n"))
		(setq  tag (strcase (getstring "\nТаг атрибута:\n"))
		      pmt (getstring T "\nПодсказка атрибута:\n")
		     val (getstring "\nЗначение атрибута:\n"))           
      (ent-attdef pa tag pmt val)      
      (ssadd (entlast) ss))
      (setq ss1 (ent-ss ss))
      (ent-endblk)
      (setq i 0)
          (repeat (sslength ss1)  
            (ssdel (ssname ss1 i) ss1)
            (setq i (1+ i)))
      )
  (princ "\nОтмена создания блока\n"))
  (princ)
  )
  (prompt "\n\t>>\tВ командной строке ввести emake \t\n")
  (princ)
;	TesT :
;	(C:emake)
;	(princ)


~'J'~
fixo вне форума  
 
Непрочитано 21.02.2006, 01:35 Re: entmake и block/insert
#5
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от X28
Подскажите как все-таки вставить. Либо как добавить описание блока в таблицу блоков, ато в хелпе я что-то не нашел как это делается.
Вставлять так. как делают культурные люди:
Код:
[Выделить все]
(vla-insertblock csp (vlax-3d-point pt) bn x y z a)
где: csp- текущее пространство ModelSpace или PaperSpace; pt - точка вставки; x, y, z, a - масштабы по осям и угол поворота в радианах.
Определять же блок следует так.
Определяем, существует ли этот блок уже или нет:
Код:
[Выделить все]
(setq	bks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
        bn (getstring "\nEnter Block Name: "))
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list bks bn)))
    (vla-add bks (vlax-3d-point '(0.0 0.0 0.0) bn))
    (alert "\Stop Fooling Around! Your Block Already Exists!"))
Насыщаем говый блок примитивами:
Код:
[Выделить все]
(mapcar '(lambda (x y) (vla-addLine bk (vlax-3d-point x) (vlax-3d-point y)))
    (list StartPoints) (list EndPoints))
  (mapcar '(lambda (x y) (vla-addCircle bk (vlax-3d-point x) y))
    (list CenterPoints) (list Radii))
  (mapcar '(lambda (ht prm x tg vl) (vla-addAttribute bk ht acAttributeModePreset prm (vlax-3d-point x) tg vl))
    (list Heights) (list Prompts) (list InsirtionPoints) (list Tags) (list Values))
и т.д.
Ессно, предполагается, что вся информация о примитивах уже содепжится в виде локальных переменных.
Лентяй вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > entmake и block/insert