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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Замена примитивов (отрезков) на блоки

Замена примитивов (отрезков) на блоки

Ответ
Поиск в этой теме
Непрочитано 31.03.2019, 23:55
Замена примитивов (отрезков) на блоки
Deutschland
 
Регистрация: 31.03.2019
Сообщений: 13

На схеме имеется большое количество примитивов (отрезков), которые необходимо заменить (преобразовать) на (в) блоки (вхождение блока). Каждый раз удаляю отрезок, вставляю тот же отрезок, но уже как блок (Вставка - Блок) и соединяю с остальными. И нужно, чтобы эти блоки (отрезки) были отделены друг от друга, поэтому я не могу сделать всю схему одним блоком. Вся работа занимает огромное количество времени, чтобы заменить всё. Существует ли способ заменить это всё разом?

Попробовал LISP. Замена набора примитивов на выбранный примитив. Но это не подошло под мой случай, так как замена производится именно на тот объект, который был выбран в качестве образца. То есть сохраняются все его свойства (угол, длина и т.п.) Необходимо чтобы всё встало на те же места, под теми же углами и длинами.

Миниатюры
Нажмите на изображение для увеличения
Название: AutoCAD.jpg
Просмотров: 277
Размер:	159.9 Кб
ID:	212489  Нажмите на изображение для увеличения
Название: AutoCAD1.jpg
Просмотров: 237
Размер:	185.7 Кб
ID:	212490  

Просмотров: 13766
 
Непрочитано 03.04.2019, 17:46
1 | #21
Семёныч


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


Для Deutschland.
В приведенном файле-блоке используется полилиния, а не отрезок (LINE).
Вот заготовка для однократной замены отрезка блоком.
Скопировать текст в буфер, вставить в командную строку и нажать Enter. Блок уже должен быть в текущем файле.
Код:
[Выделить все]
(progn
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 1)
(setq otr (car (entsel "\nВыберите отрезок: ")))
(setq votr (vlax-ename->vla-object otr))
(setq tvs (cdr (assoc 10 (entget otr))))
(setq dlina (vlax-get-property votr 'Length))
(setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(entdel otr)
(vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(setvar "ATTDIA" 1)
(setvar "ATTREQ" 0)
)
Семёныч вне форума  
 
Автор темы   Непрочитано 03.04.2019, 18:53
#22
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Вот заготовка для однократной замены отрезка блоком.
Скопировать текст в буфер, вставить в командную строку и нажать Enter. Блок уже должен быть в текущем файле.
Блок в текущем файле. Скопировал, вставил в командную строку, далее меня просят выбрать отрезок, выбираю. Ничего не происходит. Несколько раз пробовал. Что я делаю не так
Deutschland вне форума  
 
Непрочитано 03.04.2019, 20:08
#23
Семёныч


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


А что по ожиданию должно происходить? Если выбирается отрезок, то он удаляется, а на его месте оказывается блок. Это можно определить с помощью палитры свойств.
Семёныч вне форума  
 
Непрочитано 03.04.2019, 20:13
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Если выбирается отрезок,
кстати хороший вопрос - исходные примитивы: отрезки (line) или полилинии (polyline)?
Сергей812 вне форума  
 
Непрочитано 03.04.2019, 20:35
#25
Семёныч


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


В моей заготовке пока подразумевается объект, у которого есть свойства "длина" ("Length") и "угол поворота"("angle"). У полилинии таких свойств нет. С другой стороны, если применить программу к отрезку, то он заменяется блоком и повторно применять программу к нему бесполезно. К тому же автор темы постоянно упоминает понятие "отрезок". Я написал именно заготовку программы Если она устроит автора темы, то её можно будет довести до финала.
Семёныч вне форума  
 
Непрочитано 03.04.2019, 20:48
#26
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Семёныч, это вопрос к ТС был - не сильно удивлюсь, если там и отрезки, и полилинии)

Цитата:
Сообщение от Семёныч Посмотреть сообщение
у которого есть свойства "длина" ("Length") и "угол поворота"("angle"). У полилинии таких свойств нет.
у полилинии есть общая длина.
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.04.2019, 21:05
#27
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
А что по ожиданию должно происходить? Если выбирается отрезок, то он удаляется, а на его месте оказывается блок. Это можно определить с помощью палитры свойств.
Я ожидаю, что произойдёт то, о чём вы и пишете. Но отрезок так и остаётся отрезком.

----- добавлено через ~6 мин. -----
И раз разговор зашёл про полилинии - в схеме намешано всё подряд, где встречаются как отрезки, так и полилинии, которые и нужно заменить на один блок.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 16
Размер:	143.0 Кб
ID:	212622  Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 16
Размер:	144.7 Кб
ID:	212623  
Deutschland вне форума  
 
Непрочитано 03.04.2019, 21:37
#28
Семёныч


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Но отрезок так и остаётся отрезком.
Тогда попробуй начерти ОТРЕЗОК (LINE) и примени к нему программу. Скопируй сюда протокол выполнения по F2.
Сделай то же самое с твоим объектом и тоже скопируй сюда протокол.
Не помешал бы и оригинальный файл (или его фрагмент). Но если страна нахождения - Германия, то я пас.
Семёныч вне форума  
 
Автор темы   Непрочитано 03.04.2019, 22:09
#29
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Тогда попробуй начерти ОТРЕЗОК (LINE) и примени к нему программу. Скопируй сюда протокол выполнения по F2.
Сделай то же самое с твоим объектом и тоже скопируй сюда протокол.
Не помешал бы и оригинальный файл (или его фрагмент). Но если страна нахождения - Германия, то я пас.
Выполняется регенерация модели.

Утилиты меню AutoCAD загружены.
Команда:
Команда:
Команда: <Сетка откл>
Команда:
Команда:
Команда: _insert
Точка вставки или [Базовая точка/Масштаб/Поворот]:
Введите значения атрибутов
SN:
Идентификатор:

Команда:
Команда:
Команда: _line
Первая точка:
Следующая точка или [оТменить]:
Следующая точка или [оТменить]:

Команда: (progn
(_> (setvar "ATTDIA" 0)
(_> (setvar "ATTREQ" 1)
(_> (setq otr (car (entsel "\nВыберите отрезок: ")))
(_> (setq votr (vlax-ename->vla-object otr))
(_> (setq tvs (cdr (assoc 10 (entget otr))))
(_> (setq dlina (vlax-get-property votr 'Length))
(_> (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(_> (entdel otr)
(_> (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(_> (setvar "ATTDIA" 1)
(_> (setvar "ATTREQ" 0)
(_> )

Выберите отрезок: ; ошибка: no function definition: VLAX-ENAME->VLA-OBJECT

Открывается файл формата AutoCAD 2013.
Выполняется регенерация модели.

Утилиты меню AutoCAD загружены.
Команда:

Файл Autodesk DWG. Это файл формата TrustedDWG, сохраненный в приложении Autodesk или в приложении, лицензированном корпорацией Autodesk.

Команда:
Команда: (progn
(_> (setvar "ATTDIA" 0)
(_> (setvar "ATTREQ" 1)
(_> (setq otr (car (entsel "\nВыберите отрезок: ")))
(_> (setq votr (vlax-ename->vla-object otr))
(_> (setq tvs (cdr (assoc 10 (entget otr))))
(_> (setq dlina (vlax-get-property votr 'Length))
(_> (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(_> (entdel otr)
(_> (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(_> (setvar "ATTDIA" 1)
(_> (setvar "ATTREQ" 0)
(_> )

Выберите отрезок: ; ошибка: no function definition: VLAX-ENAME->VLA-OBJECT
Вложения
Тип файла: dwg
DWG 2013
Фрагмент.dwg (49.3 Кб, 12 просмотров)
Deutschland вне форума  
 
Непрочитано 03.04.2019, 22:50
#30
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от Deutschland Посмотреть сообщение
VLAX-ENAME->VLA-OBJECT
добавьте в код
Код:
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 07:53
1 | #31
Семёныч


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


Как-то я привык уже, что в AutoCAD 2013 и в следующих версиях загрузка функций VLisp (vl-load-com) происходит автоматически. Возможно, это у меня так происходит.
Частная задача: замена отрезка блоком l0.
Код:
[Выделить все]
(defun C:LB ( / atd atr echo osm *error* otr votr tvs dlina ugol)
(vl-load-com)
(princ "\nЗамена отрезка блоком.")
(setq atd (getvar "ATTDIA"))
(setvar "ATTDIA" 0)
(setq atr (getvar "ATTREQ"))
(setvar "ATTREQ" 1)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
;; Обработчик ошибок
(defun *error* (msg)(princ msg)
(setvar "ATTDIA" atd)
(setvar "ATTREQ" atr)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
) ; *error*
(setq otr (car (entsel "  Выберите отрезок (Enter-отказ): ")))
(if otr 
    (progn
    (if (= (cdr (assoc 0 (entget otr))) "LINE")
        (progn 
        (setq votr (vlax-ename->vla-object otr))
        (setq tvs (cdr (assoc 10 (entget otr))))
        (setq dlina (vlax-get-property votr 'Length))
        (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
        (vl-cmdf "_UNDO" "_BE")
        (entdel otr)
        (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
        (vl-cmdf "_UNDO" "_E")
        (princ "\nОтрезок заменен на блок.")
        ) ; progn
        (princ "\nВыбранный объект не ОТРЕЗОК.")
    ) ; if
    ) ; progn
    (princ "\nОтмена.")
) ; if
(setvar "ATTDIA" atd)
(setvar "ATTREQ" atr)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)
Скопировать код в командную строку и нажать Enter. Для запуска программы ввести LB.
Семёныч вне форума  
 
Непрочитано 04.04.2019, 09:30
#32
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Если в образце красным кружком обозначен примитив, к которому применяется программа - то ТС может применять программу хоть до посинения: там полилиния) А так какая то пассивная позиция у ТС - хочет сэкономить много человекочасов, но при этом лениться даже корректные входные условия выдать сразу: почти половина линейных примитивов в образце - полилинии.
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 09:47
#33
Семёныч


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


Ну, до посинения он не буде доходить, программа выдаст сообщение, что объект не отрезок. Я специально не стал вводить в программу расчленение полилинии (а вдруг там нужна именно полилиния). Однако, будь то полилиния или отрезок - этот объект все равно должен удалиться и на его месте должен оказаться блок. А что там в блоке (а там полилиния) - это не нашего ума дело. Автор темы может самостоятельно расчленить попавшиеся полилинии до отрезков.
Непонятно также назначение атрибутов.
Семёныч вне форума  
 
Непрочитано 04.04.2019, 09:52
#34
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Однако, будь то полилиния или отрезок - этот объект все равно должен удалиться и на его месте должен оказаться блок.
не вводите ТС в заблуждение - если будет полилиния, то блок там не появится)

Цитата:
Сообщение от Семёныч Посмотреть сообщение
Непонятно также назначение атрибутов.
так задавал уже:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и откуда берутся данные для двух атрибутов в блоке? вручную вводить - это сразу хороший минус в скорости...
но ТС видит только то, что ему нужно, похоже)
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 10:22
#35
Семёныч


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
не вводите ТС в заблуждение
Что это вы постоянно упоминаете какого-то ТС? Нет здесь никакого ТС. Я общаюсь с автором темы Deutschland и жду от него реакции. Если вы решили подменить собой автора темы, то вам и карты в руки. Дорабатывайте программу по своему разумению. А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
Семёныч вне форума  
 
Непрочитано 04.04.2019, 10:36
#36
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,041


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Что это вы постоянно упоминаете какого-то ТС? Нет здесь никакого ТС. Я общаюсь с автором темы Deutschland и жду от него реакции. Если вы решили подменить собой автора темы, то вам и карты в руки. Дорабатывайте программу по своему разумению. А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
ТС - топикстартер, автор ветки. Стандартное сокращения на множестве форумов.

Offtop: А указывать, что другим делать - будете на своем форуме, если хватит способностей раскрутить его до уровня dwg.ru, чтобы там появились люди
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 10:47
#37
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


ИМХО, ветка уже давно переросла раздел Autocad, т.к. штатными средствами автоматизировать работу у ТС не получится и нужно писать соответствующую программу. Самому или привлекая помощь, а т.к. с программированием у автора судя по всему не очень, то....
Цитата:
Сообщение от Семёныч Посмотреть сообщение
А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
это не самый плохой совет.

ЗЫ.
А полилинии или линии особой разницы нет, _explode все уравняет =)

Последний раз редактировалось Boxa, 04.04.2019 в 10:57.
Boxa вне форума  
 
Автор темы   Непрочитано 04.04.2019, 11:48
#38
Deutschland


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если в образце красным кружком обозначен примитив, к которому применяется программа - то ТС может применять программу хоть до посинения: там полилиния)
Вовсе нет. Красным кружком обозначено место, на которое следует обратить внимание. Это рабочие моменты. И перед тем как загрузить файл сюда я не убрал его.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А так какая то пассивная позиция у ТС - хочет сэкономить много человекочасов, но при этом лениться даже корректные входные условия выдать сразу: почти половина линейных примитивов в образце - полилинии.)
Виноват. Я не знал как вся эта система работает, что код для упрощения работы пишется чётко под каждую поставленную задачу. Для отрезков - один, для полилиний другой и т.п. Буду иметь в виду. И уже позже я добавил, что в схеме всё намешано (местами линии, местами полилинии).

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и откуда берутся данные для двух атрибутов в блоке? вручную вводить - это сразу хороший минус в скорости...
Блоки были выданы организации в таком виде. Насколько я знаю в дальнейшем планируется идентификация элементов на схемах, которую будут производить на основании идентификатора (системного номера) объекта из БД.

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от Семёныч Посмотреть сообщение
Как-то я привык уже, что в AutoCAD 2013 и в следующих версиях загрузка функций VLisp (vl-load-com) происходит автоматически. Возможно, это у меня так происходит.
Частная задача: замена отрезка блоком l0.
Скопировать код в командную строку и нажать Enter. Для запуска программы ввести LB.
Ура! Премного благодарен Всё заработало исправно. На работе стоит AutoCAD 2010.
1. На данный момент вставляется блок, который я загружал сюда последним. Можно ли заменить вставляемый блок, на динамический (тот, который я скидывал в тему ещё ранее)?
2. Реально ли написать такой код, чтобы применять его не разово? Выделить все отрезки на схеме и сразу всё заменить на данный блок.

Последний раз редактировалось Deutschland, 04.04.2019 в 12:05.
Deutschland вне форума  
 
Непрочитано 04.04.2019, 17:36
#39
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


Boxa, да я блок и не менял. у него проблема с точкой вставки. упорядочил) а вообще за такие дин. блоки железной линейкой по рукам самое то)
Цитата:
Сообщение от Boxa Посмотреть сообщение
ИМХО доработать Ваш вариант до работы с исходным блоком не так уж и сложно,
если не трудно)
Цитата:
Сообщение от Deutschland Посмотреть сообщение
А что это за лисп такой, чем он поможет? Активировал, пробую что-то выделять - реакции ноль.
1. лисп загружают
2. выделять нужно отрезки
3. лисп заменяет выбранные отрезки на дин. блок i0.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
точку вставки перенести в середину блока, там же сделать динамический поворот блока.
удобнее будет с точкой вставки на конце линии (в блоке кстати полилиния непонятно нафик) и углом поворота относительно точки вставки.
koMon вне форума  
 
Автор темы   Непрочитано 04.04.2019, 20:41
| 1 #40
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
1. лисп загружают
2. выделять нужно отрезки
3. лисп заменяет выбранные отрезки на дин. блок i0.
Я так и делал - не работало. Наконец-то решил эту проблему.

Из протокола:
Команда: LINE_DBLOCK
; ошибка: no function definition: VLAX-GET-ACAD-OBJECT

Добавил в начале лиспа:
Код:
Но только после применения он эти блоки на схеме разворачивает в противоположную сторону.

Последний раз редактировалось Deutschland, 04.04.2019 в 21:03.
Deutschland вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Замена примитивов (отрезков) на блоки

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить цвет выбранных примитивов? Замена цвета объектов в autocad (с помощью autolisp). Halfback LISP 8 24.12.2018 20:52
Как изменить свойства примитивов в блоках стандартных размерных стрелок philja AutoCAD 6 05.02.2016 01:22
AutoCAD MEP 2014: Откуда возникли непонятные блоки и стили в новом блоке? Новичёк Вертикальные решения на базе AutoCAD 7 14.12.2015 11:09
Различие функции поиск и замена (команда _find) последних версий AutoCad WeMaN AutoCAD 18 30.05.2013 13:40