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

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

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

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

Очень много времени потратил на поиск чего-то похожего... Начну с объяснения ситуации. Есть чертеж городской улицы с отметками по кромке проезда и верху бортового камня. Представлены эти отметка двумя рядом стоящими объектами "Текст". Нужно как-то автоматизировать преобразование этого текста в мультивыноску. Чтобы выноска была из одной точки, над перекладиной была отметка по борту, под перекладиной - отметка кромки проезжей части.
Я от программирования очень далек, долго искал на этом форуме и много где еще. Нашел только преобразование одной единицы текста в мультивыноску (что уже хорошо, но вдруг можно и лучше?). Подскажите, может есть уже подобная программка или кто-то сможет помочь с ее разработкой?
Просмотров: 6936
 
Непрочитано 13.05.2020, 02:18
#2
Сергей812


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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Чтобы выноска была из одной точки, над перекладиной была отметка по борту, под перекладиной - отметка кромки проезжей части.
стиль мультивыноски с подчеркиванием первой строки.

Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Нашел только преобразование одной единицы текста в мультивыноску
ну так ее и доработайте - последовательный выбор двух текстов вместо одного с последующим объединением и занесением в выноску.
Сергей812 вне форума  
 
Автор темы   Непрочитано 13.05.2020, 03:53
#3
SeRioOuS

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
стиль мультивыноски с подчеркиванием первой строки.


ну так ее и доработайте - последовательный выбор двух текстов вместо одного с последующим объединением и занесением в выноску.
понимаю, что можно доработать... но даже близко не представляю себе, как. Даже понимаю, что скорее всего не сильно сложно - но мне для этого нужно с нуля изучить программирование в автокаде. Пишу в надежде, что кто-то тут поможет по доброте душевной) Если это действительно не сложная задача, конечно...
SeRioOuS вне форума  
 
Непрочитано 13.05.2020, 09:41
#4
koMon


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


выложите примнр файла до/после
koMon вне форума  
 
Автор темы   Непрочитано 13.05.2020, 11:57
#5
SeRioOuS

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


Цитата:
Сообщение от koMon Посмотреть сообщение
выложите примнр файла до/после
Приложил файл. Много отметок в файле - изначально были блоками с атрибутом, через экспресс тулз перевел их в текс (просто для информации, может другим путем можно пойти, используя блоки).
Мультивыноской показал, что из всех этих отметок должно получиться.
Вложения
Тип файла: dwg
DWG 2010
вертикалка1.dwg (378.1 Кб, 18 просмотров)
SeRioOuS вне форума  
 
Непрочитано 13.05.2020, 16:15
#6
koMon


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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Много отметок в файле - изначально были блоками с атрибутом
не все? тут ранее уже было что-то подобное из робура. так там были блоки, которые кстати проще обработать и убить.
выложите то же самое, но с блоками
koMon вне форума  
 
Автор темы   Непрочитано 13.05.2020, 16:23
#7
SeRioOuS

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


вот с блоками

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
вот с блоками
если Вы с робуром знакомы - может, прям в нем можно как-то иначе сделать, чтобы эти отметки сразу в удобоваримом виде выходили из него?
Вложения
Тип файла: dwg
DWG 2010
Свердлова_вертикалка.dwg (315.1 Кб, 10 просмотров)
SeRioOuS вне форума  
 
Непрочитано 13.05.2020, 17:53
#8
koMon


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


не знаком
koMon вне форума  
 
Непрочитано 14.05.2020, 16:30
#9
skkkk


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


SeRioOuS, я бы, возможно, мог попробовать посодействовать, но нужно более четкое ТЗ. И пример поинформативнее, с описанием всех возможных случаев.
Подозреваю, что koMon уже что-то колдует, но это не точно
В любом случае, уточнения никому не повредят.

Первые вопросы, что приходят в голову:
1. Почему выноска в примере под углом?
2. Почему где-то текст один, а где-то - два?
3. Почему в примерах только отметки? Жалко что ли выложить фрагмент "как есть"? Ну чтобы более четко понимать задачу.

В идеале для программиста - получить примеры: как есть и как надо. Желательно - в одном файле. И предварительно продумать все возможные варианты. Описать подробнее все хотелки. При таком подходе шансы получить помощь возрастают. А без нужного ТЗ, как говорится, результат - ФЗ.

Вот для затравки кодик:
Код:
[Выделить все]
 ;;; Код преобразует два поочередно выбранных Мтекста (или текста, или атрибута блока) в мультивыноску из двух строк
;;; Версия без проверок и обработок
;;; Мультивыноску рисует в текущем стиле
;;; Использована вспомогательная функция от VVA - draw-mleader
;;; https://forum.dwg.ru/showthread.php?t=157534

(defun C:TO2ML ( / text1 text2) ;;; command Text Objects To Mleader
	(setq text1 (car (nentsel "\nВыберите первый текст:")))
	(setq text2 (car (nentsel "\nВыберите второй текст:")))
	(setq str1 (cdr (assoc 1 (entget text1))))
	(setq str2 (cdr (assoc 1 (entget text2))))
	(draw-mleader pause pause (list str1 str2) 2 nil nil)
)


(defun draw-mleader (pt1 pt2 strlist Htxt koeff abz / dic mlst i)
  ;;; pt1 - начальная точка UCS
  ;;; pt2 - конечная точка UCS
  ;;; strlist - список строк
  ;;; Htxt - высота текста
  ;;; koeff - коэфф форматирования pxe или nil
  ;;; abz - коэфф форматирования абзаца \\pa или Nil
  ;;;(draw-mleader (setq pt1(getpoint))(getpoint pt1)(list "Пример" "Минскинжпроект" "Третья строка") 1.5 0.9 nil)
 ;;; Стиль мультивыноски текущий
  (setq i 0)
  (vl-cmdf
    "_mleader"
    "_h"
    "_none"
    pt1
    "_none"
    pt2
  (strcat (if koeff (strcat "\\px"
                              (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              (car strlist)
    )
    )
  (while (> (getvar "CMDACTIVE") 0) (command ""))
  (setq dic (vlax-ename->vla-object (entlast)))
  (vla-put-TextString dic
    (strcat (if koeff (strcat "\\px"
                              (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              (car strlist)
;;;              (if abz "\\pa0;" "")
            (apply 'strcat
                   (mapcar '(lambda (x) (strcat "\\P" (if (= (setq i (1+ i)) 1)(if abz "\\pa0;" "")   "")  x)) (cdr strlist))
            ) ;_ end of apply
    ) ;_ end of strcat
  )
    (vla-put-TextHeight dic Htxt)
    dic
  )
  (defun mip-conv-to-str (dat)
      (cond ((= (type dat) 'INT) (setq dat (itoa dat)))
            ((= (type dat) 'REAL) (setq dat (rtos dat 2 12)))
            ((null dat) (setq dat ""))
            (t (setq dat (vl-princ-to-string dat)))
      ) ;_ end of cond
    ) ;_ end of defun
Написал "на коленке" за пару минут, использовал готовую функцию от VVA - draw-mleader.
skkkk вне форума  
 
Непрочитано 14.05.2020, 16:31
#10
Кулик Алексей aka kpblc
Moderator

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


С мультивыносками поосторожнее: https://autolisp.ru/2015/01/21/mleader_create_order/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.05.2020, 20:29
#11
SeRioOuS

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
SeRioOuS, я бы, возможно, мог попробовать посодействовать, но нужно более четкое ТЗ. И пример поинформативнее, с описанием всех возможных случаев.
Подозреваю, что koMon уже что-то колдует, но это не точно
В любом случае, уточнения никому не повредят.

Первые вопросы, что приходят в голову:
1. Почему выноска в примере под углом?
2. Почему где-то текст один, а где-то - два?
3. Почему в примерах только отметки? Жалко что ли выложить фрагмент "как есть"? Ну чтобы более четко понимать задачу.

В идеале для программиста - получить примеры: как есть и как надо. Желательно - в одном файле. И предварительно продумать все возможные варианты. Описать подробнее все хотелки. При таком подходе шансы получить помощь возрастают. А без нужного ТЗ, как говорится, результат - ФЗ.

Вот для затравки кодик:
Код:
[Выделить все]
 ;;; Код преобразует два поочередно выбранных Мтекста (или текста, или атрибута блока) в мультивыноску из двух строк
;;; Версия без проверок и обработок
;;; Мультивыноску рисует в текущем стиле
;;; Использована вспомогательная функция от VVA - draw-mleader
;;; https://forum.dwg.ru/showthread.php?t=157534

(defun C:TO2ML ( / text1 text2) ;;; command Text Objects To Mleader
	(setq text1 (car (nentsel "\nВыберите первый текст:")))
	(setq text2 (car (nentsel "\nВыберите второй текст:")))
	(setq str1 (cdr (assoc 1 (entget text1))))
	(setq str2 (cdr (assoc 1 (entget text2))))
	(draw-mleader pause pause (list str1 str2) 2 nil nil)
)


(defun draw-mleader (pt1 pt2 strlist Htxt koeff abz / dic mlst i)
  ;;; pt1 - начальная точка UCS
  ;;; pt2 - конечная точка UCS
  ;;; strlist - список строк
  ;;; Htxt - высота текста
  ;;; koeff - коэфф форматирования pxe или nil
  ;;; abz - коэфф форматирования абзаца \\pa или Nil
  ;;;(draw-mleader (setq pt1(getpoint))(getpoint pt1)(list "Пример" "Минскинжпроект" "Третья строка") 1.5 0.9 nil)
 ;;; Стиль мультивыноски текущий
  (setq i 0)
  (vl-cmdf
    "_mleader"
    "_h"
    "_none"
    pt1
    "_none"
    pt2
  (strcat (if koeff (strcat "\\px"
                              (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              (car strlist)
    )
    )
  (while (> (getvar "CMDACTIVE") 0) (command ""))
  (setq dic (vlax-ename->vla-object (entlast)))
  (vla-put-TextString dic
    (strcat (if koeff (strcat "\\px"
                              (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              (car strlist)
;;;              (if abz "\\pa0;" "")
            (apply 'strcat
                   (mapcar '(lambda (x) (strcat "\\P" (if (= (setq i (1+ i)) 1)(if abz "\\pa0;" "")   "")  x)) (cdr strlist))
            ) ;_ end of apply
    ) ;_ end of strcat
  )
    (vla-put-TextHeight dic Htxt)
    dic
  )
  (defun mip-conv-to-str (dat)
      (cond ((= (type dat) 'INT) (setq dat (itoa dat)))
            ((= (type dat) 'REAL) (setq dat (rtos dat 2 12)))
            ((null dat) (setq dat ""))
            (t (setq dat (vl-princ-to-string dat)))
      ) ;_ end of cond
    ) ;_ end of defun
Написал "на коленке" за пару минут, использовал готовую функцию от VVA - draw-mleader.
Так, заранее спасибо уже за попытку помочь, давайте по порядку)

Выноска в примере под углом, потому что так я вижу конечный вариант. На чертеже дорога будет повернута горизонтально, вот и выноску повернул "лицом" к читателю.
Там, где рядом два текста - это места, где стоит дорожный бортовой камень (100.30.15) нижняя отметка - это отметка покрытия проезжей части, а верхняя - отметка верха бортового камня. Где отметка всего одна - это просто отметка поверхности (покрытия тротуара, например или покрытия ПЧ где нет бордюра. На мультивыноску будут выноситься все варианты, и там где одна отметка и там где две. Просто одну отметку в виде текста в данный момент я могу превратить в мультивыноску (есть такой лисп в природе), а вот подхватить вместе с ней вторую отметку - не могу, такой функции в лиспе нет.
Фрагмента не жалко, сюда приложу файл полностью, только геоподоснова скорее всего не подгрузится (она наверно и не нужна).
Приложил файл с тем, что у меня имеется. Все эти отметки в итоге должны занять место на мультивыносках. Стрелка мультивыноски должна приходить в центр точки этих отметок. Где по две отметки - в точку меньшей (покрытия ПЧ).
Других возможных случаев и не приходит в голову... Т.е. либо на мультивыноске две отметки, либо одна. В любом случае присоединение к тексту "с подчеркиванием первой строки" пусть будет. ТЗ не знаю, как еще сформулировать... Алгоритм для кода попробую:
1. В моем понимании удобнее эти блоки разбить на текст через Экспресс Тулз. (это вручную, не через код)
2. Вызываем созданную программку, тыкаем на один текст, тыкаем на второй текст, тыкаем на точку, куда должна приходить стрелка мультивыноски, тыкаем на место, где должна располагаться полка с текстом, задаем угол поворота этой полки. Все. Далее программа не сбивается, запоминая угол поворота полки. Просто тыкаем на текст, на точки и расставляем выноски.
Как-то так я себе это представляю...

----- добавлено через ~1 мин. -----
p.s. сейчас попробую Ваш код

----- добавлено через ~9 мин. -----
попробовал код, работает только "выберите первый текст, выберите второй текст" и все, дальше сбивается)
SeRioOuS вне форума  
 
Непрочитано 14.05.2020, 20:52
#12
skkkk


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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
В моем понимании удобнее эти блоки разбить на текст через Экспресс Тулз. (это вручную, не через код)
Согласен с koMon'ом, что не стоит это делать, потому что проще их программно удалять, не оставляя кишок.
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
попробовал код, работает только "выберите первый текст, выберите второй текст" и все, дальше сбивается)
Что пишет в командной строке?

И где файл?) А лучше - несколько разных, из разных источников, чтоб понять, насколько и что может отличаться. И стиль мультивыноски в файле нужный бы чтоб был.
skkkk вне форума  
 
Автор темы   Непрочитано 14.05.2020, 22:31
#13
SeRioOuS

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


ошибка: неверный тип аргумента: stringp 36

пардон, файл тяжелый был...
Источник к сожалению только один, программа Робур.
Вложения
Тип файла: zip отметки.zip (7.55 Мб, 7 просмотров)
SeRioOuS вне форума  
 
Непрочитано 14.05.2020, 23:16
#14
engngr

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


В самом робуре нельзя нормально проставить метки поверхности? пффф...
Обратитесь к ним на форум.
engngr вне форума  
 
Непрочитано 15.05.2020, 12:44
1 | #15
koMon


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


skkkk,
компилированный лисп.
1. стиль мультивыноски ДОЛЖЕН БЫТЬ ПРАВИЛЬНО определён перед запуском лиспа
2. загружаем и запускаем лисп
2. схематично рисуем прототип мультивыноски НЕ на блоке...
обрабатываются блоки с z координатой в атрибуте z.
Вложения
Тип файла: rar 2Z_Block_to_Mleader.fas.rar (5.6 Кб, 14 просмотров)

Последний раз редактировалось koMon, 15.05.2020 в 14:23.
koMon вне форума  
 
Автор темы   Непрочитано 15.05.2020, 12:54
#16
SeRioOuS

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


Цитата:
Сообщение от koMon Посмотреть сообщение
skkkk,
компилированный лисп.
1. стиль мультивыноски ДОЛЖЕН БЫТЬ ПРАВИЛЬНО определён перед запуском лиспа
2. загружаем и запускаем лисп
2. схематично рисуем прототип мультивыноски НЕ на блоке...
обрабатываются блоки с z координатой в атрибуте z.
спасибо! сейчас опробую)
SeRioOuS вне форума  
 
Автор темы   Непрочитано 15.05.2020, 13:10
#17
SeRioOuS

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


Итак, попробовал. Прикладываю файл, что получилось)
1. Получаются длинные ножки у выносок. Наверно не понял, как правильно схематично нужно отрисовывать мультивыноску.
2. Почти каждая отметка садится на свою выноску. Нужно, чтобы две стоящие рядом отметки садились на одну общую (такие случаи попадаются, но как-то выборочно, не все, что надо).
А так - круто, не ожидал, что все еще и автоматизировать можно на всем чертеже.
Вложения
Тип файла: zip отметки1.zip (7.65 Мб, 5 просмотров)
SeRioOuS вне форума  
 
Непрочитано 15.05.2020, 14:23
#18
Сергей812


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


Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
1. Получаются длинные ножки у выносок. Наверно не понял, как правильно схематично нужно отрисовывать мультивыноску.
потому что исходное ТЗ выглядело так
Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Вызываем созданную программку, тыкаем на один текст, тыкаем на второй текст, тыкаем на точку, куда должна приходить стрелка мультивыноски, тыкаем на место, где должна располагаться полка с текстом, задаем угол поворота этой полки. Все. Далее программа не сбивается, запоминая угол поворота полки. Просто тыкаем на текст, на точки и расставляем выноски.
а в итоге просто берутся параметры образцовой выноски и применяются ко всем, меняя только текст.

Цитата:
Сообщение от SeRioOuS Посмотреть сообщение
Нужно, чтобы две стоящие рядом отметки садились на одну общую (такие случаи попадаются, но как-то выборочно, не все, что надо).
задавайте диаметр/радиус условной окружности - в пределах которой два блока считаются одной группой значений. Или ручками выбирать группой попарно.

p.s. Простая чистка чертежа уменьшает его размер на два порядка)
Сергей812 вне форума  
 
Непрочитано 15.05.2020, 14:24
#19
koMon


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


обновил вложение в #15.
нарисуйте прототип или выноску на СВОБОДНОМ ОТ ВСЕГО месте и далее обведите её по подсказкам лиспа.
koMon вне форума  
 
Непрочитано 15.05.2020, 16:27
#20
skkkk


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


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Подозреваю, что koMon уже что-то колдует, но это не точно
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" "_H" "_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)
)	



Цитата:
Сообщение от Сергей812 Посмотреть сообщение
p.s. Простая чистка чертежа уменьшает его размер на два порядка)
Точно
Вложения
Тип файла: dwg
DWG 2010
отметки с изм.dwg (154.5 Кб, 9 просмотров)

Последний раз редактировалось skkkk, 15.05.2020 в 19:07.
skkkk вне форума  
 
Непрочитано 15.05.2020, 16:36
#21
koMon


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


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

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

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


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

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


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

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


Цитата:
Сообщение от 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
Сообщений: 11,052


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

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Вспомнил сейчас, что при командном создании мультивыноски, которое используется в функции draw-mleader бывают сбои, когда юзер ранее при создании мультивыносок выбирал опции, отличные от тех, что по умолчанию - такой порядок в последствии сохраняется где-то в реестре и впоследствии не срабатывает по стандартному плану. Надо жестко прописывать все опции.
#10 прошел мимо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2020, 19:32
#27
SeRioOuS

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


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


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


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

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

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

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

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


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


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


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


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


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


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


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


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,589


Цитата:
Сообщение от 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