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

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

Как сгруппировать координаты объектов по слоям?

Ответ
Поиск в этой теме
Непрочитано 27.04.2018, 07:42 #1
Как сгруппировать координаты объектов по слоям?
OverseerY
 
Регистрация: 25.04.2018
Сообщений: 2

Здравствуйте. Есть задача - экспортировать чертёж в SVG. Я нашел пример с перебором сущностей (полилиний) и получением списка координат и доработал до минимально необходимых требований. Но осталась проблема - в SVG нужно объединять полилинии по слоям в блоки <g id="%название_слоя%"></g>, т.е. для каждого слоя делать обход всех полилиний, пока слои не закончатся, но я не знаю как это сделать в текущем виде. Сейчас у меня слой указывается блоке <metadata /> перед каждой полилинией. Что вы можете подсказать мне?

Код:
[Выделить все]
 
(prompt "\nType \"savesvg\" to run...")
(defun c:savesvg ( / sset item ctr check theobj thelist n xval yval fname fn pa dn)
  (vl-load-com)
  (setq dn (vl-filename-base (getvar "dwgname")))
  (setq pa (getvar "dwgprefix"))
  (setq fname (strcat pa dn ".svg"))
  (setq fn (open fname "w"))
  (write-line "<?xml version=\"1.0\" standalone=\"no\"?>" fn)
  (write-line "<svg viewBox=\"0 -250 500 1000\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill-rule=\"evenodd\" xml:space=\"preserve\" >" fn)
  (write-line "<g clip-path=\"url(#clipId0)\" fill=\"none\" stroke=\"rgb(1,1,1)\" stroke-width=\"0.9\" />" fn)
  (write-line "<g clip-path=\"url(#clipId0)\" fill=\"none\" stroke=\"rgb(1,1,1)\" stroke-width=\"0.9\" >" fn)
  (close fn)
  (while
    (setq sset (ssget))
    (setq ctr 0)
    (repeat (sslength sset)
      (setq item (ssname sset ctr))
      (setq item (vlax-ename->vla-object item))
      (if (= (vlax-get-property item 'ObjectName) "AcDbPolyline")
        (progn
		  (setq lr (vla-get-Layer item))
          (setq thelist (vlax-get-property item 'coordinates))
          (setq thelist (vlax-safearray->list (variant-value thelist)))
          (setq n 0)
          (setq fn (open fname "a"))
		  (write-line (strcat "<metadata id=\"" lr "\" />") fn)
          (write-line "<polygon points=\"" fn)
          (repeat (/ (length thelist) 2)
	    (setq xval (rtos (nth n thelist)))
	    (setq n (1+ n))
	    (setq yval (rtos (nth n thelist)))
	    (write-line (strcat xval "," yval " ") fn)
	    (setq n (1+ n))
          );repeat
          (write-line "\" />" fn)
          (close fn)
        );progn
        (alert "This is not a Polyline! - Please try again")
      );if
      (princ)
      (setq ctr (1+ ctr))
    );repeat
    (setq fn (open fname "a"))
    (write-line "</g>" fn)
    (write-line "</svg>" fn)
    (close fn)
  );while
  (princ)
);defun
(princ)
Просмотров: 2261
 
Непрочитано 27.04.2018, 08:20
#2
trir


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


может не стоит делать это на lisp'е, .net как то удобнее будет...
trir вне форума  
 
Автор темы   Непрочитано 27.04.2018, 10:06
#3
OverseerY


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


Цитата:
Сообщение от trir Посмотреть сообщение
может не стоит делать это на lisp'е, .net как то удобнее будет...
Я .NET для Автокада только-только изучать стал, а работоспособное решение нужно уже сейчас...
Перерыл пол-интернета в поиске того, как конвертировать файлы из автокада в SVG - каких-либо стандартных решений экспорта не нашел, готовые сторонние продукты не подходят - нужен svg, состоящий только из полигонов.
Вот и приходиться искать какие-нибудь костыли и велосипеды
OverseerY вне форума  
 
Непрочитано 27.04.2018, 12:09
1 | #4
koMon


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


Цитата:
Сообщение от OverseerY Посмотреть сообщение
для каждого слоя делать обход всех полилиний
так можно сделать обход всех полилиний во всех слоях

Код:
[Выделить все]
 
	(setq acad_Object (vlax-get-acad-object)
	      document_object (vla-get-ActiveDocument acad_Object)
		  dwg_Layers_Set (vla-get-Layers document_Object)
	)
	(vlax-for layer_item dwg_Layers_Set
		(setq layer_pickset (apply 'ssget (list "_X" (list (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons 8 (vla-get-name layer_item)) (cons -4 "AND>")))))
		(princ (strcat "\nLayer " (vla-get-name layer_item) " has " (if layer_pickset (itoa (sslength layer_pickset)) "0") " polylines"))
	)
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как сгруппировать координаты объектов по слоям?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как просчитать координаты всего чертежа, зная координаты нескольких точек Barsum AutoCAD 6 16.02.2018 09:32
Civil 3D 2017. Как присвоить метки поверхности слоям с сохранением динамичности меток? Gedezuk5 Вертикальные решения на базе AutoCAD 4 18.01.2018 06:40
Единый государственный реестр объектов культурного наследия msv_mnv Поиск литературы, чертежей, моделей и прочих материалов 4 13.11.2017 11:12
Создание объектов в Ревит через DB Link или аналог irbis1 Revit 3 08.05.2017 21:46
Как перевести координаты Модели в координаты Листа? ===AAA=== Программирование 6 24.10.2007 22:09