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

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

Перенос нескольких объектов "Текст" на мультивыноску.

Ответ
Поиск в этой теме
Непрочитано 13.05.2020, 01:01
Перенос нескольких объектов "Текст" на мультивыноску.
SeRioOuS
 
проектирование автомобильных дорог
 
Москва
Регистрация: 15.11.2019
Сообщений: 34

Очень много времени потратил на поиск чего-то похожего... Начну с объяснения ситуации. Есть чертеж городской улицы с отметками по кромке проезда и верху бортового камня. Представлены эти отметка двумя рядом стоящими объектами "Текст". Нужно как-то автоматизировать преобразование этого текста в мультивыноску. Чтобы выноска была из одной точки, над перекладиной была отметка по борту, под перекладиной - отметка кромки проезжей части.
Я от программирования очень далек, долго искал на этом форуме и много где еще. Нашел только преобразование одной единицы текста в мультивыноску (что уже хорошо, но вдруг можно и лучше?). Подскажите, может есть уже подобная программка или кто-то сможет помочь с ее разработкой?
Просмотров: 2014
 
Непрочитано 15.05.2020, 16:36
#21
koMon


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


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

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
Но, вот не пойму, откуда такая мода компилировать лиспы?
воха заругает)))
koMon вне форума  
 
Автор темы   Непрочитано 15.05.2020, 17:45
#22
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 34


Цитата:
Сообщение от koMon Посмотреть сообщение
обновил вложение в #15.
нарисуйте прототип или выноску на СВОБОДНОМ ОТ ВСЕГО месте и далее обведите её по подсказкам лиспа.
Вот, что получается. Длина выноски нормализовалась, но как видите наклон полки с исходным объектом не совпадает и выноски так же делаются из обеих точек.
(на скрине чуть растащил две выноски, они были параллельно друг другу с наложением. А выноску-пример обводил вдали от чертежа, потом тоже перенес для сравнения)
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 13
Размер:	253.5 Кб
ID:	226193  
SeRioOuS вне форума  
 
Непрочитано 15.05.2020, 18:05
#23
Boxa

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


Offtop: koMon, прошу Вас не извращайте. Я за то, что бы делиться знаниями и помогать узнать что то новое, если человек пытается сделать что то сам, но мне категорически противит, когда пытаются перевалить свою работу на другого и желательно даром. Компиляция и закрытие кода, ничего не меняют, Вы выполнили за SeRioOuS, его работу. Он заработал деньги, Вы потратили время. За что же мне Вас ругать, каждому свое.
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 15.05.2020, 18:12
#24
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 34


Цитата:
Сообщение от skkkk Посмотреть сообщение
Вспомнил сейчас, что при командном создании мультивыноски, которое используется в функции draw-mleader бывают сбои, когда юзер ранее при создании мультивыносок выбирал опции, отличные от тех, что по умолчанию - такой порядок в последствии сохраняется где-то в реестре и впоследствии не срабатывает по стандартному плану. Надо жестко прописывать все опции.



koMon, так я и знал, что ты не откажешься от такой косточки аппетитной)). Прикольно получилось, респект.) Но, вот не пойму, откуда такая мода компилировать лиспы? Секреты хранишь или хочешь критики красот кода избежать?))


Я не стал пока смотреть в сторону пакетной обработки, хотя, признаюсь, ручки чесались. Рассудил, что с учетом подосновы юзер захочет ставить выноску на пустое место для лучшей читаемости и во избежание закрытия выносками подосновы - и решил сначала сделать полуавтомат. Может, проще сначала расставить все автоматом, а потом подвинуть те выноски, что налезли не туда. Но это уже сделать было сложнее для меня и я самодеятельность проявлять не стал. Почти. Отказался только вопреки ТЗ от прицельных кликов в пользу возможности выбора группы рамкой. Правда, при таком подходе встал вопрос о смене угла наклона выносок, потому как в случае с прицельными кликами можно было прикрутить опции к запросу ("Выберите первый атрибут [Сменить угол]"), в случае же с выбором рамкой (ssget) такая возможность отсутствует. Пришлось для этого изобретать отдельную команду.

Вчера еще нацарапал кодик вечером минут за 15, но без тестов и отладки выкладывать не стал, а сегодня завалили. В общем, мой вариант попроще: нужно выделить группу из двух блоков или один блок (рамкой или кликами) и ткнуть место установки выноски. Может, уже и не пригодится, но раз уж написал, то выложу. Может, вылетит ошибка с учетом сказанного мной в начале этого поста, но постарался этот вариант исключить. Проверил на трех компах (2011, 2015, 2016) - работает.

Также в файле-примере стиль мультивыноски настроен неверно - не соответствует той выноске, что указана в качестве образца. Я привел его в соответствие, поэтому файл прикладываю - тестировать надо на нем и на будущее (если потребуется) брать образец этой выноски в другие чертежи.
Код:
[Выделить все]
 ;;; Программа извлекает значения одного или двух атрубутов выбранных (рамкой или кликами) блоков 
;;; и создает соответственно одно- или двухстрочную мультивыноску в текущем стиле и слое.
;;; Рассчитана на конкретный блок (с именем "altitude_mark") и его атрибут (с именем "z")
;;; Запуск - команда A2ML
;;; При первом запуске в пределах сеанса запрашивается угол наклона полки выноски. 
;;; В случае необходимости смены угла в этом чертреже до перезапуска нужно запустить команду CHANG
;;; https://forum.dwg.ru/showthread.php?p=1873176#post1873176
(vl-load-com)
(defun C:CHANG (/);;; command Change Angle
	(setq *ANG* (getangle "\nУкажите две точки, задающие угол наклона полок мультивыносок:"))
)
(defun C:A2ML ;;; command Attributes To Mleader
	( / flag last_obj ss
		blc_1 vla_blc_1 base_pt_1 attr_list_1 attr_1 str_2  
		blc_2 vla_blc_2 base_pt_2 attr_list_2 attr_2 str_2 
		en_ml vla_ml
	)
	(setq flag T)
	(while flag	
		(if (null *ANG*) (setq *ANG* (getangle "\nУкажите две точки, задающие угол наклона полок мультивыносок:")))
		(setq last_obj (entlast))
		(princ "\nВыберите один или два блока отметок рамкой или кликами:")
		(setq ss (ssget '((0 . "INSERT")(2 . "altitude_mark"))))
		(cond 
		  (	(and ss (<= (sslength ss) 2))
			(if (setq blc_1 (ssname ss 0))
				(setq 
					  vla_blc_1 (vlax-ename->vla-object blc_1)
					  base_pt_1 (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint vla_blc_1)))
					  attr_list_1 (vlax-safearray->list (vlax-variant-value (vla-getattributes vla_blc_1)))
					  attr_1 (car (vl-remove-if-not '(lambda (x) (= "z" (vla-get-TagString x))) attr_list_1))
					  str_1 (vla-get-TextString attr_1)
				)
			)	  
			(if (setq blc_2 (ssname ss 1))
				(setq 
					  vla_blc_2 (vlax-ename->vla-object blc_2)
					  base_pt_2 (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint vla_blc_2)))
					  attr_list_2 (vlax-safearray->list (vlax-variant-value (vla-getattributes vla_blc_2)))
					  attr_2 (car (vl-remove-if-not '(lambda (x) (= "z" (vla-get-TagString x))) attr_list_2))
					  str_2 (vla-get-TextString attr_2)
				)
				(setq base_pt_2 nil str_2 nil)
			)	  
		  )
		  (	(and ss (> (sslength ss) 2))
			(princ "\nБлоков должно быть не больше двух.")
			(setq flag nil)
		  )
		  (	T
			(princ "\nБлоки не выбраны.")
			(setq flag nil)
		  )
		)
		(cond 
		  (	(and flag str_1 str_2)
			(if (< (atof str_1) (atof str_2))
				(setq pt base_pt_1 str (strcat str_2 "\n" str_1))
				(setq pt base_pt_2 str (strcat str_1 "\n" str_2))
			)
		  )
		  (	(and flag str_1 (null str_2))
			(setq pt base_pt_1 str str_1
				  base_pt_2 nil str_2 nil
			)
		  )
		  
		)
		(if (and flag pt str) (vl-cmdf "_MLEADER" "_P" "_O" "_C" "_M" "_X" pt pause str))
		(if (not (equal last_obj (entlast)))
			(progn
				(setq en_ml (entlast) vla_ml (vlax-ename->vla-object en_ml))
				(vla-put-TextRotation vla_ml *ANG*)
				(vla-put-Color vla_ml 12)
				(if blc_1 (entdel blc_1))
				(if blc_2 (entdel blc_2))
			)
		)
	)
	(princ)
)	




Точно
Восхитительно, изумительно!!)) Да, работает только если исходную мультивыноску перенести в нужный файл и задать ее стиль. В ином случае тоже работает, но со стандартным стилем получается. В целом - прекрасно, огромное Вам спасибо!)
koMon, если продолжите доработку своей версии - с удовольствием продолжу тестировать ее.

В очередной раз убеждаюсь, что любое рутинное действие в автокаде можно автоматизировать до минутной работы. Жаль, что сам такими умениями не владею, но надеюсь, все еще впереди) Вам огромное спасибо еще раз за помощь!

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
Offtop: koMon, прошу Вас не извращайте. Я за то, что бы делиться знаниями и помогать узнать что то новое, если человек пытается сделать что то сам, но мне категорически противит, когда пытаются перевалить свою работу на другого и желательно даром. Компиляция и закрытие кода, ничего не меняют, Вы выполнили за SeRioOuS, его работу. Он заработал деньги, Вы потратили время. За что же мне Вас ругать, каждому свое.
Посредственно мыслите, уважаемый) Да, люди помогли просто "за идею". Да, я благодаря им буду быстрее "получать свои деньги". Но на этом-то мир не обрывается. Передо мной аж два человека, знающих свое дело. И не сомневайтесь, второй раз обратиться к ним за бесплатно совести у меня не хватит. А идеи для "второго раза" по-любому будут, я всего два года как универ закончил, планирую развиваться в проектировании.
SeRioOuS вне форума  
 
Непрочитано 15.05.2020, 18:28
#25
Сергей812


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


Offtop:
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Посредственно мыслите, уважаемый) Да, люди помогли просто "за идею". Да, я благодаря им буду быстрее "получать свои деньги". Но на этом-то мир не обрывается. Передо мной аж два человека, знающих свое дело. И не сомневайтесь, второй раз обратиться к ним за бесплатно совести у меня не хватит. А идеи для "второго раза" по-любому будут, я всего два года как универ закончил, планирую развиваться в проектировании.
неужели заказывать будете?) Поскольку сами разбираться даже и не собираетесь
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
... но даже близко не представляю себе, как. Даже понимаю, что скорее всего не сильно сложно - но мне для этого нужно с нуля изучить программирование в автокаде. Пишу в надежде, что кто-то тут поможет по доброте душевной) Если это действительно не сложная задача, конечно...
Сергей812 вне форума  
 
Непрочитано 15.05.2020, 18:29
#26
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Вспомнил сейчас, что при командном создании мультивыноски, которое используется в функции draw-mleader бывают сбои, когда юзер ранее при создании мультивыносок выбирал опции, отличные от тех, что по умолчанию - такой порядок в последствии сохраняется где-то в реестре и впоследствии не срабатывает по стандартному плану. Надо жестко прописывать все опции.
#10 прошел мимо?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2020, 19:32
#27
SeRioOuS

проектирование автомобильных дорог
 
Регистрация: 15.11.2019
Москва
Сообщений: 34


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Offtop:
неужели заказывать будете?) Поскольку сами разбираться даже и не собираетесь
А почему бы и нет? Я ничего не утверждаю. Не исключаю вариант, что и сам буду изучать. Автокад - наш хлеб. У нас есть человек в организации, который умеет динамические блоки делать (помимо просто отличного знания программы) - его почти на руках носят, с вопросами всегда к нему. Если еще и программы уметь писать - я считаю, это высший пилотаж. Так что время покажет.
SeRioOuS вне форума  
 
Непрочитано 15.05.2020, 19:42
#28
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,435


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
#10 прошел мимо?
Да, Алексей, ты прав. Проглядел. Спасибо за подсказку. Раньше я уже читал эту статью, но позабыл про нее. Попробовал жестко прописать опции, причем в английской справке про arrowHead ничего не было; на русском опция называется ...Стрелка выноски - и я методом тыка почему-то подобрал опцию _P и она сработала, как мне показалось. На самом деле должна быть _H. Исправил сейчас в #20, но как ни странно...
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Да, работает

Видимо, SeRioOuS уже вбил перед этим верную опцию.

Кулик Алексей aka kpblc, вычитал по твоей ссылке такой тезис:
Цитата:
Обратите внимание: выбрать можно только варианты, не совпадающие с текущим! Что это значит? Если текущее значение параметра - "сначала точки, потом аннотация" (п.1), то ввод _h приведет к ошибке.
Однако, проверяю сейчас с опцией "_H" на опыте - ошибок не вываливает:

Миниатюры
Нажмите на изображение для увеличения
Название: 2020-05-15 at 19-52-07.gif
Просмотров: 62
Размер:	1.95 Мб
ID:	226199  

Последний раз редактировалось skkkk, 15.05.2020 в 19:54.
skkkk на форуме  
 
Непрочитано 15.05.2020, 19:59
#29
Сергей812


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


skkkk, если вставлять выноску не командным способом, а потом "подвесить" уже вставленную на grread с отлавливанием координат мыши?
Сергей812 вне форума  
 
Непрочитано 16.05.2020, 20:13
#30
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,435


Сергей812, если речь об этой функции, то я пробовал ради интереса - там были проблемы с завершением визуализации, а точнее - с выходом из цикла. При нажатии Esс выноска "падала" полкой на стрелку. А при нажатии Enter - "подцеплялась" предыдущая. Разбираться не стал. Да и работает же так, плюс в данном случае бокс выноски всегда одинаков и плюс-минус предсказуем.
skkkk на форуме  
 
Непрочитано 16.05.2020, 22:09
#31
Сергей812


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Да и работает же так
это было как предположение, чтобы уйти от командных методов)
Сергей812 вне форума  
 
Непрочитано 20.05.2020, 08:58
#32
koMon


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


skkkk, не работает в MMXX
Command: A2ML

Укажите две точки, задающие угол наклона полок мультивыносок: Specify second point:
Выберите один или два блока отметок рамкой или кликами:
Select objects: 1 found

Select objects: 1 found, 2 total

Select objects:
_MLEADER
Specify leader arrowhead location or [leader Landing first/Content first/Options] <Options>: _H
Invalid Input.
Specify leader arrowhead location or [leader Landing first/Content first/Options] <Options>: _O
Enter an option [Leader type/leader lAnding/Content type/Maxpoints/First angle/Second angle/eXit options] <eXit options>: _C
Select a content type [Block/Mtext/None] <Mtext>: _M
Enter an option [Leader type/leader lAnding/Content type/Maxpoints/First angle/Second angle/eXit options] <Content type>: _X
Specify leader arrowhead location or [leader Landing first/Content first/Options] <Options>:
Specify leader landing location:
Specify landing distance <0.0100>: 22.45
22.30
Requires numeric distance or second point.
; error: Automation Error. Description was not provided.


Boxa, звучит как приглашение в буковый лес
koMon вне форума  
 
Непрочитано 20.05.2020, 10:27
#33
Boxa

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


Цитата:
Сообщение от koMon Посмотреть сообщение
не работает в MMXX
Цитата:
Сообщение от koMon Посмотреть сообщение
приглашение в буковый лес
Вы сегодня крайне метафоричны, попробую и я. =)
Нет, я Вас никуда не приглашаю. Я Вам пояснил, что мне уже не за что Вас ругать. Еще раз, в моем понимании, вся система автоматизации работы во многих странах, и в нашей так же, поставлена раком. Логика и здравый смысл подсказывают, что вроде бы автоматизация выгодна капиталу или должна быть выгодна, для снижения себестоимости продукции и увеличении прибыли, а занимается ей пролетариат, причем по своей инициативе. Понятно, у пролетариата нет денег на заказ программ/инструментов (хотя еще раз, этим работника должен обеспечивать работодатель) и как следствие, пролетарий выпрашивает помощь на форумах. Его пожалеют и помогут, но бенефициантом всей этой истории будет капитал/работодатель и у такой помощи будет побочный эффект - полное обесценивание труда программистов. Единственным выходом из этой ситуации, лично я, вижу передачу не готового продукта, а знаний.
Знания и умения автоматизировать свою работу, выполнять ее быстро - увеличивают стоимость труда пролетария и значит бенефициантом в этом случае будет не капитал, а простой работник и уже потом капитал. Побочным эффектом, при этом, будет знание, сколько труда нужно на изучения и написание программ, соответственно труд программистов не будет обесценен. Т.е. при передаче знаний выигрывают простые работяги, а не бизнес и эффективные менеджеры.
Вы передали SeRioOuS готовый продукт и совершенно не важно в каком виде, поздно мне Вас ругать. Нет смысла.

ЗЫ.
"приглашение в буковый лес" - я не вполне понял, если я правильно понимаю, то у народов Европы, буковый лес или буковая роща - святилище или святое место, где живут эльфы и прочие сказочные персонажи, но зачем мне Вас туда приглашать....
__________________
_бложиг
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Перенос нескольких объектов "Текст" на мультивыноску.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Единый государственный реестр объектов культурного наследия msv_mnv Поиск литературы, чертежей, моделей и прочих материалов 4 13.11.2017 11:12
Перестало работать снятие выделения нескольких объектов через Shift empsokol AutoCAD 1 06.07.2017 16:06
Масштабирование нескольких объектов без изменения их точки положения. СеверныйЧел AutoCAD 6 10.04.2017 16:07
перенос всех линий слоя в блоках в другой слой Positron Программирование 6 10.02.2012 15:59