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

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

Как на Автолиспе узнать текущее пространство?

Ответ
Поиск в этой теме
Непрочитано 14.06.2008, 12:46 #1
Как на Автолиспе узнать текущее пространство?
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Мне надо определить где я нахожусь. В модели или в каком-то листе. Если в листе, то в каком. И список имеющихся листов тоже надо как-то получить. Может есть у кого наработка по этому поводу?
Просмотров: 3391
 
Непрочитано 14.06.2008, 14:22
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Я обычно использую такой шаблон:

Код:
[Выделить все]
 (vl-load-com)
  (or acapp
      (setq acapp (vlax-get-acad-object))
  )
  (or adoc
      (setq adoc (vla-get-activedocument acapp))
  )
(or acsp
      (setq acsp (if (= (getvar "CVPORT") 1)
		   (vla-get-paperspace
		     adoc)
		   (vla-get-modelspace
		     adoc)
		   )
	    )
      )

(vla-startundomark adoc)
<< остальной код программы >>
(vla-endundomark adoc)
(princ)
)
Узнать имя вкладки можно с помощью:

Код:
[Выделить все]
(getvar "CTAB")
или

Код:
[Выделить все]
(vla-get-name (vla-get-activelayout adoc))
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 14.06.2008, 14:53
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


ОГРОМНОЕ СПАСИБО!!!
Supermax вне форума  
 
Непрочитано 14.06.2008, 14:57
#4
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Успехов

~'J'~
fixo вне форума  
 
Непрочитано 15.06.2008, 00:26
#5
Кулик Алексей aka kpblc
Moderator

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


Хотя уже и поздновато, но... http://www.arcada.com.ua/forum/viewtopic.php?t=486
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.11.2012, 12:29
#6
makxvl


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


Здравствуйте!!!
В поиске по форуму это сообщение оказалось ближайшим к моей проблеме, поэтому буду спрашивать тут

суть программки: вставка отдельно лежащего файла как блока по средствам метода vla-InsertBlock..но с возможностью вставки его и в пространство модели и в пространство листа.
для определения активного пространства использую функцию описанную в #5 (хотя пробывалась и конструкция из #2 ..но увы результат одинаковый)
без выбора пространства с конкретной ссылкой на модель работает все правильно, без сбоев и ошибок...при использовании выбора выдается ошибка:

ошибка: ActiveX Server возвратил ошибку: неизвестное имя: InsertBlock

поиск мне не помог с такой проблемой..подскажите пожалуйста в чем может быть проблемка?
makxvl вне форума  
 
Непрочитано 02.11.2012, 12:46
#7
Дима_

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


Цитата:
Сообщение от makxvl Посмотреть сообщение
ошибка: ActiveX Server возвратил ошибку: неизвестное имя: InsertBlock
Код где - на кофейной гуще гадать?
по ней - скорее всего пытаешься применить InsertBlock к имени типа "ModelSpace" а не к самой модели/листу.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.11.2012, 12:59
#8
makxvl


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


Код программы:

Код:
[Выделить все]
 ;|============================================|;
(defun c:ps ( / cmdold pt1 pt2 kol_strok ms_podpis adoc familiya k i spisok_Y spisok_Y_nomera y y_nomer name)
(vl-load-com)
(setq cmdold (getvar "cmdecho"))    
(setvar "cmdecho" 0)
  
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  
(if  (and (zerop (vla-get-activespace adoc)); 0 - пространство листа, 1 - модели
       (= :vlax-false (vla-get-mspace adoc)); :vlax-false  - активен листб если истина - модель
       ) ;_ end of and
      (vla-get-paperspace adoc)
      (vla-get-modelspace adoc)
) ;_ end of if
(vla-startundomark adoc) 
(princ "\n     Выберете фамилии         ")(princ "\n")
	 (setq pt1  (getpoint "     Первая точка         ")) 
	 (setq pt2  (getcorner pt1 "\n     Вторая точка         "))
  
(setq ms_podpis (/ (abs (- (car pt2) (car pt1))) 20))	             ; количество строк
(setq kol_strok (/ (abs (- (cadr pt2) (cadr pt1))) (* 5 ms_podpis))) ; масштаб рамки

(vl-cmdf "_zoom" "_w" pt1 pt2) ; зуммируем то что будем выделять
; формируем набор 
  	(setq familiya
	       (ssget "_C" pt1 pt2 '((0 . "*TEXT")));SSGET
	)
(vl-cmdf "_zoom" "_p")   ; возвращаем предыдущий экран

(vybor_koordinat_familii familiya) ; Выбор координат
  
;вторая точка первой строки  
(setq pt2 (list (car pt2) (- (cadr pt1) (* 5 ms_podpis)))
      k 0
      i 0)

(while (> kol_strok k)
(setq y (nth i spisok_Y))
(if (> (cadr pt1) y (cadr pt2))
  (progn
      (setq y_nomer (nth i spisok_Y_nomera))
	(setq name (vl-princ-to-string (CDR (ASSOC 1 (entget (ssname familiya y_nomer))))))  ;(свойство 1 - значение текстовой строки)
	(setq name (strcat "D:\\my_settings_for_AutoCAD\\Подписи\\" name ".dwg"))
	(vla-InsertBlock adoc (vlax-3d-point pt2) name ms_podpis ms_podpis ms_podpis 0)
        (setq i (1+ i))
  ); progn
); if
; изменяем исходные точки
(setq pt1 (list (car pt1) (cadr pt2))      
      pt2 (list (car pt2) (- (cadr pt1) (* 5 ms_podpis)))
); setq
   
(setq k (1+ k))									  
); while

(vla-endundomark adoc) 

(setvar "cmdecho" cmdold)
(princ)  
); defun vvod_familii
;|=======================================|;


;|=======================================|;
(defun vybor_koordinat_familii ( familiya / )
(setq k 0)  
(while (>= (1- (sslength familiya)) k)
	  (setq y (CADDR (ASSOC 10 (entget (ssname familiya k)))))        ; вытаскиваем y элемента
  	  (setq spisok_Y (append spisok_Y (list y))) ; Добавляем список координаты к списку общему
(setq k (1+ k))
);while
     (setq spisok_Y_nomera (vl-sort-i spisok_Y '>)); сортирует номера y по убыванию, spisok_Y список номеров правильной послед
     (setq spisok_Y (vl-sort spisok_Y '>)); сортирует  y по убыванию, spisok_Y список номеров правильной послед
);defun


Не судите строго, я совсем недавно изучаю Лисп

Последний раз редактировалось Кулик Алексей aka kpblc, 02.11.2012 в 13:17.
makxvl вне форума  
 
Непрочитано 02.11.2012, 13:14
1 | #9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от makxvl Посмотреть сообщение
Не судите строго
Документ не имеет метод InsertBlock!
Цитата:
Сообщение от makxvl Посмотреть сообщение
(if (and (zerop (vla-get-activespace adoc)); 0 - пространство листа, 1 - модели
(= :vlax-false (vla-get-mspace adoc)); :vlax-false - активен листб если истина - модель
) ;_ end of and
(vla-get-paperspace adoc)
(vla-get-modelspace adoc)
) ;_ end of if
Вычисления без присваивания!

вероятно так:
Код:
[Выделить все]
    (setq aspc (vla-get-Block
		 (vla-get-activeLayout
		   (setq
		     adoc (vla-get-activedocument (vlax-get-acad-object))
		   )
		 )
	       )
    ) ;_ end of if
и
Код:
[Выделить все]
 (vla-InsertBlock
	  aspc
	  (vlax-3d-point pt2)
	  name
	  ms_podpis
	  ms_podpis
	  ms_podpis
	  0
	)
gomer вне форума  
 
Непрочитано 02.11.2012, 13:25
#10
makxvl


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


с 4-го прочтения осознала смысл фразы "Вычисления без присваивания!"

спасибо большое за помощь...поняла и свою ошубку и вашу конструкцию

все работает

А еще не подскажите про сообщения вида

Повторное определение блока _ArchTick пропущено.
Повторное определение блока _Open30 пропущено.
Повторное определение блока A$C0E365804 пропущено.

Искала на форуме...конкретно ответа так и не нашлось...с чем они могут быть связаны и как их преодолеть?
makxvl вне форума  
 
Непрочитано 02.11.2012, 13:34
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от makxvl Посмотреть сообщение
А еще не подскажите про сообщения вида

Повторное определение блока _ArchTick пропущено.
Повторное определение блока _Open30 пропущено.
Повторное определение блока A$C0E365804 пропущено.

Искала на форуме...конкретно ответа так и не нашлось...с чем они могут быть связаны и как их преодолеть?
Имена указанных блоков уже есть в dwg-файле, в который вы вставляете свой файл. Ничего страшного в этом нет пока это одни и те же блоки.
Чтобы этого сообщения не было необходимо удалить или переименовать совпадающие имена блоков.
Александр Ривилис вне форума  
 
Непрочитано 02.11.2012, 13:39
#12
makxvl


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


Спасибо большое. теперь все сомнения развеяны окончательно
makxvl вне форума  
 
Непрочитано 26.08.2020, 15:47
#13
modest-bp


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


Здравствуйте!
Правильно ли я понимаю, что можно обойтись и без VLA, заменив (vla-get-activespace) на проверку переменной TILEMODE простым (getvar 'TILEMODE)?
Вроде бы, на выходе точно так же получим 1 - в пространстве модели и 0 - в пространстве листа (в т.ч. внутри вьюпорта на листе). Или у этого способа есть какие-то не совсем очевидные ограничения/недостатки?
modest-bp вне форума  
 
Непрочитано 26.08.2020, 15:54
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Пара системных переменных TILEMODE и CVPORT помогут тебе определится.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как на Автолиспе узнать текущее пространство?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторы LCD CRT Разное 94 17.06.2008 10:51
как узнать координаты всех объектов в определенных слоях? kikach Программирование 2 04.01.2008 11:54
как узнать сколько layout в файле текущем DWG файле VBA sf Программирование 1 09.03.2005 12:36
Как узнать полилиния, построена по часов стрелке или против Paradox Программирование 2 01.02.2005 15:53