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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Добавление префикса/суффикса к имени слоя, в соответствии со свойством примитива, расположенного на слое

Добавление префикса/суффикса к имени слоя, в соответствии со свойством примитива, расположенного на слое

Ответ
Поиск в этой теме
Непрочитано 28.10.2016, 14:34
Добавление префикса/суффикса к имени слоя, в соответствии со свойством примитива, расположенного на слое
Browning Zed
 
Регистрация: 17.01.2014
Сообщений: 97

Всем доброго дня. Суть: существует слой с определенным именем. К названию этого слоя нужно добавить префикс или суффикс, в этом качестве должны выступать свойства примитивов. Если на слое лежит линия, префиксом/суффиксом является тип линии. Если штриховка, то имя штриховки. Если дин. блок имеет состояния видимости, то в префиксе/суффиксе прописывается название состояния видимости. Есть ли пути решения этого вопроса?
Просмотров: 7122
 
Непрочитано 28.10.2016, 21:40
#21
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Topobase работает с MS SQL Server

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

И вообще, у объектов Civil'а слой прописывается в стилях, их в принципе нельзя не на том слое создать!
trir вне форума  
 
Автор темы   Непрочитано 28.10.2016, 21:49
#22
Browning Zed


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


Это все понятно, и я не прочь работать в Civil. Но что мне делать с уже накопленой базой топопланов? Выбрасывать всё на свалку? Они все выполнены в обычном Автокаде и толком не разделены по слоям. Каким образом мне импортировать их в ГИС? Если перебирать каждый файл по одному слою, неизвестно сколько времени это займет.
Browning Zed вне форума  
 
Непрочитано 28.10.2016, 21:50
#23
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


учи C# и SQL
trir вне форума  
 
Непрочитано 29.10.2016, 12:14
#24
kp+

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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Послушай, бро. Я живу в небольшом уральском городе, где численность населения составляет 10000 чел. Какой PostGIS, какой MS SQL Server? Где я смогу найти контингент разбирающихся в этих вещах? Дай бог бы в MapInfo научить людей работать.
Судя по постам уважаемого ShaggyDoc'а, он что-то подобное в свое время сделал в Кургане, причем на базе голого Акада версий начала 2000-х и СУБД Firebird.

Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Но что мне делать с уже накопленой базой топопланов?
Для начала выложить характерный фрагмент в "сыром" и уже обработанном виде

Последний раз редактировалось kp+, 29.10.2016 в 12:29.
kp+ вне форума  
 
Автор темы   Непрочитано 29.10.2016, 14:04
#25
Browning Zed


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


kp+, попытаюсь объяснить еще раз. Есть файл dwg. В этом файле находится слой ЛЭП. На слое ЛЭП лежит множество линий разных типов, и определенный динамический блок с различными состояниями видимости, много раз повторяющийся. На выходе мне нужно получить несколько слоев образованных из исходного слоя, с префиксом или суффиксом. Например:
ЛЭП_низкого напряжения на застроенной территории
ЛЭП_высокого напряжения на не застроенной территории
ЛЭП_опоры деревянные
ЛЭП_фонарь на ж/б опоре
...ну и т.д. Всё, что идет в суффиксе будет являться типом линии или состоянием видимости блока.
Browning Zed вне форума  
 
Непрочитано 29.10.2016, 14:40
#26
kp+

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


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
kp+, попытаюсь объяснить еще раз. Есть файл dwg. В этом файле находится слой ЛЭП. На слое ЛЭП лежит множество линий разных типов, и определенный динамический блок с различными состояниями видимости, много раз повторяющийся. На выходе мне нужно получить несколько слоев образованных из исходного слоя, с префиксом или суффиксом. Например:
ЛЭП_низкого напряжения на застроенной территории
ЛЭП_высокого напряжения на не застроенной территории
ЛЭП_опоры деревянные
ЛЭП_фонарь на ж/б опоре
...ну и т.д. Всё, что идет в суффиксе будет являться типом линии или состоянием видимости блока.
Хорошо, что Вы объясняете все на словах. Но пока нет примера - это все равно что лечить больного по описанию, даже не по фотографии.
Никто не просит Вас выложить всю базу или даже один полный планшет. Только фрагмент! Но один экземпляр фрагмента "как есть", второй - "как надо".
kp+ вне форума  
 
Автор темы   Непрочитано 29.10.2016, 15:52
#27
Browning Zed


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


kp+, вот, накидал небольшой пример. Исходный чертеж, и как должно быть после преобразования.
Вложения
Тип файла: zip Пример.zip (115.0 Кб, 11 просмотров)
Browning Zed вне форума  
 
Непрочитано 29.10.2016, 16:36
1 | #28
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
На выходе мне нужно получить несколько слоев образованных из исходного слоя, с префиксом или суффиксом. Например:
ЛЭП_низкого напряжения на застроенной территории
ЛЭП_высокого напряжения на не застроенной территории
ЛЭП_опоры деревянные
ЛЭП_фонарь на ж/б опоре
это лучше сделать через OD
trir вне форума  
 
Автор темы   Непрочитано 29.10.2016, 17:00
#29
Browning Zed


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


trir, спасибо, буду пробовать.
Browning Zed вне форума  
 
Непрочитано 29.10.2016, 19:08
#30
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


при экспорте в ГИС-форматы можно экспортировать почти любые Акадовские свойства
trir вне форума  
 
Непрочитано 31.10.2016, 16:09
2 | #31
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Не у каждого есть Civil/Map 3D, да и механизм работы с OD в MAP 3D не очень удобен для решения масштабных задач и сам по себе требует автоматизации. Вот, набросал на ходу кусочек кода для голого автокада, исходя из высказанных пожеланий. Может, пригодится:
Код:
[Выделить все]
 (setq fname(strcat (getvar "DWGPREFIX") "lay_sel.dcl")
      fn (open fname "w"))
(write-line "lay_sel : dialog {label = \"Выбор слоя для обработки\";: popup_list {width=100;key=\"in_lst\";value=\"0\";}ok_cancel;}" fn)
(close fn)
     (setq l nil)
   (while (setq el (tblnext "LAYER" (not el)))
     (setq l (cons (cdr (assoc 2 el)) l)))
   (vl-sort l '<)

(setq dcl_id (load_dialog "lay_sel.dcl")) 
   (if (not (new_dialog "lay_sel" dcl_id)) 
     (exit)				
     )
   (start_list "in_lst" 3)
   (mapcar 'add_list l)
   (end_list)
(action_tile "accept" (strcat"(setq lay_n (atoi (get_tile \"in_lst\")))" "(done_dialog)"))
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete fname)
(setq lay(nth lay_n l))
;выбираем слой, и для всех объектов на слое производим такие манипуляции:
(foreach ent
	 (vl-remove-if 'listp(mapcar 'cadr(ssnamex(ssget "_X" (list(cons 8 lay))))));список объектов на слое
  (progn(setq ed(entget ent))
    (cond
      ((equal(cdr(assoc 0 ed))"INSERT");если блок
       (if(vla-get-IsDynamicBlock(vlax-ename->vla-object ent));проверяем, динамический ли он
	 (if(setq n_str
		   (vl-member-if '(lambda(x)(equal(type(vlax-variant-value(vla-get-value x)))'STR))
(vlax-safearray->list(vlax-variant-value(vla-GetDynamicBlockProperties(vlax-ename->vla-object ent))))))
;и если у него есть строковое значение настраимоего свойства (отобразится при этом только имеющее свойство Show)
;сажаем его на слой, названный исходя из этой строки	   
	   (progn
	   (setq ed(subst(cons 8 (strcat lay "_"(vlax-variant-value(vla-get-Value(car n_str)))))(assoc 8 ed)ed))
	   (entmod ed))
;нет такого свойства - используем для модификации слоя имя блока
	   (progn
	     (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed))
	   );if
	 (progn
	     (setq ed(subst(cons 8 (strcat lay "-" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed));для нединамического блока - тоже имя
	 );if
       )
    ((equal(cdr(assoc 0 ed))"HATCH")(progn
	     (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed));для штриховки - тоже имя
     )
;для всего остального - тип линии      
      (T(progn(if(member(assoc 6 ed)ed);если тип линии не "по слою"
	  (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 6 ed))))(assoc 8 ed)ed))
	(setq ed(subst(cons 8 (strcat lay "_" "непоймичто"))(assoc 8 ed)ed))
		);if
	  (entmod ed))
       ))
  );progn
  );foreach
P_S вне форума  
 
Непрочитано 31.10.2016, 17:04
#32
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Зато OD прекрасно экспортируется в ГИС
trir вне форума  
 
Автор темы   Непрочитано 31.10.2016, 19:22
#33
Browning Zed


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


Цитата:
Сообщение от P_S Посмотреть сообщение
Вот, набросал на ходу кусочек кода для голого автокада, исходя из высказанных пожеланий.
Спасибо вам, огромное. Всё отлично работает!
А нельзя ли ещё добавить условие: если исходный слой после преобразования оказывается пустым, он автоматически удаляется?
Ещё было бы замечательно, если предоставить выбор - или преобразуем один выбранный слой, или все слои разом.

Последний раз редактировалось Browning Zed, 31.10.2016 в 20:29.
Browning Zed вне форума  
 
Непрочитано 01.11.2016, 09:28
1 | #34
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
А нельзя ли ещё добавить условие: если исходный слой после преобразования оказывается пустым, он автоматически удаляется?
Добавь в конец
Код:
[Выделить все]
(repeat 3 (vla-purgeall (vla-get-activedocument (vlax-get-acad-object))))
А в начало
Код:
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 01.11.2016, 12:19
#35
Browning Zed


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


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

VVA, спасибо за помощь. Этот код:
Цитата:
Сообщение от VVA Посмотреть сообщение
(repeat 3 (vla-purgeall (vla-get-activedocument (vlax-get-acad-object))))
удаляет все пустые слои. Можно ли сделать, чтобы удалялся только исходный слой? В AutoCAD Civil несколько пустых слоев зарезервированы под определенные задачи, и выходит так, что работа некоторых инструментов, нарушается.
Browning Zed вне форума  
 
Непрочитано 01.11.2016, 14:57
1 | #36
frostmourn


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


Попробуйте так. С минимальными переделками
Код:
[Выделить все]
 
(defun C:LayPrSuf ( / fname fn el l dcl_id lay_n lay ed n_str)
	(setq fname(strcat (getvar "DWGPREFIX") "lay_sel.dcl")
      fn (open fname "w"))
(write-line "lay_sel : dialog {label = \"Выбор слоя для обработки\";: popup_list {width=100;key=\"in_lst\";value=\"0\";}ok_cancel;}" fn)
(close fn)
     (setq l nil)
   (while (setq el (tblnext "LAYER" (not el)))
     (setq l (cons (cdr (assoc 2 el)) l)))
   (vl-sort l '<)

(setq dcl_id (load_dialog "lay_sel.dcl")) 
   (if (not (new_dialog "lay_sel" dcl_id)) 
     (exit)				
     )
   (start_list "in_lst" 3)
   (mapcar 'add_list l)
   (end_list)
(action_tile "accept" (strcat"(setq lay_n (atoi (get_tile \"in_lst\")))" "(done_dialog)"))
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete fname)
(setq lay(nth lay_n l))
;выбираем слой, и для всех объектов на слое производим такие манипуляции:
(foreach ent
	 (vl-remove-if 'listp(mapcar 'cadr(ssnamex(cond ((ssget "_X" (list(cons 8 lay)))) ((ssadd))))));список объектов на слое
	(setq ed(entget ent))
    (cond
      ((equal(cdr(assoc 0 ed))"INSERT");если блок
       (if(vla-get-IsDynamicBlock(vlax-ename->vla-object ent));проверяем, динамический ли он
	 (if(setq n_str
		   (vl-member-if '(lambda(x)(equal(type(vlax-variant-value(vla-get-value x)))'STR))
(vlax-safearray->list(vlax-variant-value(vla-GetDynamicBlockProperties(vlax-ename->vla-object ent))))))
;и если у него есть строковое значение настраимоего свойства (отобразится при этом только имеющее свойство Show)
;сажаем его на слой, названный исходя из этой строки
	   (progn
	   (setq ed(subst(cons 8 (strcat lay "_"(vlax-variant-value(vla-get-Value(car n_str)))))(assoc 8 ed)ed))
	   (entmod ed))
;нет такого свойства - используем для модификации слоя имя блока
	   (progn
	     (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed))
	   );if
	 (progn
	     (setq ed(subst(cons 8 (strcat lay "-" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed));для нединамического блока - тоже имя
	 );if
       )
    ((equal(cdr(assoc 0 ed))"HATCH")(progn
	     (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 2 ed))))(assoc 8 ed)ed))
	     (entmod ed));для штриховки - тоже имя
     )
;для всего остального - тип линии
      (T
		(if(member(assoc 6 ed)ed);если тип линии не "по слою"
		  (setq ed(subst(cons 8 (strcat lay "_" (cdr(assoc 6 ed))))(assoc 8 ed)ed))
			(setq ed(subst(cons 8 (strcat lay "_" "непоймичто"))(assoc 8 ed)ed))
		);if
		(entmod ed)
       )
   )
  );foreach
	(if
	   (not (ssget "_X" (list(cons 8 lay))))
	   (vlax-for x (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
		   (if (= (vla-get-Name x) lay)
			   (vl-catch-all-apply 'vla-Delete (list x))
		   )
	   )
	)
)
frostmourn вне форума  
 
Автор темы   Непрочитано 01.11.2016, 17:05
#37
Browning Zed


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


frostmourn, спасибо, сейчас работает как нужно.

И ещё. Форумчане, подскажите, кому не трудно, как видоизменить код программы, чтобы был выбор: обрабатывать слои пакетно (все разом) или по одному слою, при этом, слои замороженные, выключенные или блокированные не принимались бы в расчет. И было бы здорово, если добавить в суффикс слоя, также, типы мультилиний, и стили текста и МТекста.
Browning Zed вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Добавление префикса/суффикса к имени слоя, в соответствии со свойством примитива, расположенного на слое



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о имени примитива Zaghim Программирование 5 01.09.2011 14:58
Сокращение Автокадом имени слоя в выпадающем списке 2doo AutoCAD 6 05.12.2008 10:46
английский ACAD2005 в имени файла не понимает русские буквы sv_penza AutoCAD 6 26.04.2007 16:20