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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выноска в Ревите - Мультивыноска в Автокаде

Выноска в Ревите - Мультивыноска в Автокаде

Ответ
Поиск в этой теме
Непрочитано 19.04.2017, 11:05 #1
Выноска в Ревите - Мультивыноска в Автокаде
AGEL
 
проектировщик ОВ
 
москва
Регистрация: 15.09.2003
Сообщений: 53

При выгрузке из Ревита в Автокад все выноски становятся Текстом.
Как сделать чтобы они стали мультивыносками Автокада?
Просмотров: 6842
 
Непрочитано 19.04.2017, 11:34
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Заново создать мультивыноску в AutoCAD'е.
Программа преобразования до трех однострочных текстов в одну выноску:
Код:
[Выделить все]
(defun C:TXT-MLD ( / echo ceclr lay obj1 obj2 obj3 строка1 строка2 строка3)
(vl-cmdf "_UNDO" "_BE")
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq lay (getvar "CLAYER"))
(setq ceclr (getvar "CECOLOR"))
(setvar "CECOLOR" "ByLayer")
(setq obj1 (car (entsel "\nВыберите текст 1: ")))
(if obj1
    (progn
    (setq строка1 (vlax-get-property (vlax-ename->vla-object obj1) 'TextString))
    (setq obj2 (car (entsel "\nВыберите текст 2 (Enter-конец): ")))
    (setq obj3 (car (entsel "\nВыберите текст 3 (Enter-конец): ")))
    (if obj2 
        (setq строка2 (vlax-get-property (vlax-ename->vla-object obj2) 'TextString))
    ) ; if
    (if obj3 
        (setq строка3 (vlax-get-property (vlax-ename->vla-object obj3) 'TextString))
    ) ; if
       (cond
       ((and obj1 (= obj2 nil) (= obj3 nil))
         (princ "\n Построение мультивыноски: укажите 1-ю и 2-ю точки.")
         (vl-cmdf "_mleader" pause pause строка1)
         (vl-cmdf "_ERASE" obj1 "")
       ) ; cond1
       ((and obj1 obj2 (= obj3 nil))
         (princ "\n Построение мультивыноски: укажите 1-ю и 2-ю точки.")
         (vl-cmdf "_mleader" pause pause (strcat строка1 "\n" строка2))
         (vl-cmdf "_ERASE" obj1 obj2 "")
       ) ; cond2
       ((and obj1 obj3 (= obj2 nil))
         (princ "\n Построение мультивыноски: укажите 1-ю и 2-ю точки.")
         (vl-cmdf "_mleader" pause pause (strcat строка1 "\n" строка3))
         (vl-cmdf "_ERASE" obj1 obj3 "")
       ) ; cond3
       ((and obj1 obj3 obj2)
         (princ "\n Построение мультивыноски: укажите 1-ю и 2-ю точки.")
         (vl-cmdf "_mleader" pause pause (strcat строка1 "\n" строка2 "\n" строка3))
         (vl-cmdf "_ERASE" obj1 obj2 obj3 "")
       ) ; cond4
       ) ; cond
    ) ; progn
    (princ "\nНе выбрана строка 1.")
) ; if 
(vl-cmdf "_UNDO" "_E")
(setvar "CMDECHO" 0)
(setvar "CECOLOR" ceclr)
(setvar "CLAYER" lay)
(princ)
)
Но!
Заранее должны быть созданы стиль текста и стиль мультивыноски.
Profan вне форума  
 
Автор темы   Непрочитано 19.04.2017, 11:55
#3
AGEL

проектировщик ОВ
 
Регистрация: 15.09.2003
москва
Сообщений: 53


А возможно создать Мультивыноску по набору из текстовых строк и линий?
AGEL вне форума  
 
Непрочитано 19.04.2017, 12:24
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Это зависит от стиля мультивыноски.
Profan вне форума  
 
Автор темы   Непрочитано 19.04.2017, 12:45
#5
AGEL

проектировщик ОВ
 
Регистрация: 15.09.2003
москва
Сообщений: 53


Цитата:
Сообщение от Profan Посмотреть сообщение
Это зависит от стиля мультивыноски.
можете прояснить как это зависит? ...если можно поподробнее.

Требуется создать какой то определенный стиль?
AGEL вне форума  
 
Непрочитано 19.04.2017, 15:11
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Поподробнее можно прочитать в Справке или в учебниках. А линии накой впихивать в с мультвыноску, в то время, как мультивыноска сама создает выносные и другие линии? Жалко отрезки, нелепо полученные при сохранении RVT в DWG?
Profan вне форума  
 
Непрочитано 19.04.2017, 15:32
#7
skkkk


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Жалко отрезки, нелепо полученные при сохранении RVT в DWG?
Думаю, что не жалко, а как раз наоборот: их же еще потом надо поудалять
Да и точки надо каждый раз задавать, а отрезки-то уже есть. Их бы и было приятно впихнуть сразу в дело.
Я ошибаюсь, или был где-то код, который брал эти отрезки в оборот? Почему-то не покидает чувство, что где-то такое попадалось, но никак не вспомню, где.
skkkk вне форума  
 
Непрочитано 19.04.2017, 15:42
#8
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от Profan Посмотреть сообщение
А линии накой впихивать в с мультвыноску, в то время, как мультивыноска сама создает выносные и другие линии
Видимо, автор желает видеть код, который будет в некотором смысле читать чертеж по сути и среди кучи разрозненных примитивов определит, какие из TEXT и LINE образуют выноски и автоматически заменит эти группы примитивов (с точки зрения Акада, никак не связанные) на "настоящие" мультивыноски. Вроде того кода, который восстанавливал таблицы (TABLE), разбитые до текста и линий (или изначально так начерченные)

Последний раз редактировалось kp+, 19.04.2017 в 15:49.
kp+ вне форума  
 
Автор темы   Непрочитано 19.04.2017, 15:48
#9
AGEL

проектировщик ОВ
 
Регистрация: 15.09.2003
москва
Сообщений: 53


Кр+, ну в принципе Вы правы....хотелось бы выбрать 1-2 текста.... линии, которые вместе с этими текстами...и получить готовую Мультивыноску.
AGEL вне форума  
 
Непрочитано 19.04.2017, 15:52
#10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от AGEL Посмотреть сообщение
.хотелось бы выбрать 1-2 текста.... линии, которые вместе с этими текстами...и получить готовую Мультивыноску.
это сильно упрощает задачу, и половина решения уже есть в #2
kp+ вне форума  
 
Непрочитано 19.04.2017, 17:42
#11
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Ну, раз линии все равно придется выбирать... так и стереть их нафиг.
Я-то программу делал не для случая сохранения из Revit в AutoCAD, просто у нас оказались продвинутые пользователи, которые в AutoCAD'е чертили выноски в виде палочек и обычных текстов. И кроме таких липовых выносок там всяких палочек (отрезков) были горы, так что показалось мне, что это преступление - навязывать программе выполнять дикий перебор палочек и текстов.
Для меня гораздо серьезной оказалась проблема сохранения объектов MEP из Revit в AutoCAD MEP и ничего, кроме 3D-тел не получается. А ведь, казалось бы - одна контора (Autodesk), однако никакой совместимости объектов MEP (да и других объектов типа выносок) нет.
Profan вне форума  
 
Автор темы   Непрочитано 19.04.2017, 18:45
#12
AGEL

проектировщик ОВ
 
Регистрация: 15.09.2003
москва
Сообщений: 53


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

И тогда я запускаю прогу в текущем слое Выноски и получаю готовый результат.
AGEL вне форума  
 
Непрочитано 20.04.2017, 05:22
#13
Boxa

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


Цитата:
Сообщение от AGEL Посмотреть сообщение
И тогда я запускаю прогу в текущем слое Выноски и получаю готовый результат.
А кодом с окружающими не поделитесь?
Boxa вне форума  
 
Непрочитано 20.04.2017, 07:00
#14
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Вот такой вариант:
Код:
[Выделить все]
;;; Текст и отрезки в мультивыноску
;;; Стили текста и мультивыноски должны быть созданы заранее
(defun C:TXT-L-MLD ( / echo ceclr lay obl ptlo ptle lss obj1 obj2 obj3 строка1 строка2 строка3)
(vl-cmdf "_UNDO" "_BE")
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq lay (getvar "CLAYER"))
(setq ceclr (getvar "CECOLOR"))
(setvar "CECOLOR" "ByLayer")
(setq obl (car (entsel "\nВыберите отрезок типа выносной линии: ")))
(redraw obl 3)
(if (and obl (= (cdr (assoc 0 (entget obl))) "LINE"))
    (progn
    (setq ptlo (cdr (assoc 10 (entget obl))))
    (setq ptle (cdr (assoc 11 (entget obl))))
    (setq lss (ssget "_C" (list (- (nth 0 ptle) 10) (- (nth 1 ptle) 10)) (list (+ (nth 0 ptle) 10) (+ (nth 1 ptle) 10))))
    (setq obj1 (car (entsel "\nВыберите текст 1: ")))
    (if obj1
        (progn
        (redraw obj1 3)
        (setq строка1 (vlax-get-property (vlax-ename->vla-object obj1) 'TextString))
        (setq obj2 (car (entsel "\nВыберите текст 2 (Enter-конец): ")))
        (if obj2 (redraw obj2 3))
        (setq obj3 (car (entsel "\nВыберите текст 3 (Enter-конец): ")))
        (if obj3 (redraw obj3 3))
        (if obj2 
            (setq строка2 (vlax-get-property (vlax-ename->vla-object obj2) 'TextString))
        ) ; if
        (if obj3 
            (setq строка3 (vlax-get-property (vlax-ename->vla-object obj3) 'TextString))
        ) ; if
           (cond
           ((and obj1 (= obj2 nil) (= obj3 nil))
             (vl-cmdf "_mleader" ptlo ptle строка1)
             (vl-cmdf "_ERASE" obj1 "")
           ) ; cond1
           ((and obj1 obj2 (= obj3 nil))
             (vl-cmdf "_mleader" ptlo ptle (strcat строка1 "\n" строка2))
             (vl-cmdf "_ERASE" obj1 obj2 "")
           ) ; cond2
           ((and obj1 obj3 (= obj2 nil))
             (vl-cmdf "_mleader" ptlo ptle (strcat строка1 "\n" строка3))
             (vl-cmdf "_ERASE" obj1 obj3 "")
           ) ; cond3
           ((and obj1 obj3 obj2)
             (vl-cmdf "_mleader" ptlo ptle (strcat строка1 "\n" строка2 "\n" строка3))
             (vl-cmdf "_ERASE" obj1 obj2 obj3 "")
           ) ; cond4
           ) ; cond
        (vl-cmdf "_ERASE" lss "")
        ) ; progn
        (princ "\nНе выбрана строка 1.")
    ) ; if 
    ) ; progn
    (princ "\nЭто не отрезок.")
) ; if
(vl-cmdf "_UNDO" "_E")
(setvar "CMDECHO" 0)
(setvar "CECOLOR" ceclr)
(setvar "CLAYER" lay)
(princ)
)
Сначала надо указать отрезок, который соответствует выносной линии выноски, потом тексты сверху вниз. Если есть отрезок, соответствующий полке, то он стирается вместе с отрезком, соответствующим выносной линии и из которого берутся только координаты начала и конца.
Повторяю: стили текста и мультивыноски должны быть созданы заранее и сделаны текущими.
Это простейший вариант, при желании (которого нет) можно и улучшить...

Последний раз редактировалось Profan, 20.04.2017 в 14:56.
Profan вне форума  
 
Непрочитано 20.04.2017, 12:04
#15
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


Есть такой макрос. Когда то заказывал под свои реалии. Т.е. тип текста - Мтекст, слой на котором они должны находиться, и так же должен быть настроен текущий стиль мультилидера.

Можно выбрать сразу много объектов.

Думаю примерно то, что вы ищите.
Есть ещё код, который делает выноску из двух текстов (над и под выноской), но там несколько иные исходные примитивы для преображения.

К сожалению, автор этого кода более не доступен. Но думаю, он был бы не против такого распространения.


Код:
[Выделить все]
 
 ;******************************************************
 ;PSW - 2016  E-mail [email protected]
 ; Отрисовка Мультивыноски
 ;******************************************************
(defun C:P2  (/ A1 A2 B CENTR J KL L1 L2 LINIA M1 M2 M3
	      M4 MOB MTEXT NL NNN NZ OBJ OLD PT_LIST
	      PZ_LIST SL SL2 SLOY SS SSSS ST T01 T02
	      T03 T04 TE1 TE2 VL1 VL2 VLINIA Z01 _MAXP _MINP _T1 _T2)
 ;******************************************************
 (vl-load-com)  
 (setq Old (getvar "OsMode"))
 (Setvar "OsMode" 0)
 (Setvar "CMDECHO" 0)
 (setvar "CLAYER" "Обозначение (ISO)")
   (prompt "\nВыберите рамкой объекты: ")
	(setq SSSS (ssget))
(if (= SSSS Nil) (progn (alert "Нет примитивов на слое <Обозначение (ISO)> для обработки выносок!") (exit))) ; если объектов нет завершаем работу
    (setq NNN (sslength SSSS))
 ;*************************************************
(setvar "CLAYER" "Обозначение (ISO)") ; слой должен существовать  
    (setq j 0)
    (setq KL 0)
    (repeat NNN ; Цикл по всем выбранным дугам
		        (setq A1 (ssname SSSS j))
		        (setq j (+ 1 j))
		        (setq A2 (entget A1))
		        (setq MTEXT  (cdr (assoc 0 A2))) ;  TEXT
		        (setq Sloy   (cdr (assoc 8 A2))) ;  Слой
		        (setq TE1    (cdr (assoc 1 A2))) ;  Текст выноски
		      
		(if (and (= MTEXT "MTEXT") (= Sloy   "Обозначение (ISO)") ) ; Ищеи Мтекст
		  (progn
		        (setq Centr (cdr (assoc 10 A2))) ; центр вставки текста
		;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  
		;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		    ; Ищем горизонтальную линию под текстом
		        (setq T01 (dekart Centr 0.0 -2.5 0.0))
		        (setq T02 (dekart Centr 0.0 -5.0 0.0))
			(setq pt_list (list T01 T02 )) 
		        (setq SS (ssget "_F" pt_list ))
		    (setq linia (ssname SS 0))
		    (setq L1 (cdr (assoc 10 (entget Linia)))) ; точки горизонтальной линии
		    (setq L2 (cdr (assoc 11 (entget Linia))))
		        ; Строим точки по для определение пересечения с линией выноски
		        (setq T01 (dekart (List (min (car L1) (car L2)) (cadr L1) 0.0 ) -0.005  -0.005 0.0))
		        (setq T02 (dekart (List (min (car L1) (car L2)) (cadr L1) 0.0 ) -0.005   0.005 0.0))
		        (setq T03 (dekart (List (max (car L1) (car L2)) (cadr L1) 0.0 )  0.005   0.005 0.0))
		        (setq T04 (dekart (List (max (car L1) (car L2)) (cadr L1) 0.0 )  0.005  -0.005 0.0))

		        (setq Z01 (dekart (seredina L1 L2) 0.0 -0.1 0.0))
                        ;(command "_PLINE" T01 T02 T03 T04 "")
		    
		        (setq pt_list (list T01 T02 T03 T04 T01))  
		    	(setq SL (ssget "_F" pt_list ))
		        (setq NL (sslength SL))

		        (setq T01 (dekart T01 0.0 -2.0 0.0))
		        (setq T04 (dekart T04 0.0 -2.0 0.0))
		        (setq pZ_list (list T01 Z01 T04 ))  
		        (setq NZ (ssget "_F" pZ_list ))
		    ;(command "_PLINE" T01 Z01 T04 "")
				;########################################################################
				    ; если только одна линия в наборе
				    (if (and (>= NL 1) (= NZ nil))
				      (progn
					    (setq Vlinia (ssname SL 0))
					    (setq VL1 (cdr (assoc 10 (entget VLinia))))
					    (setq VL2 (cdr (assoc 11 (entget VLinia))))
				            (if (= (cadr VL1) (cadr L1)) (setq M1 VL2) (setq M1 VL1))
					    (if (> (distance L1 M1) (distance L2 M1)) (setq M2 L2) (setq M2 L1))
					     ;(command "_MLEADER" M1 M2 (strcat TE1 "\n" TE2) )
					(if (/= (car VL1) (car VL2))
					  (progn
					     (command "_MLEADER" M1 M2 TE1 ) (setq Mob (entlast))
					     (setq b (vlax-ename->vla-object (entlast)))
				             (vlax-put-property b   'TextJustify  2)
					  
					     (if (< (car M2) (car M1)) (command "_MOVE" Mob "" (List 0.0 0.0 0.0 ) (list 0.72 0.0 0.0)))
					     (entdel Vlinia)
					     (entdel linia)
					     (entdel A1)
					    ))
					))
				  ;########################################################################
				    ; если только две линии в наборе и одна из них вертикальна
				    (if (and (>= NL 1) (/= NZ nil))
				      (progn
					  (setq pt_list (list T01 T02 T03 T04 ))  
				      	  (setq SL2 (ssget "_F" pt_list ))
				          (setq NL (sslength SL2))
				          (setq Vlinia (ssname SL2 0))
					    (setq VL1 (cdr (assoc 10 (entget VLinia))))
					    (setq VL2 (cdr (assoc 11 (entget VLinia))))
				            (if (= (cadr VL1) (cadr L1)) (setq M1 VL2) (setq M1 VL1))
					    (if (> (distance L1 M1) (distance L2 M1)) (setq M2 L2) (setq M2 L1))

					; находим второй Mtext под выноской
				        (setq T01 (dekart (List (min (car L1) (car L2)) (cadr L1) 0.0 ) -1.0 -1.0 0.0))
				        (setq T02 (dekart (List (max (car L1) (car L2)) (cadr L1) 0.0 )  1.0  -8.0 0.0))
				        (setq pt_list (list T01 T02 ))  
				    	(setq ST (ssget "_W" T01 T02 ))
				        (setq Te2 (cdr (assoc 1 (entget (ssname ST 0)))))
					
					     (command "_MLEADER" M1 M2 (strcat TE1 "\n" TE2)) (setq Mob (entlast))

					
					    (setq b (vlax-ename->vla-object (entlast)))
				            (vlax-put-property b   'TextJustify  2)
        (setq obj (vlax-ename->vla-object (entlast)))
	(vla-GetBoundingBox obj '_minp '_maxp)
	(setq _T1 (vlax-safearray->List _minp))
	(setq _T2 (vlax-safearray->List _maxp))
				(if (< (car M2) (car M1)) (setq M4 (car _t1)) (setq M4 (car _t2)))
					(setq M3 (dekart M2 0.0 -5.0 0.0))
					(setq M4 (list M4 (cadr M3 ) 0.0 ))

						
					(entdel Vlinia)
					(entdel linia)
					(entdel A1)
					(setq T01 (dekart T01 0.0 2.0 0.0))
					(setq T02 (dekart T02 0.0 -2.0 0.0))
					    	(setq ST (ssget "_W" T01 T02))
					(command "_ERASE" ST "")
					(command "_PLINE" M2 "_w" 0.0 0.0  M3 M4 "")
					(if (< (car M2) (car M1)) (command "_MOVE" Mob "" (List 0.0 0.0 0.0 ) (list 0.72 0.0 0.0)))
					))
		  ;########################################################################
		;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		    )) ; IF MTEXT
); REPEAT NNN

  (Setvar "OsMode" Old)
     (SetVar "FILEDIA" 1) (princ)
 ) ; END DEFUN





 ;************************************************************************
 ; Функция возвращает: Точку середины отрезка Т1 Т2
 ; Параметр  - точки Т1 Т2
 ;************************************************************************
(defun SEREDINA (TE1 TE2 / _AA _DX _DY _DZ)
    (setq _DX (/ (+ (car TE1) (car TE2)) 2.0))
    (setq _DY (/ (+ (cadr TE1) (cadr TE2)) 2.0))
    (setq _DZ 0.0)
    (if (and (/= (caddr TE1) NIL) (/= (caddr TE2) NIL))
        (progn
            (setq _DZ (/ (+ (caddr TE1) (caddr TE2)) 2.0))
        )
    )
    (setq _AA (list _DX _DY _DZ))
) ;END DEFUN
 ;************************************************************************




 ;************************************************************************
 ; Функция возвращает точку со смещением от заданной точки на DX, DY, DZ
 ; Параметр  - точка, смещение по Х, смещение по Y, смещение по Z.
 ;************************************************************************
(defun DEKART (TE1 DEX DEY DEZ / AA ZZ)
    (setq ZZ (caddr TE1))
    (if (= ZZ NIL)
        (setq ZZ 0.0)
    )
    (setq AA (list (+ (car TE1) DEX) (+ (cadr TE1) DEY) (+ ZZ DEZ)))
    
) ;END DEFUN
 ;************************************************************************




Последний раз редактировалось ssn, 20.04.2017 в 12:55.
ssn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выноска в Ревите - Мультивыноска в Автокаде

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Выноска в Ревите - Мультивыноска в Автокаде AGEL Revit 0 19.04.2017 10:49
Группировка размеров в Автокаде, возможно ли такое? erikbond AutoCAD 3 31.08.2014 23:31
Не увеличивается текст над линейным размером в 2006 автокаде rtyu AutoCAD 5 19.06.2012 11:33
VBA в 2010 автокаде не дожидается завершения предыдущей команды NomadV Программирование 2 13.11.2009 22:30