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

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

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

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

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


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


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


выложите примнр файла до/после
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,665


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


не знаком
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,787


С мультивыносками поосторожнее: 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,767


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


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


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


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

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

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


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


обновил вложение в #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 вне форума  
Ответ
Вернуться   Форум 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