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

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

Преобразование текста в мультивыноску, с сохранением точки вставки текста

Ответ
Поиск в этой теме
Непрочитано 12.05.2019, 23:14
Преобразование текста в мультивыноску, с сохранением точки вставки текста
maksorli
 
Регистрация: 12.05.2019
Сообщений: 5

Добрый день!
Нашел на форуме подобную ветку, но в ней задачи сохранения точки вставки текста(InsertionPoint) не стояла.
Алгоритм подразумевается следующий: выбираем текст, первой точке мультивыноски присваивается точка вставки текста , вторую выбираем самостоятельно, содержимое берем из текста.
На данный момент получается только вытащить содержимое текста в мультивыноску. В комментариях в лиспе нерабочие варианты. Ошибка следующая: ; error : bad argument type <<Entity name: 6a7efbf0>> ; expected VLA-OBJECT at [vla-get-insertionpoint].
Прошу помочь объяснить что я делаю не так.
Код:
[Выделить все]
 
(defun C:TXT-MLD ( / echo obj1 текст )
(vl-cmdf "_UNDO" "_BE")    
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq obj1 (car (entsel "\nВыберите текст: ")))
(if obj1
    (progn
;(setq p1 (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj1))))
;(setq p1 (vlax-safearray->list (vlax-variant-value (vla-get-coordinates (vlax-ename->vla-object obj1))))) 
    (setq текст (vlax-get-property (vlax-ename->vla-object obj1) 'TextString))
     (princ "\n Построение мультивыноски ")
         (vl-cmdf "_mleader" p1 pause  текст)
         (vl-cmdf "_ERASE" obj1 "")
      
    ) ; progn
    (princ "\nНе выбрана строка 1.")
) ; if 
(setvar "CMDECHO" 0)
(vl-cmdf "_UNDO" "_E")
(princ)
)
Просмотров: 9423
 
Непрочитано 03.10.2019, 18:51
#21
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


koMon, это на lisp выполнено?
skkkk вне форума  
 
Непрочитано 04.10.2019, 15:06
#22
koMon


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


100%
koMon вне форума  
 
Непрочитано 04.10.2019, 16:11
#23
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Очень любопытно, как удалось сделать на лиспе такую визуализацию, когда выноска висит на курсоре и ждет от пользователя указания точки ее расположения? grvecs или создание мультивыноски с последующим программным "хватанием" за ручку? Мне в свое время такое не удалось. Поглядывал в сторону grvecs, учитывая, что мне нужно было это только для shx-шрифтов, но даже для них этот подход показался мне слишком неоправданно трудоемким. А схватить программно за ручку мне не удалось. Пришлось обратиться к более мощному языку - в итоге было реализовано (не мной) при помощи jig с оберткой для возможности вызова из-под лиспа.
skkkk вне форума  
 
Непрочитано 04.10.2019, 17:08
#24
koMon


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


skkkk, это банальный (grread) я видел использование jig, но для более крутых задач. по мне так использование (grread) для подобных целей вполне себе оправданно. но дело в том, что выноска не создаётся из векторов..., а конкретно так модифицируется как созданный объект автокада. минус есть навскидку один. нельзя в объект открытый для редактирования вставить поле. эта операция сразу рушит всю красоту.
кстати (grvecs) та ещё зараза! НЕВОЗМОЖНО затереть нарисованные вектора если проехаться по не пустому экрану. так что лучше без него.

Последний раз редактировалось koMon, 04.10.2019 в 17:14.
koMon вне форума  
 
Непрочитано 07.10.2019, 01:32
#25
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от koMon Посмотреть сообщение
это банальный (grread)
Интересно. Не доходил в свое время до таких возможностей grread.
А если нужно поставить выноску слева от выносной линии (или снизу), можно ли это сделать простым переносом курсора на другую сторону или только нажатием горячих клавиш?
Цитата:
Сообщение от koMon Посмотреть сообщение
минус есть навскидку один. нельзя в объект открытый для редактирования вставить поле
Нельзя разве вставить поле потом, после закрытия для редактирования?

А так прикольно. Любопытно было бы посмотреть фрагмент кода, который "занимается" визуализацией выноски.
skkkk вне форума  
 
Непрочитано 07.10.2019, 09:26
#26
koMon


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Интересно. Не доходил в свое время до таких возможностей grread.
как неофитствующий апологет фанатствующему (имхо) - а как еще можно подвесить на курсор что-либо? если есть такая возможнность - поделись!
Цитата:
Сообщение от skkkk Посмотреть сообщение
А если нужно поставить выноску слева от выносной линии (или снизу), можно ли это сделать простым переносом курсора на другую сторону или только нажатием горячих клавиш?
если имеется в виду остроугольная выноска, то её конечно проще "делать" горячей клавишей, для этой цели прекрасно подойдёт <Tab>. но в принцепе можно "запретить" мвыноске менять своё направление и например назначить приоритетное направление, которое будет сохраняться, до его очередной смены.
Цитата:
Сообщение от skkkk Посмотреть сообщение
Нельзя разве вставить поле потом, после закрытия для редактирования?
конечно же можно. но ведь всегда хочется красотиши производительной и неописуённой. а так-то весь код можно уместить строчек в 10. entget (ssget), getpoint, getpoint, vla-addmleader..., что никак не увеличит производительность/снизит время на отрисовку/корректировку выносок. так например текущий код (версия 10) уже насчитывает около 700 строк, но не является оптимизированным, поскольку пишется эпизодически по приходу идей с мая месяца...
koMon вне форума  
 
Непрочитано 07.10.2019, 10:30
#27
koMon


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


skkkk, мне приятен твой неподдельный проявленный интерес

============================================================
Пользовательская команда MTL_TO_MLEADER
============================================================

Конвертация М/Текста, Выноски в Мтекст-Мвыноску с выбранным стилем Мтекст-Мвыноски.
Базовая точка Мвыноски выбирается относительно прямоугольника, описывающего текст.
Точка полки отслеживается и фиксируется <ЛКМ>, <Enter> "на глаз", <ПКМ> с точным
указанием. <Space> устанавливает ординату полки мвыноски по последней ординате,
установленной <ЛКМ>, <Enter>, <ПКМ> в направлении вектора от базовой точки до точки
полки, <Tab> устанавливает таким же образом абсциссу полки мвыноски. При выборе
существующей Мвыноски перемещается точка полки. Нажатие <1> при активной Мвыноске
позволяет переместить корневую точку Мвыноски, <e,E,у,У> вызывает команду Textedit
для редактирования текущего содержимого МТекста Мвыноски. Если в редактируемое поле
ввести текст по шаблону [Стартовое целое число][+/-][Целое число инкремента],
то при создании следующей МВыноски (см. ниже) [Стартовое целое число] будет
инкрементально изменено в соответсвии с введённым шаблоном. <d,D,в,В> воостанавливает
показ выключенного диалога выбора стиля МВыноски. Если на приглашение выбрать
конвертируемый объект кликнуть в поле чертежа, создастся Мвыноскка с текстом "DUMYY"

ЛНТ - левая нижняя точка
ЛВТ - левая верхняя точка
ПВТ - правая верхняя точка
ПНТ - правая нижняя точка
НСТ - нижняя средняя точка
ВСТ - верхняя средняя точка

============================================================
koMon - май, июнь, июль, сентябрь, октябрь 2019...
============================================================
Вложения
Тип файла: rar mtl_to_mleader.fas.10.rar (11.2 Кб, 96 просмотров)
koMon вне форума  
 
Непрочитано 08.10.2019, 20:38
#28
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от koMon Посмотреть сообщение
как неофитствующий апологет фанатствующему (имхо) - а как еще можно подвесить на курсор что-либо? если есть такая возможнность - поделись!
Что-то подозрительно странно слышать от тебя этот вопрос, чувствую тут какой-то подвох (либо я не понял его (вопроса (или подвоха))) .
Если говорить в рамках лиспа, я рассматривал три варианта:
1. _MOVE с программным выбором объекта и запросом точки вставки, равно как его аналог из Экспрессов (acet-move-чтототам).
2. _INSERT с запросом точки вставки.
3. _CUTCLIP+_PASTECLIP с запросом точки вставки.

Применительно к визуализации вставки мультивыноски в свое время я решил использовать третий вариант. Созданый мною код для этого делал следующее:
1. Создавал в укромном месте мультитекст нужного содержания в нужном стиле с нужным количеством строк и прочее. (вначале вообще прототипом был прямоугольный контейнер баундингбокс, однако была потребность контролировать не только размер выноски, но и ее содержимое.)
2. Выполнял его _CUTCLIP+_PASTECLIP, вешал на курсор этот текст, ожидая от юзера точки вставки. Можно было (и правильнее) делать через _INSERT, но кода было больше и я поленился.
3. Затем четко по образцу этого текста создавал мультивыноску в том же месте.

В общем-то, получилось неплохо для кода, который написан для своих на коленке, однако для продукта было как-то несерьезно. Резиновая нить от выноски до точки ее указания, понятно, не отрисовывалась, точку указания выноски в момент болтания на курсоре текста, я помечал крестиком, который после установки выноски удалялся.

Долго пытался найти способ, как программно ухватиться за ручку - это тут же решило бы все проблемы - создается мультивыноска, и вот она уже болтается на курсоре. Не нашел.
Пытался копать в сторону (grvecs) - реально задумывался уже над тем, чтобы векторами отрисовывать все буквы шрифта и резиновую нить, однако вовремя одумался и отказался от этой глупой затеи. Обратился за разработкой к программисту посерьезнее. Это была одна из двух хотелок, которая мне не удалась на лиспе за мою не слишком обширную практику.



Цитата:
Сообщение от koMon Посмотреть сообщение
ользовательская команда MTL_TO_MLEADER
Попробовал. Мне понравилось, как ведет себя выноска. Фактически также, как и jig, за исключением разве что курсора в форме квадрата, который при определенных зумах экрана мешает восприятию текста.

Блин, вот как ты это сделал на лиспе? По видео (точнее гифке) заметил, что все выноски ты ставишь в одну сторону, решил, что для установки ее с другой стороны (относительное положение полки и выносной линии имею в виду) потребуется ввод чего-то с клавы. Но видимо, я очень слабо въехал в этот "гррид".
Не знаю, кому как, но для меня это очень круто, правда. В моих глазах ты - прям как паровозик, который смог.
Цитата:
Сообщение от koMon Посмотреть сообщение
как неофитствующий апологет фанатствующему
Любопытно, где я показал себя фанатствующим))
skkkk вне форума  
 
Непрочитано 09.10.2019, 09:39
#29
koMon


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


никаких подвохов, чес слово!) просто для меня 1,2,3 неприемлемы в программировании этой задачи, да и не этой так же...
Цитата:
Сообщение от skkkk Посмотреть сообщение
Любопытно, где я показал себя фанатствующим))
ну как? на форуме с 2008 года (я посмотрел историю твоих сообщений) и сразу в лисп. я так понимаю пишешь иногда. ну чем не фанат поклонник последователь лиспа?
Цитата:
Сообщение от skkkk Посмотреть сообщение
В моих глазах ты - прям как паровозик, который смог.


----- добавлено через ~5 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
чтобы векторами отрисовывать все буквы шрифта
вот кстати. я тут потихоньку выписываю выбор блока и как раз вот в самом этом месте эта самая хрень и подошла. с адекватной графикой всё норм, а вот с атрибутами да тестами не очень( я про миниатюры блока...

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
за исключением разве что курсора в форме квадрата
если я не ошибаюсь, то его можно изменить

----- добавлено через ~16 мин. -----
не ошибался

Последний раз редактировалось koMon, 09.10.2019 в 09:45.
koMon вне форума  
 
Непрочитано 14.10.2019, 10:18
#30
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


koMon, MTL_TO_MLEADER прикольно выглядит, но... сразу косяк словил: при работе в листе, выноска ставится в модели...
И можно поподробней за механику? Я как раз мультивыносками время от времени балуюсь. В моих костылях пока только показывается резиновая линия от точки вставки и сразу готовая выноска без красивой визуализации.
з.ы. колись, это SetDoglegDirection, SetLeaderLineVertices и (grread t 9 0 )?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 14.10.2019 в 11:09.
Vladimir_Sergeevich вне форума  
 
Непрочитано 14.10.2019, 11:26
1 | #31
koMon


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Любопытно было бы посмотреть фрагмент кода, который "занимается" визуализацией выноски.
Код:
[Выделить все]
 
(defun draw_mleader (
						parsed_mleader_base_point parsed_mleader_shelf_point parsed_text parsed_mleader_exists  /
					 	mleader_coordinates_array
				    )
    (setq mleader_coordinates_array (vlax-make-safearray vlax-vbDouble '(10 . 15)))
	(vlax-safearray-fill mleader_coordinates_array (append parsed_mleader_base_point parsed_mleader_shelf_point))
	(if (null parsed_mleader_exists)
		(progn
    		(setq mleader_object (vla-addmleader (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) mleader_coordinates_array 0)
				  mleader_exists t
			)
			(vla-put-textstring mleader_object parsed_text)
			(vla-setleaderlinevertices mleader_object 0 mleader_coordinates_array)
			(if field_found
    			(vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)
			)
		)
		(progn
			;*************************
			(if (< (car parsed_mleader_shelf_point) (car parsed_mleader_base_point))
				(vla-setdoglegdirection mLeader_object 0 (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2)) (list -1 0 0)))
				(vla-setdoglegdirection mLeader_object 0 (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2)) (list 1 0 0)))
			)
			;*************************
			(vla-setleaderlinevertices mleader_object 0 mleader_coordinates_array)
		)
	)
)
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
но... сразу косяк словил: при работе в листе, выноска ставится в модели...
Vladimir_Sergeevich, тут в параллели "Семь стариков на одну девушку" (почти (c)) 8 страниц ужо исписали на эту тему... хотя добавить текущее рабочее пространство конечно же можно и здесь.

Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
(grread t 9 0 )
как подметил skkkk, pick box порой бывает не удобен, поэтому (grread t 12 0)
Вложения
Тип файла: rar MTL_to_MLeader_10a.fas.rar (11.0 Кб, 43 просмотров)

Последний раз редактировалось koMon, 14.10.2019 в 14:17.
koMon вне форума  
 
Непрочитано 14.10.2019, 12:03
#32
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от koMon Посмотреть сообщение
хотя добавить текущее рабочее пространство конечно же можно и здесь.
У меня это дело сделано везде. Давно написана функция о пяти строчках, которая "вычисляет" пространство и подставляется по умолчанию...

А в чем сакральный смысл писать (vlax-make-safearray vlax-vbDouble '(10 . 15)) а не (vlax-make-safearray vlax-vbDouble '(0 . 5)) ??
В остальном идею вроде понял, осталось реализовать.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 14.10.2019, 12:12
#33
koMon


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
А в чем сакральный смысл писать (vlax-make-safearray vlax-vbDouble '(10 . 15))
ради разнообразия, если только
koMon вне форума  
 
Непрочитано 14.10.2019, 16:19
#34
koMon


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


11
<i,I,ш,Ш> фиксирует (разфиксирует) вертикальность выносной линии мвыноски.
Вложения
Тип файла: rar MTL_to_MLeader_11.fas.rar (11.6 Кб, 25 просмотров)
koMon вне форума  
 
Непрочитано 17.10.2019, 15:27
#35
koMon


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


Vladimir_Sergeevich любезно подсказал, что полка (ориентация текста и не только текста) мвыноски необязательно должна быть горизонтальной, а может иметь произвольный угол и кстати если таскать текст (...) повёрнутой штатно мвыноски, то положение полки относительно перпендикуляра к тексту меняется соответственно.
<r,R,к,К> инициирует поворот текста МВыноски относительно точки полки. изменён механизм слежения за полкой относительно перпендикуляра к направлению текста.
Миниатюры
Нажмите на изображение для увеличения
Название: mtl_to_mleader_14.gif
Просмотров: 72
Размер:	5.17 Мб
ID:	219015  
Вложения
Тип файла: rar MTL_to_MLeader_14.fas.rar (12.0 Кб, 56 просмотров)
koMon вне форума  
 
Непрочитано 17.10.2019, 22:06
#36
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Всё, я так не играю.
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
это SetDoglegDirection, SetLeaderLineVertices и (grread t 9 0 )?
koMon, вот как это было надо начать думать, чтобы додуматься до того, что можно творить такое в лиспе?
В свое время (год 2010-й это был, если не ошибаюсь), я убил столько времени, чтобы это реализовать (мой тернистый путь я где-то выше излагал), но даже ни на йоту не приблизился к подобному решению. Причем, я и англоязычные ресурсы шерстил - и ни фига. Библией, конечно, был Полещук - там такого нет, но ведь я не грешил тем, что ограничивался им. Видимо, надо принять, что кому-то дано становиться дамками, а кто-то так и будет ходить всю жизнь в пешках. Вы прям молодцы, в моих глазах - Кибальчиши, как минимум! К сожалению, пока не располагаю временем, чтобы углубиться и понять, как это работает, хотя от любопытства распирает, хоть и понимаю, что это только усугубит мои мысли о моей ограниченности в программировании. Может, к пенсии дорасту (если доживу).
skkkk вне форума  
 
Непрочитано 21.10.2019, 08:55
#37
koMon


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


skkkk, просто нужно захотеть решить определённую задачу и понимая, что расширенный лисп располагает ресурсами к её решению, решить её. Полещука не читал, хотя имею скачанную копию, и к тому же это ведь фактически перевод разнообразных оригинальных источников, да и как показывают редкие отзывы, ещё и с ошибками(.

----- добавлено через ~20 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
углубиться и понять, как это работает
механизм прост до безобразия): существующая мвыноска меняется под изменившиеся условия её использования с помощью свойств и методов её объекта.
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Преобразование текста в мультивыноску, с сохранением точки вставки текста

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP Объединение нескольких объектов многострочного текста в один Cren LISP 8 26.02.2016 08:57
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Преобразование вершин TIN модели (треугольников) в точки с координатой Z WeMaN Разное 16 09.07.2009 13:49
Преобразование вершин горизонталей в точки WeMaN Программирование 4 05.03.2009 10:17
Rotate текстовых элементов относительно точки вставки plaz AutoCAD 2 19.09.2003 08:37