Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: BearDyugin от 08-06-2017, 06:01:23

Название: Lisp. Создаём поверхность объёмов
Отправлено: BearDyugin от 08-06-2017, 06:01:23
Нашёл код Jeff Mishle https://forums.autodesk.com/t5/autocad-civil-3d-forum/lisp-to-create-civil-3d-surface-from-point-file/td-p/6341097
который создаёт обычную поверхность.
Методом научного тыка (http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/com/AeccXLandLib__IAeccTinVolumeCreationData.htm) переделал его под поверхность объёма
Код - Auto/Visual Lisp [Выбрать]
  1. (defun createvbolumeTIN
  2.        (surfacename layer stylename Base_tin Comp_tin /
  3.         *acad* c3d c3ddoc datastr names pfiles prodstring surf surfs tincreationdata verstring)
  4.   (vl-load-com)
  5.   (setq C3D        (strcat "HKEY_LOCAL_MACHINE\\"
  6.                            (if vlax-user-product-key
  7.                              (vlax-user-product-key)
  8.                              (vlax-product-key)
  9.                            )
  10.                    )
  11.         C3D        (vl-registry-read C3D "Release")
  12.         verstring  (substr C3D
  13.                            1
  14.                            (vl-string-search
  15.                              "."
  16.                              C3D
  17.                              (+ (vl-string-search "." C3D) 1)
  18.                            )
  19.                    )
  20.         prodstring (strcat "AeccXUiLand.AeccApplication." verstring)
  21.   )
  22.   (setq datastr (strcat "AeccXLand.AeccTinVolumeCreationData." verstring))
  23.  
  24.   (if (and (setq *acad* (vlax-get-acad-object))
  25.            (setq C3D (vla-getinterfaceobject *acad* prodstring))
  26.            (setq C3Ddoc (vla-get-activedocument C3D))
  27.            (setq surfs (vlax-get C3Ddoc 'surfaces))
  28.            (vlax-for surf surfs
  29.              (setq names (cons (vlax-get surf 'name) names))
  30.            )
  31.            (setq tincreationdata (vla-getinterfaceobject *acad* datastr))
  32.       )
  33.     (progn
  34.       ;;make sure we don't try to use a duplicate name
  35.       (while (member surfacename names)
  36.         (setq surfacename (strcat surfacename "(1)"))
  37.       )
  38.       (vlax-put tincreationdata 'baselayer layer)
  39.       (vlax-put tincreationdata 'layer layer)
  40.       ;;;
  41.       (vlax-put tincreationdata 'baseSurface Base_tin)
  42.       (vlax-put tincreationdata 'ComparisonSurface Comp_tin)
  43.      
  44.       (vlax-put tincreationdata 'description "Surface from Lisp")
  45.       (vlax-put tincreationdata 'name surfacename)
  46.       (vlax-put tincreationdata 'style stylename)
  47.       ;;style must exist!
  48.       (setq
  49.         surf   (vlax-invoke-method surfs 'addtinsurface tincreationdata)       
  50.       )      
  51.       (vlax-invoke surf 'rebuild)
  52.  
  53.       ;; do whatever else is needed
  54.       (vlax-release-object tincreationdata)
  55.       (vlax-release-object surf)
  56.       (vlax-release-object surfs)
  57.       (vlax-release-object c3ddoc)
  58.       (vlax-release-object C3D)
  59.     )
  60.   )
  61.   (princ)
  62. )

Проблема возникает вот в этом места
Код - Auto/Visual Lisp [Выбрать]
  1.  
  2. (vlax-put tincreationdata 'baseSurface Base_tin)
  3. (vlax-put tincreationdata 'ComparisonSurface Comp_tin)
В качестве поверхностей передаю Vla-указатель этих поверхностей, на что получаю "Член группы не найден"

Может в каком-то другом виде нужно эти поверхности туда отправлять?

Ещё заметил когда создаётся "tincreationdata" все параметры(слой, стиль, имя, ...) просто пустые, а вот поверхности(базовая и сравнения) стоят nil.
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Александр Ривилис от 08-06-2017, 09:00:06
Нашел в этой статье, что из VisualLisp не присваиваются BaseSurface и ComparisonSurface: http://m-mans.blogspot.com/2013/03/civil-3d.html
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Александр Ривилис от 08-06-2017, 09:06:13
А вот и подтверждение от Partha Sarkar  (ADN DevHelp): https://forums.autodesk.com/t5/autocad-civil-3d-customization/can-t-get-addtinvolumesurface-method-to-work/m-p/4402369#M7734
Так что или VBA или .NET.
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Алексей Кулик от 08-06-2017, 11:05:32
При работе в вертикальных приложениях иногда может сработать полное назначение свойства, причем в разных сочетаниях:
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-put-property object 'PropertyName value)
  2. (vlax-put-property object "PropertyName" value)
Может сработать, а может и нет.
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Алексей Кулик от 08-06-2017, 11:07:15
Кстати, а что возвращает
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-property-available tincreationdata "baseSurface" t)
?
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Александр Ривилис от 08-06-2017, 11:12:10
Лёша! Это всё с вероятностью 99.9% не поможет. Просто с помощью VisualLisp не все типы данных можно передать. Скорее всего интерфейс AeccTinVolumeCreationData не вполне корректный и VBA/.NET с этим справляется, а VisualLisp нужен только корректный интерфейс.
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: BearDyugin от 08-06-2017, 11:41:27
Кстати, а что возвращает
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-property-available-p tincreationdata "baseSurface" t)
возвращает nil
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-property-available-p tincreationdata "baseSurface")
возвращает T
Название: Re: Lisp. Создаём поверхность объёмов
Отправлено: Алексей Кулик от 08-06-2017, 12:12:34
Александр Ривилис, охотно верю. Но я говорил на основе собственного опыта...
Geobuilder, поскольку в первом случае возвращается nil, то это означает, что это свойство поменять нельзя. В справке (https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-AutoLISP/files/GUID-E8A5B009-46D6-4BA7-9655-88104F8BE792-htm.html#mtc-russian) прямо так и написано:
Цитировать
If T is specified for the check-modify argument, vlax-property-available-p returns nil if either the property is not available or the property cannot be modified.