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

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

Как создать массив для группы примитивов в Bricscad?

Ответ
Поиск в этой теме
Непрочитано 17.12.2007, 16:40 #1
Как создать массив для группы примитивов в Bricscad?
Tonic
 
Воронеж
Регистрация: 26.06.2007
Сообщений: 151

Столкнулся с проблемой: имеется набор примитивов, которые нужно размножить через массив. Переменную со списком имён примитивов в _-array подставить нельзя - берётся только первый примитив; если организовать цикл по количеству примитивов в наборе и по каждому сделать массив - новые объекты будут налеплены кое-как, а не так, как в оригинале (пусть оригинал будет, к примеру, представлен квадратом и перекрестием из линий внутри него: так новые линии не будут почему-то внутри своих квадратов, хоть всё время указывается одна и та же базовая точка!). И третий способ: ActiveX. Всё замечательно получилось в Автокаде. А Брикскад пишет ошибку: Automation error. 80020009: error accessing [ARRAYPOLAR] method. ErrIndex=0.
Что делать?
Просмотров: 4612
 
Непрочитано 17.12.2007, 16:49
#2
Кулик Алексей aka kpblc
Moderator

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


А если подставить сам набор? ну или так примерно (код проверить не могу):
Код:
[Выделить все]
(defun test (number-of-objects angle-to-fill center-point / selset)
            ;|
number-of-objects	количество копий. > 1
angle-to-fill		угол заполнения 0..2PI
center-point		список 2 или 3 вещественных чисел
Пример использования:
(test 2 pi (getpoint))
|;
  (if (setq selset (ssget))
    (progn
      (foreach item
               (mapcar 'vlax-ename->vla-object
                       (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
                       ) ;_ end of mapcar
        (vla-arraypolar
          item
          number-of-objects
          angle-to-fill
          (vlax-3d-point center-point)
          ) ;_ end of vla-arraypolar
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2007, 17:19
#3
Tonic


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


Как обычно: в AutoCAD получилось, в Bricscad - нет. Причём даже ошибку не вывел - просто ничего не изменилось - ни на экране, ни в командной строке...

Вот кусок моего кода: он тоже хорошо работает в Автокаде, но пишет ту ошибку в Брикскаде:
Код:
[Выделить все]
(setq ptc (getpoint "\nУкажите центр кругового массива: "))
(setq nums (getint "\n Число элементов: "))
(setq angl (getint "\nУгол размещения, град. (- = по часовой стрелке): <360> "))

(if (= angl nil) (setq angl 360) (setq angl (fix angl)))
 (setq i 0 liob '(0 0))
 (repeat (sslength objects)
 (setq liob (append (list (vlax-ename->vla-object (ssname objects i))) liob))
		   
 (setq i (1+ i))
 );end repeat

 (setq liob (reverse (cddr (reverse liob))))
 (setq i 0)
(repeat (sslength objects)
 (setq temp (vla-ArrayPolar (nth i liob) nums (angtof (itoa angl) 0) (vlax-3D-point ptc)))
 (setq i (1+ i))
)
Здесь objects - это набор примитивов.
Tonic вне форума  
 
Непрочитано 17.12.2007, 17:52
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


А если в array делать цикл по списку примитивов при выборе
Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-conv-pickset-to-list
;;; *
;;; * 03/12/2007 Версия 0001. 
;;; ************************************************************************
(defun _dwgru-conv-pickset-to-list (value / lst item)
 ;;; Назначение:
    ;;; Преобразовывает набор (pickset) в обычный список имен примитивов (ename)
    ;;; Низкоуровневая функция. Контроль соответствия типов не производится
    ;;; Параметры: 
    ;;; value - набор (pickset) или nil если пустой набор
    ;;; Возврат:
    ;;;   - список примитивов (Ename)
;;;; Пример
  ;|
(setq point (vla-addpoint (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0))))
(_dwgru-conv-pickset-to-list (ssget "_L")) ;_(<Имя объекта: 7ef85e00>)
(_dwgru-conv-pickset-to-list (ssadd)) ;_nil
  |;
       (repeat (setq item (sslength value)) ;_ end setq
         (setq lst (cons (ssname value (setq item (1- item))) lst))
         ) ;_ end repeat
lst
)

(defun C:test (number-of-objects angle-to-fill center-point / selset)
  (setq number-of-objects 15) ;_количество копий.
  (setq angle-to-fill 360)    ;_угол заполнения В градусах !!!
  (setq center-point (getpoint "\nЦентральная точка: "))
  (if (setq selset (ssget))
    (progn
      (setq lst (_dwgru-conv-pickset-to-list selset))
      (command "_-ARRAY")
      (foreach item lst (command item))
      (command "" "_P" center-point number-of-objects angle-to-fill "_Y")
            ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.12.2007, 18:26
#5
Кулик Алексей aka kpblc
Moderator

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


Так это командные методы Лично мне было интересно, возьмет оно activex или не совсем
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.12.2007, 19:01
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Думаю Tonic интереснее, чтобы заработало любым способом
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.12.2007, 10:08
#7
Tonic


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


Нет, "прерывистым методом" тоже не получается... Думал блок создавать, чтобы его размножать (имя-то одно!), а потом удалять новые блоки, но та же проблема: _-block схватывает по одному элементу, а список куда подставлять? Да и потом это, наверно, всё равно неправильный путь...
Tonic вне форума  
 
Непрочитано 18.12.2007, 12:38
#8
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Наверное я во что-то не въехал, но все же...
Код:
[Выделить все]
(defun test (/ sset ptc nums angl)
  (setq sset (ssget))
  (setq ptc (getpoint "\nУкажите центр кругового массива: "))
  (setq nums (getstring "\n Число элементов: "))
  (if (setq angl
             (getstring
               "\nУгол размещения, град. (- = по часовой стрелке): <360> "
             ) ;_ end of getstring
      ) ;_ end of setq
    (setq angl "360")
  ) ;_ end of if
  (command "_-ARRAY" sset "" "_p" ptc nums angl "_Y")
  (princ)
) ;_ end of defun
CB вне форума  
 
Автор темы   Непрочитано 19.12.2007, 09:22
#9
Tonic


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


Набор в качестве аргумента действительно подходит!
Tonic вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать массив для группы примитивов в Bricscad?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Как задать слой для определенного макроса Egor_II Программирование 8 01.02.2007 11:39
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41
Как обнулить одну координату для всех примитивов? Miha AutoCAD 4 19.02.2004 09:11