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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vla-AddSpline и vlax-safearray-fill

vla-AddSpline и vlax-safearray-fill

Ответ
Поиск в этой теме
Непрочитано 05.05.2007, 22:50 #1
vla-AddSpline и vlax-safearray-fill
DFooz
 
учащийся
 
Москва
Регистрация: 25.03.2007
Сообщений: 44

Хочу аоздать через АктивяИкс сплайн.
Все координаты точек в списке. Присваю элементы списка массиву и выдаёт ошибку
Цитата:
Command: ; error: vlax-safearray-fill failed. Invalid initialization list.
#<safearray...> ((0 0.0 0) (10 -7.82832 0) (20 -11.8839 0) (30 -11.8839 0) (40
-7.82832 0) (50 0.0 0) (60 10.3528 0) (70 20.456 0) (80 26.7531 0) (90 26.7531
0) (100 20.456 0) (110 10.3528 0) (120 0.0 0))

Кусок кода

Код:
[Выделить все]
	
(setq sp_heigth (list x ds 0)
           sp (append sp (list sp_heigth))
)


(setq sf (vlax-make-safearray vlax-vbDouble '(0 . 12)) )
	(vlax-safearray-fill sf sp)
Что не так?

И заодно, сплайн так создается?
(setq obj (vla-get-ModelSpace actdoc))
(vla-AddSpline obj (sp, startTan, endTan)


Заранее спасибо.
Просмотров: 4011
 
Непрочитано 05.05.2007, 23:34
1 | #2
fixo

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


Суть в том что для создания примитивов типа сплайна
нужен одномерный массив

Вот небольшой пример, надеюсь поможет

Код:
[Выделить все]
;local defun:
(defun makedoublesafe (lst)
(vlax-safearray-fill
  (vlax-make-safearray vlax-vbdouble
    (cons 0 (1- (length lst))))
       lst)
  )
; main part
(defun C:test(/ acsp adoc point_list pt_data spline_obj)
(vl-load-com)  
(setq	adoc (vla-get-activedocument
	       (vlax-get-acad-object)
	     )
  )
  (if (and
	(= (getvar "tilemode") 0)
	(= (getvar "cvport") 1)
      )
    (setq acsp (vla-get-paperspace adoc))
    (setq acsp (vla-get-modelspace adoc))
  )
(setq point_list '((0 0.0 0) (10 -7.82832 0) (20 -11.8839 0) (30 -11.8839 0) (40 
-7.82832 0) (50 0.0 0) (60 10.3528 0) (70 20.456 0) (80 26.7531 0) (90 26.7531 
0) (100 20.456 0) (110 10.3528 0) (120 0.0 0)))
; для создания безопасного массива нужно задавать плоский список элементов:
(setq pt_data (apply 'append point_list)); <-- плющим список точек
(setq pt_data (makedoublesafe pt_data)); <-- создаем и запоняем массив
(setq spline_obj (vla-addspline acsp pt_data
		   (vlax-3d-point '(0 0 0)); вектор касательной в начальной точке
		   (vlax-3d-point '(0 0 0)))); вектор касательной в конечной точке
(princ)
  )
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 06.05.2007, 00:11
#3
DFooz

учащийся
 
Регистрация: 25.03.2007
Москва
Сообщений: 44


спасибо огромноееееееееееееееееееееее.[sm166]

А я то въезжал, как это массив для сплайна одномерный, а при создании одномерного массива с тремя точками выдаёт ошибку :evil:


Перед созданием сплайна я смещаю систему координат, а сплайн берёт координаты в мировой системе, а не в моей смещённой. Т.е. появляется в совсем другом месте. Это можно как-то исправить?



ЗЫ: ну почему это ни в каких книгах не написано :cry:
DFooz вне форума  
 
Непрочитано 06.05.2007, 00:51
#4
fixo

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


Я тут в полудреме могу ошибиться
так если по памяти вроде таким путем

Код:
[Выделить все]
;local defun:
(defun makedoublesafe (lst)
(vlax-safearray-fill
  (vlax-make-safearray vlax-vbdouble
    (cons 0 (1- (length lst))))
       lst)
  )
; main part
(defun C:test(/ acsp adoc myucs name orig point_list
	      pt_data spline_obj tmax util xdir ydir)
  
(vl-load-com)  
(setq	adoc (vla-get-activedocument
	       (vlax-get-acad-object)
	     )
  )
  (if (and
	(= (getvar "tilemode") 0)
	(= (getvar "cvport") 1)
      )
    (setq acsp (vla-get-paperspace adoc))
    (setq acsp (vla-get-modelspace adoc))
  )
; перемещаем начало координат в точку  '(100 100 0)
(command "._ucs" "_M" '(100 100 0) "")
(setq point_list '((0 0.0 0) (10 -7.82832 0) (20 -11.8839 0) (30 -11.8839 0) (40 
-7.82832 0) (50 0.0 0) (60 10.3528 0) (70 20.456 0) (80 26.7531 0) (90 26.7531 
0) (100 20.456 0) (110 10.3528 0) (120 0.0 0)))
; для создания безопасного массива нужно задавать плоский список элементов:
(setq pt_data (apply 'append point_list)); <-- плющим список точек
(setq pt_data (makedoublesafe pt_data)); <-- создаем и запоняем массив
(setq spline_obj (vla-addspline acsp pt_data
		   (vlax-3d-point '(0 0 0)); вектор касательной в начальной точке
		   (vlax-3d-point '(0 0 0)))); вектор касательной в конечной точке

      (if (eq "" (getvar "UCSNAME"))
	(progn
        ; то есть активная UCS не поименована и к ней нельзя
	; добраться через свойство документа ActiveUCS
	; тогда берем её данные и сохраняем уже как именованную
	(setq util (vla-get-utility adoc))
	     (setq orig (getvar "UCSORG")
		   xdir (getvar "UCSXDIR")
		   ydir (getvar "UCSYDIR")
		   name "MyUCS3"
		   )
	     ; переводим в текущие координаты в мировые:
	     (setq xdir (vla-translatecoordinates util (vlax-3d-point xdir)  acucs acworld  :vlax-false)
		   ydir (vla-translatecoordinates util (vlax-3d-point ydir)  acucs acworld  :vlax-false)
		   )
	     ; сохраняем в документе
	     (setq myucs (vla-add (vla-get-usercoordinateSystems adoc) (vlax-3d-point orig) xdir ydir name))
		     ; устанавливаем как текущую
	     (vla-put-activeucs adoc myucs)
	)
	; а если уже имеется имя у активной UCS просто получаем её:
	(setq myucs (vla-get-activeucs adoc))
       )
	     ; берем матрицу преобразования
	     (setq tmax (vla-getucsmatrix myucs))
             ; применяем её к созданному сплайну
            (vla-transformby spline_obj tmax)  
      (princ)
      )
~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 06.05.2007, 11:24
#5
DFooz

учащийся
 
Регистрация: 25.03.2007
Москва
Сообщений: 44


спасибо. Но с неименованной системой что-то не идёт. :roll:
Пишет
Цитата:
Command: ; error: Automation Error. UCS X axis and Y axis are not perpendicular
UCS создаю вот так (command "_.UCS" '(150 100) "")

Ошибку на этом кусочке выдаёт
Код:
[Выделить все]
 ; сохраняем в документе
        (setq myucs (vla-add (vla-get-usercoordinateSystems adoc) (vlax-3d-point orig) xdir ydir name))
DFooz вне форума  
 
Непрочитано 06.05.2007, 12:25
#6
fixo

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


Ну во-первых из уважения к системе координат
точка должна быть трехмерной
Почитай Хэлп: "Command Reference"
fixo вне форума  
 
Непрочитано 06.05.2007, 12:27
#7
fixo

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


Код выше я исправил

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 06.05.2007, 15:31
#8
DFooz

учащийся
 
Регистрация: 25.03.2007
Москва
Сообщений: 44


ааа, понятно
Спасибо большое. :!: :!:
DFooz вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vla-AddSpline и vlax-safearray-fill