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

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

Автоматическое создание блока из выбранных объектов

Ответ
Поиск в этой теме
Непрочитано 26.10.2016, 08:56 #1
Автоматическое создание блока из выбранных объектов
VAV
 
Проектировщик
 
Воронеж
Регистрация: 28.10.2009
Сообщений: 250

Всем привет. Уверен, что эта тема уже не раз обсуждалась, но, к сожалению, нет времени копаться по форуму. Нужен лисп, который будет работать по следующему алгоритму:
1. выделяю объекты, из которых нужно создать блок
2. Запускаю лисп.
3. Выбираю базовую точку для будущего блока.
4. Блок автоматически создается, без запроса имени

При использовании команды БЛОК приходится задавать имя блока вручную, поэтому это не очень подходит.
Команда Вставить как блок, тоже не подходит, т.к. приходится вставлять блок в какое-то другое место. Нужно, чтобы блок создался в том же месте, где находятся выбранные объекты, заместив их.

Буду признателен тому, кто напишет такой лисп или даст ссылку на уже созданную ранее тему, подобную этой.
Спасибо
Просмотров: 3153
 
Непрочитано 26.10.2016, 09:08
#2
Кулик Алексей aka kpblc
Moderator

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


Сразу вопрос: имя блока по какому принципу задавать? Или использовать анонимные блоки?

----- добавлено через 34 сек. -----
И никто не мешает, если уж сильно хочется поизвращаться, сначала вырезать в буфер, а потом вставить
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2016, 09:17
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 3,443


Цитата:
приходится задавать имя блока вручную
это очень хорошо!
trir вне форума  
 
Непрочитано 26.10.2016, 09:19
#4
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 4,507


Если можно найти переменную, отвечающую за тип преобразования объектов в диалоговом окне создания блока (удалить объекты, преобразовать в блок), можно воспользоваться строковой _-block.
engngr вне форума  
 
Непрочитано 26.10.2016, 09:20
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Вот блин, имя блока нет сил ввести вручную
Предлагаю такой алгоритм:
Запускаются Lisp, который предлагает выбрать объекты и ВСЁ. Базовую точку тоже ведь крайне тяжело задать, пусть сама определяется. Имя тоже само назначится типа "Блок 001".
Profan вне форума  
 
Непрочитано 26.10.2016, 09:23
#6
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 1,522
Отправить сообщение для doctorraz с помощью Skype™


1. выделяю объекты, из которых нужно создать блок
2. Запускаю лисп. -контолшифтцэ
3. Выбираю базовую точку для будущего блока.
4. Блок автоматически создается, без запроса имени -контолшифтве(птичкой которая)

----- добавлено через ~3 мин. -----
упсс согласно тз вместо...
после пп3 команда дел или стереть ))

----- добавлено через ~3 мин. -----
макрос ?
__________________
Мастерская СПДС
doctorraz на форуме  
 
Автор темы   Непрочитано 26.10.2016, 10:01
#7
VAV

Проектировщик
 
Регистрация: 28.10.2009
Воронеж
Сообщений: 250
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сразу вопрос: имя блока по какому принципу задавать? Или использовать анонимные блоки?
Ну например что-то подобное имени, которое создает автокад при использовании команды ВСТБЛОК (типа A$C0FE237AB), если это реально конечно.
VAV вне форума  
 
Непрочитано 26.10.2016, 10:33
#8
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,779
<phrase 1=


Цитата:
Сообщение от VAV Посмотреть сообщение
Ну например что-то подобное имени, которое создает автокад при использовании команды ВСТБЛОК (типа A$C0FE237AB), если это реально конечно.
Это реально (можно задать любую ерунду, но потом работать с таким блоком ОЧЕНЬ сложно.
Проще задать в ЛИСПЕ (если облом вводитьимя в строке) какой-то префикс, а к нему пристраивать порядковый номер.
Я таким образом заполнял библиотеку блоков в ICON-меню, указывал ячейку в которую помещался еще и слайд.
В общем способы есть...
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 26.10.2016, 11:25
#9
Nike

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


http://forum.dwg.ru/showthread.php?t=76304
Nike вне форума  
 
Непрочитано 26.10.2016, 12:02
1 | #10
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Простейший пример:
Код:
[Выделить все]
(defun C:АБ ( / обб твс n flag имяблок)
(setq обб (ssget))
(setq твс (getpoint "\nУкажите точку вставки: "))
(setq n 100 flag T)
(while flag
       (setq имяблок (strcat "Блок "(rtos n 2 0)))
       (if (tblsearch "BLOCK" имяблок)
           (setq n (+ n 1))
           (setq flag nil)
        ) ; if
) ; while
(princ "\nСоздан блок. Имя блока:") (prin1 имяблок)
(if (= (tblsearch "BLOCK" имяблок) nil)
    (vl-cmdf "_-BLOCK" имяблок твс обб "")
) ; if
(vl-cmdf "_INSERT" имяблок твс "1" "1" "0")
(princ)
)
Profan вне форума  
 
Непрочитано 26.10.2016, 19:39
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,795
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от VAV Посмотреть сообщение
Уверен, что эта тема уже не раз обсуждалась
Точно так. В этой теме полно разных команд Все выбранное в блок. Напомните ЛИСП.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.10.2016, 07:57
#12
VAV

Проектировщик
 
Регистрация: 28.10.2009
Воронеж
Сообщений: 250
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Простейший пример:
Спасибо, прям то, что нужно. Только вот хотелось бы, чтобы имя блока было приближенно к уникальному. Т.к. при вставке чертежей из одного файла в другой очень часто будет наблюдаться совпадение имен блоков с вытекающими отсюда последствиями
VAV вне форума  
 
Непрочитано 27.10.2016, 09:30
1 | #13
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Тогда вот такой вариант:
Код:
[Выделить все]
(defun C:АБ ( / обб твс n flag имяблок)
(setq обб (ssget))
(setq твс (getpoint "\nУкажите точку вставки: "))
(setq n 100 flag T)
(while flag
       (setq имяблок (strcat (vl-filename-base (getvar "DWGNAME")) " " (rtos n 2 0)))
       (if (tblsearch "BLOCK" имяблок)
           (setq n (+ n 1))
           (setq flag nil)
        ) ; if
) ; while
(princ "\nСоздан блок. Имя блока:") (prin1 имяблок)
(if (= (tblsearch "BLOCK" имяблок) nil)
    (vl-cmdf "_-BLOCK" имяблок твс обб "")
) ; if
(vl-cmdf "_INSERT" имяблок твс "1" "1" "0")
(princ)
)
Profan вне форума  
 
Автор темы   Непрочитано 27.10.2016, 11:52
#14
VAV

Проектировщик
 
Регистрация: 28.10.2009
Воронеж
Сообщений: 250
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Тогда вот такой вариант:
Спасибо, но специфика работы такова, что порой приходится пользоваться файлами с одинаковыми названиями. А никак нельзя сгенерировать название блока, например, по текущему времени?
VAV вне форума  
 
Непрочитано 27.10.2016, 16:05
1 | #15
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Вариант блока, в имени которого прописан полный путь к файлу, в котором этот блок создавался:
Код:
[Выделить все]
;;; АвтоБлок c полным именем файла
(defun C:АБ ( / echo osm *error* обб твс n flag имяблок)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(defun *error* (msg)(princ msg)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
) ; *error*
(vl-cmdf "_UNDO" "_BE")
(setq обб (ssget))
(if обб
    (progn
    (initget 7)
    (setq твс (getpoint "\nУкажите точку вставки: "))
    (setq n 100 flag T)
    (while flag
           (setq имяблок (strcat (vl-string-subst "_" ":_" (vl-string-translate "\\" "_" (getvar "DWGPREFIX")) 1) 
                          (vl-filename-base (getvar "DWGNAME")) " " (rtos n 2 0)))
           (if (tblsearch "BLOCK" имяблок)
               (setq n (+ n 1))
               (setq flag nil)
            ) ; if
    ) ; while
    (if (= (tblsearch "BLOCK" имяблок) nil)
        (vl-cmdf "_-BLOCK" имяблок твс обб "")
    ) ; if
    (princ "\nСоздан блок. Имя блока:") (prin1 имяблок)
    (vl-cmdf "_INSERT" имяблок твс "1" "1" "0")
     ) ; progn
     (princ "\nНичего не выбрано.")
) ; if
(vl-cmdf "_UNDO" "_E")
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)
Вариант блока, в имени которого записано время создания или дата и время создания:
Код:
[Выделить все]
;;; АвтоБлок c временем или датой и временем создания
(defun C:АБ ( / echo osm *error* обб твс дата время имяблок)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(defun *error* (msg)(princ msg)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
) ; *error*
(vl-cmdf "_UNDO" "_BE")
(setq обб (ssget))
(if обб
    (progn
    (initget 7)
    (setq твс (getpoint "\nУкажите точку вставки: "))
    (setq дата (itoa (fix (getvar "cdate"))))
    (princ "\nТекущая дата: ") (prin1 дата)
    (setq время (itoa (fix (* 1e6 (- (getvar "cdate") (fix (getvar "cdate")))))))
    (princ "\nТекущее время: ") (prin1 время)
    (setq имяблок (strcat "Блок "  время))
    (if (tblsearch "BLOCK" имяблок)
        (setq имяблок (strcat "Блок " дата "_" время))
    ) ; if
    (if (= (tblsearch "BLOCK" имяблок) nil)
        (vl-cmdf "_-BLOCK" имяблок твс обб "")
    ) ; if
    (princ "\nСоздан блок. Имя блока:") (prin1 имяблок)
    (vl-cmdf "_INSERT" имяблок твс "1" "1" "0")
     ) ; progn
     (princ "\nНичего не выбрано.")
) ; if
(vl-cmdf "_UNDO" "_E")
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)
Profan вне форума  
 
Автор темы   Непрочитано 28.10.2016, 08:07
#16
VAV

Проектировщик
 
Регистрация: 28.10.2009
Воронеж
Сообщений: 250
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Вариант блока, в имени которого записано время создания или дата и время создания:
Прошу прощения за мою неосведомленность в создании и редактировании лиспов, но этом варианте в имени блока появляется только время, без даты. Идеальным вариантом будет, если имя будет в формате дата_время. У вас в лиспе вроде этот момент прописан, но как это реализовать я не понял.
И еще пару моментов
1. Когда доходит дело до выбора базовой точки все привязки сбрасываются. Приходится заходить в меню привязок и включать их. После завершения команды привязки возвращаются к тому состоянию, в котором они были до вызова лиспа.
2. Если до вызова программы были уже предварительно выбраны объекты для объединения их в блок, то в момент запуска программы предварительный выбор сбрасывается и приходится вновь выбирать объекты. Хотелось бы, чтобы работало именно с предварительным выбором объектов. Это сложно реализовать?
VAV вне форума  
 
Непрочитано 28.10.2016, 09:08
1 | #17
Krieger

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


пфф

Profan, намудрил

Код:
[Выделить все]
(defun c:pb (/ ss pt)
(setq ss (ssget)
      pt (getpoint "точка вставки: "))
(command "_copybase" pt ss "" "_erase" ss "" "_pasteblock" "_none" pt)
  )
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.10.2016, 10:20
#18
VAV

Проектировщик
 
Регистрация: 28.10.2009
Воронеж
Сообщений: 250
<phrase 1=


Цитата:
Сообщение от Krieger Посмотреть сообщение
пфф

Profan, намудрил
все гениальное просто). То, что нужно. Огромное спасибо. Правда очень понравилась идея на счет имени блока в формате дата_время. Сложно будет переделать лисп под это условие? ) Если это трудозатратно - не тратьте время
VAV вне форума  
 
Непрочитано 28.10.2016, 10:30
1 | #19
Krieger

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


Цитата:
Сообщение от VAV Посмотреть сообщение
Правда очень понравилась идея на счет имени блока в формате дата_время. Сложно будет переделать лисп под это условие? )
Не, нельзя, в данном случае имя генерирует кадовская команда сама, в неё залезть не получится. Если нужно дату и время то это вариант как у Profan.
Дату и время можно вот так вытащить:
Код:
[Выделить все]
(setq time (rtos (getvar "cdate") 2 4))
(strcat (substr time 1 4) "-" (substr time 5 2) "-" (substr time 7 2) "_" (substr time 10 2) "." (substr time 12 2))
__________________
Делай хорошо, плохо само получится.

Последний раз редактировалось Krieger, 28.10.2016 в 10:47.
Krieger вне форума  
 
Непрочитано 28.10.2016, 11:12
1 | #20
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,663


Попроще?
Код:
[Выделить все]
;;; АвтоБлок c датой и временем создания
(defun C:АБ ( / обб твс дата время имяблок)
(setq обб (ssget))
(if обб
    (progn
    (initget 7)
    (setq твс (getpoint "\nУкажите точку вставки: "))
    (setq дата (itoa (fix (getvar "cdate"))))
    (princ "\nТекущая дата: ") (prin1 дата)
    (setq время (itoa (fix (* 1e6 (- (getvar "cdate") (fix (getvar "cdate")))))))
    (princ "\nТекущее время: ") (prin1 время)
    (setq имяблок (strcat "Блок " дата "_" время))
    (vl-cmdf "_-BLOCK" имяблок твс обб "")
    (princ "\nСоздан блок. Имя блока:") (prin1 имяблок)
    (vl-cmdf "_INSERT" имяблок твс "1" "1" "0")
     ) ; progn
     (princ "\nНичего не выбрано.")
) ; if
(princ)
)
Терпеть не могу блоки с бессмысленными именами, созданными случайным образом. Ни информации о блоке нет, ни сортировку толком не сделаешь. Мне эти мои программы противны.
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Автоматическое создание блока из выбранных объектов

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое изменение параметра листа в зависимости от динамического блока san666 Динамические блоки 8 27.06.2013 21:57
Создание слоя с названием содержимого текстового блока и копирование в него линий с других слоев antiponf Программирование 7 27.01.2012 19:43
Создание блока с видимой вспомогательной геометрией при вхождении Bariy AutoCAD 3 26.04.2011 05:21
Создание чертежа из блока. Как? Nordenskald AutoCAD 9 22.09.2009 15:31
Создание своих объектов и хранение данных в dwg файлах zmaximus Программирование 2 11.04.2008 18:36