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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание полилинии в листе и Подрезка PViewport

Создание полилинии в листе и Подрезка PViewport

Ответ
Поиск в этой теме
Непрочитано 31.08.2008, 21:05 #1
Создание полилинии в листе и Подрезка PViewport
DANZZ
 
Проектировщик
 
Омск
Регистрация: 05.05.2006
Сообщений: 91

Вопрос №1:
Почему все полилинии создаются в первой вкладке "Лист 1"? хотя задумано чтоб в каждой вкладке создавалась своя полилиния
Вопрос №2:
Есть полилиния и есть видовой экран в конкретной вкладке, как подрезать видовой экран по полилинии?

Функция pl:Point_Rectang вычисляет координаты вершин полилиний в пространстве модели и переводит их в координаты в пространстве Листа

Код:
[Выделить все]
(setq name_layout "Лист ")
  (setq i 1)
  (while (<= i num_Layots)
  	(setq name_layout (strcat name_layout (rtos i 2 0))) 
  	(vl-catch-all-apply '(lambda () (vla-add (vla-get-layouts active_document) name_layout)))
    	(vla-put-ActiveLayout active_document (vla-item (vla-get-layouts active_document) name_layout))
    	(vlax-for vp (vla-get-paperSpace active_document)
   		(if (= (vla-get-ObjectName vp) "AcDbViewport")
		  	(progn
		  		(vla-put-layer vp "Граница")
			  	(setq Rectang (nth (- i 1) List_Rectang))
			  	(setq temp (pl:Point_Rectang Rectang))
			  	(setq temp (apply 'append (mapcar 'list (mapcar 'car temp)(mapcar 'cadr temp))))
				(setq temp (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 9)) temp)))      
			  	(setq rec (vla-AddLightWeightPolyline paper_space temp))
			  	(vla-put-Closed rec :vlax-true)
			  	(vla-ZoomExtents (vlax-get-acad-object))
			)
		)  
    	)
  	(setq i (+ i 1))
 	(setq name_layout "Лист ")
  )
Просмотров: 5578
 
Непрочитано 01.09.2008, 10:37
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Попасть на конкретный лайаут можно например так:
Код:
[Выделить все]
(setq paper_space
      (vla-get-block
       (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
                 "Лист2" ;_ имя лайаута
       )
      )
)
(setq rec (vla-addlightweightpolyline
           paper_space
           (vlax-make-variant
            (vlax-safearray-fill
             (vlax-make-safearray vlax-vbdouble '(0 . 7))
             '(0.0 0.0 200.0 0.0 200.0 150.0 0.0 150.0)
            )
           )
          )
)
(vla-put-closed rec :vlax-true)
С подрезкой, помню что возился как-то, но вот чем кончилось... увы не помню - давно не требовалось.
Alaspher вне форума  
 
Непрочитано 01.09.2008, 10:52
#3
VVA

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


Прочитай координаты полилинии, trans в текущую ПСК, и скормить координаты _.VPCLIP
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 01.09.2008, 13:22
#4
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


а если не _.VPCLIP.
c помощью vla- какнить можно? красивее както
DANZZ вне форума  
 
Автор темы   Непрочитано 01.09.2008, 19:28
#5
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


Спасибо Alaspher, полилиния создается там где нужно, но вот подрезка не работает, думаю причина в том что в пространстве листа 2 объекта с именем "AcDbViewport" (две полилинии одинаковых выводится, значит (vlax-for vp (vla-get-paperSpace active_document)
(if (= (vla-get-ObjectName vp) "AcDbViewport") два раза прокручивается в одном лайуте), причем 1й невидимый, типа условный, получается я его подставляю в (vl-cmdf "_.VPCLIP" vp rec) и акад выдает ошибку:

Команда: _.VPCLIP
*Неверный выбор*
Требуется точка/ или Последний/Группа
Команда: Неверный подрезающий объект.
Выберите объект для подрезки видового экрана: Неверно: Контур подрезки не
входит в регенерируемую область.
Выберите объект для подрезки видового экрана:
Команда: Выполняется регенерация листов.
Выполняется регенерация листов.
Регенерация модели - кэширование видовых экранов.

Код:
[Выделить все]
(setq name_layout "Лист ")
  (setq i 1)
  (while (<= i num_Layots)
  	(setq name_layout (strcat name_layout (rtos i 2 0))) 
  	(vl-catch-all-apply '(lambda () (vla-add (vla-get-layouts active_document) name_layout)))
    	(vla-put-ActiveLayout active_document (vla-item (vla-get-layouts active_document) name_layout))
    	(setq paper_space (vla-get-Block (vla-item (vla-get-layouts active_document) name_layout)))
    	(vlax-for vp (vla-get-paperSpace active_document)
   		(if (= (vla-get-ObjectName vp) "AcDbViewport")
		  	(progn
		  		(vla-put-layer vp "Граница")
			  	(setq Rectang (nth (- i 1) List_Rectang))
			  	(setq temp (pl:Point_Rectang Rectang))
			  	(setq temp (apply 'append (mapcar 'list (mapcar 'car temp)(mapcar 'cadr temp))))
				(setq temp (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 9)) temp)))      
			  	(setq rec (vla-AddLightWeightPolyline paper_space temp))
			  	(vla-put-Closed rec :vlax-true)
			  	(setq vp (vlax-vla-object->ename vp))
			  	(setq rec (vlax-vla-object->ename rec))
			  	(vl-cmdf "_.VPCLIP" vp rec)
			  	(vla-ZoomExtents (vlax-get-acad-object))
			)
		)  
    	)
  	(setq i (+ i 1))
 	(setq name_layout "Лист ")
  )
Как отфильтровать ненужный "AcDbViewport"?
DANZZ вне форума  
 
Автор темы   Непрочитано 01.09.2008, 19:41
#6
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


вот так всегда, только напишу и сразу нахожу вариант решения задачки, нужно просто добавить проверку (if (= (vla-get-UCSIconOn vp) :vlax-false) и все сразу заработало
DANZZ вне форума  
 
Непрочитано 01.09.2008, 23:47
#7
Кулик Алексей aka kpblc
Moderator

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


Я бы делал не так:
Код:
[Выделить все]
(defun test01 (/ adoc space res)
  (setq
    space (vla-get-block
            (vla-item
              (vla-get-layouts
                (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
                ) ;_ end of vla-get-Layouts
              (getvar "ctab")
              ) ;_ end of vla-item
            ) ;_ end of vla-get-block
    ) ;_ end of setq
  (vlax-for ent space
    (if (wcmatch (strcase (vla-get-objectname ent)) "*VIEW*")
      (setq res (cons ent res))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (cdr (reverse res))
  ) ;_ end of defun

(defun test02 (/ adoc space res)
  (setq
    space (vla-get-block
            (vla-item
              (vla-get-layouts
                (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
                ) ;_ end of vla-get-Layouts
              (getvar "ctab")
              ) ;_ end of vla-item
            ) ;_ end of vla-get-block
    ) ;_ end of setq
  (vlax-for ent space
    (if (wcmatch (strcase (vla-get-objectname ent)) "*VIEW*")
      (setq res (cons ent res))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vl-remove-if
    '(lambda (x) (= (cdr (assoc 69 (entget (vlax-vla-object->ename x)))) 1))
    (reverse res)
    ) ;_ end of vl-remove-if
  ) ;_ end of defun
Второй вариант более надежный, но и помедленнее будет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.09.2008, 10:10
#8
VVA

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


DANZZ,
Цитата:
думаю причина в том что в пространстве листа 2 объекта с именем "AcDbViewport"
Правильно, и первый надо пропускать всегда (признак - значение поля 69 = 1). Обрати внимание на этот фрагмент у Алексея
Код:
[Выделить все]
(vl-remove-if
    '(lambda (x) (= (cdr (assoc 69 (entget (vlax-vla-object->ename x)))) 1))
    (reverse res)
    ) ;_ end of vl-remove-if
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.09.2008, 18:52
#9
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


Спасибо за ответы
возник еще один вопрос

Почему при применении (vla-delete rec) после (vl-cmdf "_.VPCLIP" (vlax-vla-object->ename vp) (vlax-vla-object->ename rec)) удаляется не только полилиния а еще и видовой экран?
DANZZ вне форума  
 
Непрочитано 02.09.2008, 19:01
#10
Кулик Алексей aka kpblc
Moderator

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


Они между собой связаны внутренними реакторами, по-моему.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.09.2008, 19:22
#11
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


и как с эим быть? этож после каждого запуска добавляется еще полилиния и колличесвто будет постоянно расти
DANZZ вне форума  
 
Непрочитано 03.09.2008, 10:24
#12
VVA

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


Вот два списка одной и той же полилинии. Во втором случае ей подрезан ВЭ.
Цитата:
((-1 . <Имя объекта: 7ef7be10>) (0 . "LWPOLYLINE") (330 . <Имя объекта:
7ef7bce8>) (5 . "42") (100 . "AcDbEntity") (67 . 1) (410 . "Лист1") (8 . "0")
(100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10
73.3218 45.1636) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 163.361 45.1636) (40 .
0.0) (41 . 0.0) (42 . 0.0) (10 163.361 141.648) (40 . 0.0) (41 . 0.0) (42 .
0.0) (10 73.3218 141.648) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))

((-1 . <Имя объекта: 7ef7be10>) (0 . "LWPOLYLINE") (5 . "42") (102 .
"{ACAD_REACTORS") (330 . <Имя объекта: 7ef7be08>) (102 . "}")
(330 . <Имя
объекта: 7ef7bce8>) (100 . "AcDbEntity") (67 . 1) (410 . "Лист1") (8 . "0")
(100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10
73.3218 45.1636) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 163.361 45.1636) (40 .
0.0) (41 . 0.0) (42 . 0.0) (10 163.361 141.648) (40 . 0.0) (41 . 0.0) (42 .
0.0) (10 73.3218 141.648) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
Можно попробывать 2 варианта.
1. Подрезать не полилинией, а точками (точки взять с координат вершин)
2. Убрать выделенное красным и сделать entmod списку полилинии.
Думаю вариант 1 предпочтительнее, раз собираешься ее все равно удалять.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.09.2008, 10:38
#13
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


Цитата:
Сообщение от VVA Посмотреть сообщение
1. Подрезать не полилинией, а точками (точки взять с координат вершин)
удалять.
это лучший вариант, но

Команда: _vpclip
Выберите подрезающий объект или [Многоугольник] <Многоугольник>: м
Начальная точка:
Следующая точка или [Дуга/длИна/Отменить]:
Следующая точка или [Дуга/Замкнуть/длИна/Отменить]:
Следующая точка или [Дуга/Замкнуть/длИна/Отменить]:
Следующая точка иомли [Дуга/Замкнуть/длИна/Отменить]:
Следующая точка или [Дуга/Замкнуть/длИна/Отменить]:
Команда:

Всеравно создается полилиния которая также связана с видовым экран
DANZZ вне форума  
 
Непрочитано 03.09.2008, 11:03
#14
VVA

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


DANZZ, Но это другая полилиния! Или я чего-то не понял?
Или не подрезай ВЭ или не удаляй подрезающую ВЭ полилинию.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.09.2008, 11:19
#15
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


подрезать точками ты имел ввиду это
(vl-cmdf "_.VPCLIP" "м" pt1 pt2 pt3 "з")
или точками это чтото другое?

DANZZ, Но это другая полилиния! Или я чего-то не понял?

полилиния то другая, но она также свзязана реактором с видовым экраном и тогда всеравно нужно менять ее данные, чтоб удалить
DANZZ вне форума  
 
Автор темы   Непрочитано 03.09.2008, 11:20
#16
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


Цитата:
Сообщение от VVA Посмотреть сообщение
Или не подрезай ВЭ или не удаляй подрезающую ВЭ полилинию.
мне надо И подрезать И удалить
DANZZ вне форума  
 
Непрочитано 03.09.2008, 11:28
#17
VVA

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


Делай и то и другое через _VPCLIP

Цитата:
Команда:
ВЭКРЕЗ
Выберите видовой экран для подрезки:
Выберите подрезающий объект или [Многоугольник/Удалить] <Многоугольник>: _d
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.09.2008, 12:03
#18
DANZZ

Проектировщик
 
Регистрация: 05.05.2006
Омск
Сообщений: 91


Понял, спасибо, не заметил что при _VPCLIP к уже связанному видовому экрану то появляется /Удалить
DANZZ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание полилинии в листе и Подрезка PViewport



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание surface из сплайна или полилинии WinDer AutoCAD 2 02.02.2006 10:17