BIGAL 发表于 2022-7-6 08:57:51

简单更改CIV3d轮廓

一段时间以来,我一直在试图找出如何简单地更改civil 3d轮廓显示,而不使用有点冗长的属性框。ie设置了一个带有预设的工具栏。下面的代码将在这种情况下找到两个曲面两个不同的轮廓间隔。
 
; application ver 6.0 is 2009 may need 7 or 8 ?
(Vl-load-com)
(setq surfs (vlax-get-property
(vlax-get-property
(vlax-get-property
(vla-getinterfaceobject (VLAX-GET-ACAD-OBJECT)
"AeccXUiLand.AeccApplication.6.0" )
'ActiveDocument)
'Surfaces)
'style)
)
(setq ans "surfaces : ")
;display surface names
(vlax-for each surfs
(setq name (vla-get-name each) )
(setq styname (vla-get-stylename each) )
(setq ans (strcat ans name styname))
)
(princ ans)



 
转储曲面对象可以显示
 
Command:
Select object:
; IAeccTinSurface: IAeccTinSurface interface
; Property values:
;   Application (RO) = #<VLA-OBJECT IAeccApplication 0da15b18>
;   Boundaries (RO) = #<VLA-OBJECT IAeccSurfaceBoundaries 17a4b464>
;   Breaklines (RO) = #<VLA-OBJECT IAeccSurfaceBreaklines 17a4b07c>
;   ContourLabelGroups (RO) = #<VLA-OBJECT IAeccSurfaceContourLabelGroups
0db04160>
;   Contours (RO) = #<VLA-OBJECT IAeccSurfaceContours 17a48d2c>
;   DefinitionProperties (RO) = #<VLA-OBJECT
IAeccTinSurfaceDefinitionProperties 0da15a70>
;   DEMFiles (RO) = #<VLA-OBJECT IAeccSurfaceDEMFiles 17a4afdc>
;   Description = "Description"
;   DisplayName (RO) = "Surface1"
;   Document (RO) = #<VLA-OBJECT IAeccDocument 0d9d4880>
;   Handle (RO) = "55"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 1716a5dc>
;   Labels (RO) = #<VLA-OBJECT IAeccSurfaceLabels 0db04220>
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "Surface1"
;   ObjectID (RO) = 2127765160
;   ObjectName (RO) = "AeccDbSurfaceTin"
;   OutputTriangles (RO) = (217.536 314.67 100.0 266.123 403.035 100.0 ... )
;   OwnerID (RO) = 2127764496
;   PlotStyleName = "ByLayer"
;   PointFiles (RO) = #<VLA-OBJECT IAeccSurfacePointFiles 17a4b52c>
;   PointGroups (RO) = #<VLA-OBJECT IAeccSurfacePointGroups 17a48c64>
;   Points (RO) = (266.123 403.035 100.0 153.02 392.686 100.0 ... )
;   ShowToolTip = -1
;   Statistics (RO) = #<VLA-OBJECT IAeccTinSurfaceStatistics 0da15ae8>
;   Style = #<VLA-OBJECT IAeccSurfaceStyle 17bf7d90>
;   StyleName (RO) = "0.1 Contours"
;   SurfaceAnalysis (RO) = #<VLA-OBJECT IAeccSurfaceAnalysis 0da15878>

 
临界线为VLA-OBJECT IAeccSurfaceStyle 17bf7d90
和StyleName(RO)=“0.1等高线”
 
更改等高线间隔会更改“样式”值,然后显示在Stylename中。
 
我似乎无法在vlax get Style命令中获取样式作为变量,然后我想更改其值,我相信使用put到我的其他轮廓设置之一。
 
我附上了一个非常简单的等高线图,两个曲面和两个等高线间隔,
 
一旦我熟悉了树状结构,我相信其他Civ3D增强功能也会随之而来,如果有任何帮助,我将不胜感激。
conts2.dwg

alanjt 发表于 2022-7-6 09:08:47

直接从我的曲面样式更改例行程序:

   (setq *Acad* (vlax-get-acad-object))
   (setq *AeccApp* (vla-getinterfaceobject
                     *Acad*
                     (strcat "AeccXUiLand.AeccApplication." appstr)
                     )
   )
   (setq *AeccDoc* (vlax-get *AeccApp* 'ActiveDocument))

   (vlax-for i (vlax-get *AeccDoc* 'SurfaceStyles)
       (setq lst (cons (cons (vla-get-name i) i) lst))
   )

BIGAL 发表于 2022-7-6 09:10:00

Alanjt这正是我想要做的,我们有大约7种不同的风格。很明显,您很欣赏仅仅为了更改轮廓显示而进行的点击次数和滑块选择。
 
如果您能提供包括表格在内的其余代码,我将不胜感激。作为回报,我会提供任何更改。可能是双框拾取曲面名称和样式。大多数时候,我们只有一个曲面,所以它默认为第一个曲面。
 
正如我所说的,下一个任务将是对点显示执行相同的操作。你给了我深入了解如何进入应用程序的方法,最重要的提示是命名使用的“surfacestyles v”的风格转储报告。
 
在哪里可以找到变量名列表?例如Stylename=name,surfacestyles末尾的s我永远不会得到它。

BIGAL 发表于 2022-7-6 09:17:49

Alanjt您能提供更多帮助吗?我可以根据您和我的代码获得曲面名称和曲面样式属性。
 
您能提供更改曲面样式的代码吗。我可以做剩下的关于创建用户界面的事情。
 
谢谢你迄今为止的帮助。

BIGAL 发表于 2022-7-6 09:20:00

帮助任何一个我知道我很接近的人只是不能把我的手指放在上面我已经在末尾添加了几条线尝试了不同的组合无法使其工作我知道我需要做一个“放”dwg有两个不同的表面名称和两个不同的轮廓样式。要么是我的代码要么是AlanJt
 
(Vl-load-com)
(setq surfs (vlax-get-property
(vlax-get-property
(vla-getinterfaceobject (VLAX-GET-ACAD-OBJECT)
"AeccXUiLand.AeccApplication.6.0" )
'ActiveDocument)
'Surfaces
)
)
(setq ans "surfaces : ")
;display surface names
(vlax-for each surfs
(setq name (vla-get-name each) )
(setq styname (vla-get-stylename each) )
(setq ans (strcat ans name styname))
)
(princ ans)


 
尝试
;尝试1
(每个表面的vlax(vlax put属性“SurfaceStyles”0.25等高线)
 
;尝试2
(每个表面的vlax(vlax放置表面的表面样式“0.25等高线”))
 
使用alanjt代码
(i的vlax(vlax get*AeccDoc*'曲面)
(setq lst2(cons(cons(vla get name i)i)lst))
)
 
给出曲面名称
 
也尝试过
(x的vlax(vlax get*AeccDoc*'曲面)
(vlax put property’SurfaceStyles“0.25等高线”)
)

alanjt 发表于 2022-7-6 09:29:47

嘿,我家里没有工作版本(只有测试/调整版本),但我周一一到办公室,就会把我的工作版本发布给你。

BIGAL 发表于 2022-7-6 09:33:28

很抱歉打扰你,艾伦,有机会在这里贴一份吗?

BIGAL 发表于 2022-7-6 09:36:31

感谢Alan的帮助,向这里的几个人展示了它的工作原理,他们印象深刻。
 
显示拨号框做得很好,从来没有想过根据需要写一个。其他文字要多次使用。
 
但有一个问题,也许你知道,我们通常在绘图时关闭等高线/三角形,这意味着不能使用entsel。
 
虽然我正在考虑使用提供的代码执行两个命令选项(下拉菜单或工具栏),一个是选择要打开的曲面,然后选择样式。另一种方法是使用双列表框“样式和曲面”拾取要设置的曲面和样式,包括以这种方式禁用“无曲面拾取”意味着无论如何仅使用第一个条目=1个曲面。似乎只有以下命令行需要更改:
(vlax代表x(setq ss(vla get activeselectionset*AeccDoc*))
(vlax put x’风格(cdr(assoc surface lst)))
 
添加获取曲面名称
(vlax代表j(vlax get*AeccDoc*'曲面)
(setq lst2(cons(cons(vla get name j)j)lst2)))
 
运行两次拨号盒可能是一个简单的测试方法,在我取出剪刀并剪切粘贴之前,我会征求您的意见。

alanjt 发表于 2022-7-6 09:42:05

我本来计划做一个版本,你可以从列表中选择可用的表面(类似于核心C3D的功能),但我只是没有机会,你渴望的代码。我的周末从周四开始,家里没有安装Civil,所以周一我才能玩,但周一的第一件事就是尝试一下。给我发邮件,我们会进一步研究。

BIGAL 发表于 2022-7-6 09:50:07

澳大利亚有很多水经过这里,但已经实现了一种简单轮廓显示方法的新版本,我想向Alanjt请教他的源代码,轮廓显示通过快捷键CC(defun C:CC()(load“listselect”)(load“changecontours5”)调用。它允许更改一个或多个曲面的显示,即使当前未显示或关闭曲面。未来版本将通过工具栏菜单调用。如果您有任何建议,我们将不胜感激。为什么Autodesk一开始就将其变得如此复杂。
 
列表选择


(defun AT:ListSelect (title label height width multi lst / fn fo d item f)
;; List Select Dialog (Temp DCL list box selection, based on provided list)
;; title - list box title
;; label - label for list box
;; height - height of box
;; width - width of box
;; multi - selection method ["true": multiple, "false": single]
;; lst - list of strings to place in list box
;; Alan J. Thompson, 09.23.08 / 05.17.10 (rewrite)
(setq fo (open (setq fn (vl-filename-mktemp "" "" ".dcl")) "w"))
(foreach x (list (strcat "list_select : dialog { label = \"" title "\"; spacer;")
                  (strcat ": list_box { label = \"" label "\";" "key = \"lst\";")
                  (strcat "allow_accept = true; height = " (vl-princ-to-string height) ";")
                  (strcat "width = " (vl-princ-to-string width) ";")
                  (strcat "multiple_select = " multi "; } spacer; ok_cancel; }")
            )
   (write-line x fo)
)
(close fo)
(new_dialog "list_select" (setq d (load_dialog fn)))
(start_list "lst")
(mapcar (function add_list) lst)
(end_list)
(setq item (set_tile "lst" "0"))
(action_tile "lst" "(setq item $value)")
(setq f (start_dialog))
(unload_dialog d)
(vl-file-delete fn)
(if (= f 1)
   ((lambda (s / i s l)
      (while (setq i (vl-string-search " " s))
      (setq l (cons (nth (atoi (substr s 1 i)) lst) l))
      (setq s (substr s (+ 2 i)))
      )
      (reverse (cons (nth (atoi s) lst) l))
    )
   item
   )
)
)

Changecontours5





 
更改轮廓5
;(defun c:表面(/appstr lst);;为选定的Civil 3D曲面指定新样式;;必需的子例程:AT:ListSelect;;艾伦·J·汤普森,06.22.10;;由Alan H于2011年1月修改(vl load com)(if((lambda(vrsn)(cond)((vl string search“R17.2”vrsn)(setq appstr“6.0”));09((vl字符串搜索“R18.0”vrsn)(setq appstr“7.0”);10((vl字符串搜索“R18.1”vrsn)(setq appstr“8.0”);11((警报“不支持此版本的C3D!”))(vlax产品密钥));如果条件progn为真(progn(cond(*AeccDoc*)((setq*AeccDoc*(vlax get(cond(*AECCAP*))((setq*AECCAP*(vla GETCInterfaceObject(cond(*Acad*))((setq*Acad*(vlax get Acad object)))(strcat“AeccXUiLand.AeccApplication.”appstr)))’ActiveDocument)));结束主状态);结束程序);如果vsrn结束(vlax代表j(vlax get*AeccDoc*'曲面);(princ(vla get name j))(setq lst(cons(cons(vla get name j)j)lst));如果曲面长度大于1,则跳过拾取if 0,然后消息并退出(setq lenlst(length lst))(if(=lenlst 0)(progn(Getstring“\n您没有曲面,请按任意键退出”)(exit))(if(=lenlst 1)(setq surfacepick(car(nth 0 lst));从点对中拉出曲面)(如果(>lenlst 1)(progn(setq surfacepick(car(AT:ListSelect“Set new surface”“Select surface name”10 10“false)”(vl sort(mapcar(function car)lst)
页: [1] 2
查看完整版本: 简单更改CIV3d轮廓