вторник, 12 марта 2013 г.

Civil 3D. Разбираемся с классификацией custom-свойств точек

Как тут на днях выяснилось, в пылу кодинга неправильно понял смысл метода SetUserDefinedPropertyClassification у группы точек. Я думал, что текущем сеансе работы с чертежом нужно вызвать эту функцию для инициализации доступа к custom-свойствам точек

Оказалось, что это всего лишь обертка для этого свойства "Классификация" группы точек:

Поэтому достаточно настроить нужную группу точек один раз (очевидно при создании). Возможные значения свойства: None (нет custom-свойств), All (классификации custom-свойств) и custom (подключена только одна классификация)

;; создание группы точек
(defun pzm-AddPointGroup (Name RawDescFilter PointStyle PointLabelStyle / grp)
  (cond 
    ((setq grp (pzm-getPointGroup Name)))
    (T (setq grp (m> (pzm-PointGroups) 'Add Name))
      (putprop> (prop> grp 'QueryBuilder) 'IncludeRawDescriptions RawDescFilter) 
      (putprop> grp 'PointStyle (item> 'PointStyles PointStyle))
      (putprop> grp 'PointLabelStyle (item> 'PointLabelStyles PointLabelStyle))
      (putprop> grp 'OverridePointStyle -1)
      (putprop> grp 'OverridePointLabelStyle -1)
      ) ) 
  grp )

;; Для доступа к custom-свойствам точек группа точек (AeccPointGroup) 
;; должна иметь включенную классификацию
(defun pzm-InitPointCustomProps (grp ClassifName / udp)
  ;; ClassifName - наша группа классификации (в шаблоне)
  (setq udp (item> 'PointUserDefinedPropertyClassifications ClassifName))
  (if (not udp) (pzm-ExitWithMsg
    (strcat "\nОшибка! Классификация пользовательских свойств \"" 
      ClassifName "\" не найдена") ) )
    ;; aeccUDPClassificationApplyNone = 0, aeccUDPClassificationApplyAll = 1, 
    ;; aeccUDPClassificationApplyCustom = 2
    (m> grp 'SetUserDefinedPropertyClassification 2 udp) )
    
;; вернуть текущую классификацию (T|nil|Name)    
(defun pzm-GetPointGroupClassification (grp / Classif ClassifType)
  (setq Classif (m> grp 'GetUserDefinedPropertyClassification 'ClassifType))
  (cond 
    ((= ClassifType 0) nil) ;; None
    ((= ClassifType 1) T) ;; All
    ((= ClassifType 2) (prop> Classif 'Name)) ;; Custom, return classification name
    ) )

;; ну и наконец пример создания группы точек с включенной классификацией "ГП":
(pzm-InitPointCustomProps 
  (pzm-AddPointGroup "Проектные_кр1" "кр1" "Точка планировки" "Точка планировки")
        "ГП" ) ) )

четверг, 7 марта 2013 г.

Пишем на VisualLisp под Civil 3D

Обсуждение на форуме DWG.RU
Пример блока с картограммой

Предыстория

С 2000-го по 2005-ый я работал в небольшой проектной фирме, где сначала был чертежником в отделе генплана. Иногда приходилось заниматься расчетом плана земляных масс. Из софта был Autodesk Land Desktop (LDD) и набор DOS-овских программ (sever.exe и plazma.exe, если не ошибаюсь, разработка Гипротюменнефтегаза), в которых был заложен некий алгоритм расчета осадок на болотах.

Процесс ввода данных был муторный - вручную вбивать координаты границ площадки. Потом sever рассчитывал координаты всех узловых и граничных точек. После этого нужно вручную ввести все отметки в узловых и граничных точках. На выходе получался DXF-файл c готовой картограммой.