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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Помогите выяснить из-за чего ошибка выходит ошибка.

Autolisp. Помогите выяснить из-за чего ошибка выходит ошибка.

Ответ
Поиск в этой теме
Непрочитано 23.11.2015, 10:38 #1
Autolisp. Помогите выяснить из-за чего ошибка выходит ошибка.
vladimirr_b
 
Регистрация: 24.01.2012
Сообщений: 83

Здравствуйте! В разделе ActiveX справки Автокада в описании команды vla-Select приводится пример программы:
Код:
[Выделить все]
 (vl-load-com)
(defun c:Example_Select()
    ;; This example adds members to a selection set, first by crossing and
    ;; then by filtering for circles.
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))

    ;; Create the selection set
    (setq ssetObj (vla-Add (vla-get-SelectionSets doc) "SSET"))
    
    ;; Add all object to the selection set that lie within a crossing of (28,17,0) and
    ;; (-3.3, -3.6,0)
    (setq mode acSelectionSetCrossing
          corner1 (vlax-3d-point 28 17 0)
          corner2 (vlax-3d-point -3.3 -3.6 0))

    (vla-Select ssetObj mode corner1 corner2)
    (alert (strcat "Objects selected: " (itoa (vla-get-Count ssetObj))))
    (vla-Clear ssetObj)
  
    ;; Add all the Circles to the selection set that lie within the crossing of (28,17,0) and
    ;; (-3.3, -3.6,0) by filtering from the current drawing
    (setq gpCode (vlax-make-safearray vlax-vbInteger '(0 . 0)))
    (vlax-safearray-put-element gpCode 0 0)
    (setq dataValue (vlax-make-safearray vlax-vbVariant '(0 . 0)))
    (vlax-safearray-put-element dataValue 0 "Circle")
    
    (vla-Select ssetObj mode corner1 corner2 gpCode dataValue)
    (alert (strcat "Objects selected: " (itoa (vla-get-Count ssetObj))))

    (vla-Delete ssetObj)
)
При загрузке данного кода консоль выдает "ошибка: Ошибка Automation. Именованный набор объектов уже существует". В чем проблема?
Просмотров: 3645
 
Непрочитано 23.11.2015, 10:43
1 | #2
ProPeller

Пастух
 
Регистрация: 16.07.2012
Питер
Сообщений: 318


Проблема в этой строчке. Нельзя повторно добавлять в список наборов, набор с существующим именем. Первый раз он даст вам указатель, во втрой раз выдаст ошибку.
Код:
[Выделить все]
 (setq ssetObj (vla-Add (vla-get-SelectionSets doc) "SSET"))
__________________
Автоматизация должна быть автоматической.
ProPeller вне форума  
 
Непрочитано 23.11.2015, 10:44
1 | #3
Кулик Алексей aka kpblc
Moderator

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


Значит в текущем документе уже есть такой набор. Сначала надо его удалить (естественно, удалять только при необходимости). Примерно так:
Код:
[Выделить все]
 (vl-load-com)
(defun c:example_select (/ acadobj doc ssetobj mode corner1 corner2 gpcode datavalue)
  ;; This example adds members to a selection set, first by crossing and
  ;; then by filtering for circles.
  (setq acadobj (vlax-get-acad-object))
  (setq doc (vla-get-activedocument acadobj))

  ;; Create the selection set
  (vl-catch-all-apply
    (function
      (lambda ()
        (vla-delete (vla-item (vla-get-selectionsets doc) "SSET"))
        ) ;_ end of lambda
      ) ;_ end of function
    ) ;_ end of vl-catch-all-apply
  (setq ssetobj (vla-add (vla-get-selectionsets doc) "SSET"))

  ;; Add all object to the selection set that lie within a crossing of (28,17,0) and
  ;; (-3.3, -3.6,0)
  (setq mode    acselectionsetcrossing
        corner1 (vlax-3d-point 28 17 0)
        corner2 (vlax-3d-point -3.3 -3.6 0)
        ) ;_ end of setq

  (vla-select ssetobj mode corner1 corner2)
  (alert (strcat "Objects selected: " (itoa (vla-get-count ssetobj))))
  (vla-clear ssetobj)

  ;; Add all the Circles to the selection set that lie within the crossing of (28,17,0) and
  ;; (-3.3, -3.6,0) by filtering from the current drawing
  (setq gpcode (vlax-make-safearray vlax-vbinteger '(0 . 0)))
  (vlax-safearray-put-element gpcode 0 0)
  (setq datavalue (vlax-make-safearray vlax-vbvariant '(0 . 0)))
  (vlax-safearray-put-element datavalue 0 "Circle")

  (vla-select ssetobj mode corner1 corner2 gpcode datavalue)
  (alert (strcat "Objects selected: " (itoa (vla-get-count ssetobj))))

  (vla-delete ssetobj)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.06.2018, 13:27
#4
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Режим acselectionsetcrossing для активного и неактивного чертежа срабатывает только для видимой части экрана (как ssget). С этим нельзя ничего поделать?
Только делать зумирование для чертежей, в т.ч. неактивных?
Tonic вне форума  
 
Непрочитано 07.06.2018, 15:28
#5
Кулик Алексей aka kpblc
Moderator

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


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

Цитата:
Сообщение от Tonic Посмотреть сообщение
Режим acselectionsetcrossing <...> срабатывает только для видимой части экрана (как ssget)
По-моему, в 2018 что-то с этим уже делали. Могу ошибаться
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.06.2018, 15:54
#6
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


То есть, выбор рамкой и не должен работать за границами экрана? Выход — режим acSelectionSetAll с перебором тысяч объектов по фильтру (попадает ли точка вставки блока в нужные границы, лежит ли точка начала-конца линии в этих границах — и так для каждого типа примитивов со своими ключевыми точками)? Это сильно увеличит время поиска. Может, есть возможность зумирования на неактивном чертеже?
Tonic вне форума  
 
Непрочитано 07.06.2018, 16:20
#7
Кулик Алексей aka kpblc
Moderator

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


Tonic, а тебе это зачем? Что ты собираешься искать в неактивном документе?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.06.2018, 16:35
#8
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Tonic, а тебе это зачем? Что ты собираешься искать в неактивном документе?
Объекты, лежащие внутри прямоугольной рамки (замкнутой полилинии). Таких рамок может быть много, и в каждой — минимум сотни объектов. Так показываются этажи зданий с расставленным там слаботочным оборудованием (блоки, линии-кабели). Ну и может быть такое, что информацию об этих объектах на конкретном этаже нужно обработать на неактивном чертеже для показа в активном (текущем).
Tonic вне форума  
 
Непрочитано 07.06.2018, 19:29
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


надо информацию выносить во внешнее хранилище/БД, а не городить костыли с неактивными чертежами)
Сергей812 вне форума  
 
Непрочитано 08.06.2018, 13:23
#10
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Вся необходимая информация во внешних БД. Вопрос не в этом, а вполне конкретный: можно ли без перебора всех объектов через vlax-for ограничиться вполне понятными рамками перебора. Видимо, нет, т.к. зумирование неактивного чертежа вряд ли возможно.
Tonic вне форума  
 
Непрочитано 08.06.2018, 13:56
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Ну, как например это делается в Net - Как средствами AutoCAD определить расположение точки относительно контура. Если не получиться на лиспе реализовать, то можно написать Net-сборку с использованием атрибута [LispFunction("")] и вызывать из вашей lisp-надстройки. Тоже костыль и зависимость от версии акада, но что делать...
Сергей812 вне форума  
 
Непрочитано 08.06.2018, 17:54
#12
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Узнать принадлежность точки контуру можно и на LISP элементарно. Но для сопоставления придётся перебирать точки ВСЕХ объектов на чертеже, что затратнее по времени, чем поиск объектов в секущей рамке.
Tonic вне форума  
 
Непрочитано 08.06.2018, 18:04
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


ну .Net обычно работает немного побыстрее, всетаки) Значит, придется делать чертеж временно активным и собирать информацию рамкой, если математические способы не устраивают по скорости работы - при перебирании всех объектов на чертеже.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Помогите выяснить из-за чего ошибка выходит ошибка.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Помогите узнать номер строки в котрой произошла ошибка в программе на VBA МишаИнженер Программирование 3 27.05.2012 23:27
Несоответствие результатов в Лире s.vas Лира / Лира-САПР 19 11.11.2009 07:31
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47