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

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

Два вопроса новичка: Доступ к свойствам полилинии и обработка всех полилиний

Ответ
Поиск в этой теме
Непрочитано 01.11.2012, 18:48 #1
Два вопроса новичка: Доступ к свойствам полилинии и обработка всех полилиний
Иван Морозов
 
Регистрация: 01.11.2012
Сообщений: 3

Всем добрый день.

Кратко задача:
Цитата:
Есть большая карта местности с кучей полилиний. Мне нужно автоматом вытянуть X,Y координаты вершин полилиний.
Каждая полилиния лежит на своем слое со своим уникальным именем.
Что я осилил:
Сначала я погуглил доки - нашел "Мастер извлечения данных", но он не умеет экспортировать геометрию. OKAY.
Хоть я полный профан в лиспе, но программирование мне не чуждо, я полез гуглить скрипты. Нашел один почти подходящий на одном из заморских форумов, который по выбору пользователем полилинии экспортирует X,Y,Z в отдельный текстовый файл:

Код:
[Выделить все]
 
(prompt "\nType \"vlplexport\" to run........")
(defun c:vlplexport ( / theobj thelist n xval yval zval fname fn)
;load the visual lisp extensions
(vl-load-com)
;get the entity and entity name
(setq theobj (car (entsel "\nSelect a Polyline: ")))
;convert to vl object
(setq theobj (vlax-ename->vla-object theobj))
;check if it's a polyline
(if (= (vlax-get-property theobj 'ObjectName) "AcDbPolyline")
;if it is, do the following
(progn
;retrieve the coordinates
(setq thelist (vlax-get-property theobj 'coordinates))
;convert to a list
(setq thelist (vlax-safearray->list  (variant-value thelist)))
;zero the counter
(setq n 0)
;create a text file
(setq fname "infile")
;open it to write
(setq fn (open fname "w"))
;write the header
(write-line "PolyLine X, Y and Z Coordinates" fn)
;underline the header
(write-line "*****************************************" fn)
;start the loop
(repeat (/ (length thelist) 3)
;get the x coordinate
(setq xval (rtos (nth n thelist)))
;increase the counter
(setq n (1+ n))
;get the y coordinate
(setq yval (rtos (nth n thelist)))
;increase the counter
(setq n (1+ n))
;get the z coordinate
(setq zval (rtos (nth n thelist)))
;write the x coordinate to the file
(write-line  (strcat "X-Value : " xval)  fn)
;write the y coordinate to the file
(write-line  (strcat "Y-Value : " yval)  fn)
;write the z coordinate to the file
(write-line  (strcat "z-Value : " zval)  fn)
;add a seperator
(write-line "-----------------------------" fn)
;increase the counter
(setq n (1+ n))
);repeat
;close the file
(close fn)
);progn
;it's not a polyline, inform the user
(alert "This is not a Polyline! - Please try again.")
);if
(princ)
);defun
;------------------------
;clean loading
(princ)
;---------------------------
;End of VL-POLY.LSP
;---------------------------
Источник: http://www.afralisp.net/visual-lisp/...nes-part-1.php

Все хорошо, но полилиний много. Я не против нанять раба, который протыкает вручную все линии и применит эту функцию на каждой. Но.
Чтобы облегчить рабу жизнь, я хочу модифицировать скрипт.

Вопросы:
1) Сейчас скрипт пишет в файл с именем "infile". Я хочу, чтобы имя файла строилось из имени слоя, на котором лежит полилиния.
Подскажите, пожалуйста, как заполучить имя слоя в мою переменную, либо где посмотреть в доках на эту тему. .

2) Как модифицировать этот скрипт, чтобы он сам автоматом обошел все полилинии чертежа, а не обрабатывал только выбранный объект.

Извините, если эти вопросы вам покажутся банальными.
Просмотров: 4051
 
Непрочитано 02.11.2012, 10:54
#2
fasadel


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


Я тоже новичок, но рискну уже дать совет другим. Поэтому прошу сделать скидку на качество рекомендации.

Код:
[Выделить все]
 ; Получаем коллекцию всех объектов в пространстве модели 
(setq theobj (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))

; Перебираем все объекты (entities) в пространстве модели и выбираем полилинии
(vlax-for theobj
		(if  (= (vlax-get-property theobj 'ObjectName) "AcDbPolyline")
			(progn    

                      ; Далее по тексту

                        )
                 )
)
Чтобы получить имя слоя с котором находится полилиния

Код:
[Выделить все]
 (setq fname (vlax-get-property theobj 'Layer))
fasadel вне форума  
 
Непрочитано 02.11.2012, 11:01
#3
Кулик Алексей aka kpblc
Moderator

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


Можно сделать по-другому: из http://forum.dwg.ru/showpost.php?p=188342&postcount=21 взять преобразование набора, полученного через ssget, в список ename-примитивов. И потом уже этот список обрабатывать как хочется.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.11.2012, 11:46
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от fasadel Посмотреть сообщение
Перебираем все объекты (entities) в пространстве модели и выбираем полилинии...
vlax-for ...
Это в VB так "принято", в лиспе-же предпочтительно пользоваться соответствующими методами и структурами (в данном случае списками с дальнейшей чередой фильтраций и преобразований), ибо использывание его как императивного языка возможно, но гораздо менее эффективно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.11.2012, 11:48
#5
VVA

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


Цитата:
Сообщение от Иван Морозов Посмотреть сообщение
Мне нужно автоматом вытянуть X,Y координаты вершин полилиний.
Готовые решения
Экспорт координат выбранных точек в *.txt
Экспорт координат выбранных объектов из AutoCAD в *.txt
Point Manager
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.11.2012, 12:24
#6
Иван Морозов


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


Всем большое спасибо!

p.s. Хотя, пока модератор модерировал тему, я успел вчера сам разобраться.

Имя слоя беру так
Код:
[Выделить все]
 (setq thelayer (vlax-get-property theobj 'Layer))
;create a text file
(setq fname (strcat "points - " thelayer ".txt"))
В цикле обхожу так

Код:
[Выделить все]
 (if (setq ss (ssget "x" (list (cons 0 "*POLYLINE") (cons 410 (getvar "ctab")))))
 (while (setq Ent (ssname ss 0))
  (YourSubHere (entget Ent))
  (ssdel Ent ss)
 )
)
Вроде даже работает!
Иван Морозов вне форума  
 
Непрочитано 02.11.2012, 12:35
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Вот ещё родственная тема...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 02.11.2012, 17:11
#8
Иван Морозов


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Вот ещё родственная тема...
Угу, спасибо, только они там с точками работают, а точки без всяких скриптов успешно экспортятся стандартными средствами автокадика. В любом случае полезная ссылка, если кто-то следующий будет гуглить и наткнется на эту тему.
Иван Морозов вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Два вопроса новичка: Доступ к свойствам полилинии и обработка всех полилиний

Опции темы Поиск в этой теме
Поиск в этой теме:

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