Lisp. Создаём поверхность объёмов

Автор Тема: Lisp. Создаём поверхность объёмов  (Прочитано 4252 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Нашёл код Jeff Mishle https://forums.autodesk.com/t5/autocad-civil-3d-forum/lisp-to-create-civil-3d-surface-from-point-file/td-p/6341097
который создаёт обычную поверхность.
Методом научного тыка переделал его под поверхность объёма
Код - 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.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Lisp. Создаём поверхность объёмов
« Ответ #1 : 08-06-2017, 09:00:06 »
Нашел в этой статье, что из VisualLisp не присваиваются BaseSurface и ComparisonSurface: http://m-mans.blogspot.com/2013/03/civil-3d.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Lisp. Создаём поверхность объёмов
« Ответ #2 : 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.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Lisp. Создаём поверхность объёмов
« Ответ #3 : 08-06-2017, 11:05:32 »
При работе в вертикальных приложениях иногда может сработать полное назначение свойства, причем в разных сочетаниях:
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-put-property object 'PropertyName value)
  2. (vlax-put-property object "PropertyName" value)
Может сработать, а может и нет.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Lisp. Создаём поверхность объёмов
« Ответ #4 : 08-06-2017, 11:07:15 »
Кстати, а что возвращает
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-property-available tincreationdata "baseSurface" t)
?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Lisp. Создаём поверхность объёмов
« Ответ #5 : 08-06-2017, 11:12:10 »
Лёша! Это всё с вероятностью 99.9% не поможет. Просто с помощью VisualLisp не все типы данных можно передать. Скорее всего интерфейс AeccTinVolumeCreationData не вполне корректный и VBA/.NET с этим справляется, а VisualLisp нужен только корректный интерфейс.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyuginАвтор темы

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Re: Lisp. Создаём поверхность объёмов
« Ответ #6 : 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

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Lisp. Создаём поверхность объёмов
« Ответ #7 : 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.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!