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

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

LISP. Создание обычного блока

Ответ
Поиск в этой теме
Непрочитано 10.12.2011, 07:06 #1
LISP. Создание обычного блока
LastGraff
 
Томск
Регистрация: 13.07.2011
Сообщений: 81

Подскажите, пожалуйста, как объединить выделенные примитивы в блок, посредством лиспа?
Просмотров: 5298
 
Непрочитано 10.12.2011, 12:27
#2
Кулик Алексей aka kpblc
Moderator

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


Либо командой _.-block, либо (посложнее) через vla-CopyObjects.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.12.2011, 12:39
#3
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,010


http://forum.dwg.ru/showthread.php?t=14295
Nike вне форума  
 
Автор темы   Непрочитано 10.12.2011, 14:06
#4
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Либо командой _.-block, либо (посложнее) через vla-CopyObjects.
Извините, Алексей, а можно чуть подробнее про команду _.-block, ибо ранее с ней не встречался... Заранее благодарен
LastGraff вне форума  
 
Непрочитано 11.12.2011, 22:33
#5
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vl-load-com)

(defun c:block-by-cmd (/ adoc selset name base)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (and (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (cond
                                         ((ssget "_P"))
                                         (t (ssget "_:L"))
                                         ) ;_ end of cond
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (= (type (setq base (vl-catch-all-apply (function (lambda () (getpoint "\nBase point <Cancel> : "))))))
              'list
              ) ;_ end of =
           (= (type (setq name (vl-catch-all-apply (function (lambda () (getstring "\nBlock name <Cancel> : ")))))
                    ) ;_ end of type
              'str
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (command "_-block" name "_none" base selset "")
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Но вставку блока надо будет прописывать отдельно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.12.2011, 16:34
#6
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Алексей, поясни, если не затруднит, что-то блоки для меня так и остаются загадкой( Я создаю программно по 2 примитива и хочу каждую такую пару объединять в блок, без участия человека... Я пробовал их объединить в ручную, чтобы понять механизм, итогом стало то, что блок вроде как создался, но исчез( и как к этому подойти - я понимаю пока смутно...
LastGraff вне форума  
 
Непрочитано 12.12.2011, 17:13
#7
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,010


Подтверждаю! Выделенные объекты вместо превращения в блок после ввода имени исчезают!


Пока Алексей молчит, попробуй так:

Код:
[Выделить все]
 
(defun C:mb (/ ss adoc csp name_block tmp_blk lst)
  (vl-load-com)
  (and (setq ss (ssget "_:L"))
       (setq point (getpoint "\nУкажите точку вставки: "))
       (setq lst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
       (setq ss   nil
             adoc (vla-get-activedocument (vlax-get-acad-object))
       ) ;_ end of setq
       (setq csp (if (and (zerop (vla-get-activespace adoc)) (= :vlax-false (vla-get-mspace adoc)))
                   (vla-get-paperspace adoc)
                   (vla-get-modelspace adoc)
                 ) ;_ end of if
       ) ;_ end of setq
       (setq name_block (vla-add (vla-get-blocks adoc) (vlax-3d-point point) (substr (rtos (getvar "CDATE") 2 9) 10)))
       (vla-copyobjects
         adoc
         (vlax-make-variant
           (vlax-safearray-fill
             (vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst))))
             lst
           ) ;_ end of vlax-safearray-fill
         ) ;_ end of vlax-make-variant
         name_block
       ) ;_ end of vla-copyobjects
       (setq tmp_blk (vla-insertblock csp (vlax-3d-point point) (vla-get-name name_block) 1.0 1.0 1.0 0.0))
       (mapcar 'vla-erase lst)
  ) ;_ end of and
  (setq x (cdr (assoc 2 (entget (entlast)))))
  (if (/= "" (setq new-name (getstring T (strcat "\nВведите если надо новое имя блока: "))))
  (command "_rename" "_b" x new-name)
  ) ;_ end of if
  (princ)
) ;_ end of defun

Последний раз редактировалось Nike, 12.12.2011 в 17:30.
Nike вне форума  
 
Непрочитано 12.12.2011, 17:56
#8
Кулик Алексей aka kpblc
Moderator

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


Это особенность командного создания блока. Если создание примитивов выполняется программно, то почему бы сразу не создавать их внутри блока?
P.S. По пользователям бегал, потому и молчал
Командное создание блока в лиспе обладает такой особенностью - созданный блок надо вставлять через тот же _.-insert, к примеру.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.12.2011, 13:05
1 | #9
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если создание примитивов выполняется программно, то почему бы сразу не создавать их внутри блока?
Я бы с удовольствием, только как? а их потом тоже надо вставлять? если да, то прошу подсказать процесс вставки блока...
LastGraff вне форума  
 
Непрочитано 13.12.2011, 14:00
#10
Кулик Алексей aka kpblc
Moderator

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


Стоп. Создание блока - это одно, вставка - уже другое. Поскольку я поклонник ActiveX, могу по-быстрому сварганить только такой код:
Код:
[Выделить все]
(defun mkblk (/ name blk_def)
  (setq name    "_test_block" ; имя блока. Блока пока в чертеже нет
        blk_def (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                         (vlax-3d-point '(0. 0. 0.))
                         name
                         ) ;_ end of vla-add
        ) ;_ end of setq
  ;; Теперь добавляем состав в описание блока:
  (vla-addline blk_def (vlax-3d-point '(-5. -5. 0.)) (vlax-3d-point '(5. 5. 0.))) ; отрезок
  (vla-addcircle blk_def (vlax-3d-point '(6. 5. 0.)) 5.) ; окружность
  ;; И вставляем блок:
  (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                   (vlax-3d-point '(10. 10. 0.))
                   name
                   1.
                   1.
                   1.
                   0.
                   ) ;_ end of vla-InsertBlock
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.12.2011, 14:00
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от LastGraff Посмотреть сообщение
Я бы с удовольствием, только как? а их потом тоже надо вставлять? если да, то прошу подсказать процесс вставки блока...
Тебе в #3 посте привели ссылку. Попробуй оттуда setub2.
+
LISP. Изменение базовой точки блока
Change Block Insertion
Add Objects to Block
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.03.2012, 11:13
#12
vosh


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


Алексей, как всегда спасибо за код.
Возникла необходимость проверить наличие блока с определенным именем в чертеже. Как бы это сделать "покороче" ?
vosh вне форума  
 
Непрочитано 26.03.2012, 11:27
#13
Кулик Алексей aka kpblc
Moderator

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


(tblobjname "block" "<ИмяБлока">) вернет nil, если в текущем документе блока <ИмяБлока> не существует.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.03.2012, 11:35
#14
Дима_

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


Цитата:
Сообщение от vosh Посмотреть сообщение
Возникла необходимость проверить наличие блока с определенным именем в чертеже.
Тут надо уточнить, наличие описания блока или вхождения например в модели (или в модели, либо каком-нибудь листе)?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.03.2012, 11:44
#15
vosh


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


Блок в модели, способ Алексея помог. Спасибо
vosh вне форума  
 
Непрочитано 26.03.2012, 11:54
#16
Дима_

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


Рано радуетесь, код Алексея не проверяет наличие блока в МОДЕЛИ - можете удалить все вхождения из МОДЕЛИ и проверить.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.03.2012, 12:38
#17
vosh


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


В том и дело, что мне нужно было определить наличие блока в базе чертежа, не важно начерчен он или нет в модели, в контексте кода написанного выше Алексеем нужно было именно это, чтобы не наслаивать примитивы внутри блока.
vosh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Создание обычного блока



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание атрибута для блока Рyslan AutoCAD 56 14.10.2011 11:32
Создание блока с видимой вспомогательной геометрией при вхождении Bariy AutoCAD 3 26.04.2011 05:21
Повторное создание вхождения блока из внешнего файла hwd AutoCAD 6 02.04.2010 16:16
LISP. Разбивка атрибутов блока в блоке Apelsinov LISP 2 23.09.2009 20:47
Создание блока с свободно вращающимся атрибутом gizmo_zx AutoCAD 2 01.09.2008 12:11