dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

vladimirr_b вне форума Вставить имя

Здравствуйте! В разделе 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. Именованный набор объектов уже существует". В чем проблема?
Просмотров: 1469
 
Непрочитано 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
С.-Петербург
Сообщений: 35,438


Значит в текущем документе уже есть такой набор. Сначала надо его удалить (естественно, удалять только при необходимости). Примерно так:
Код:
[Выделить все]
 (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
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2018, 13:27
#4
Tonic


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


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

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


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

Цитата:
Сообщение от Tonic Посмотреть сообщение
Режим acselectionsetcrossing <...> срабатывает только для видимой части экрана (как ssget)
По-моему, в 2018 что-то с этим уже делали. Могу ошибаться
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.06.2018, 15:54
#6
Tonic


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


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

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


Tonic, а тебе это зачем? Что ты собираешься искать в неактивном документе?
__________________

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


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


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


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


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


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


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


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


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


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


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


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


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

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

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

Быстрый переход

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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||