本篇文章介绍下Civil3D中点的主要相关概念。点是Autodesk Civil 3D中的基本构造对象。Autodesk Civil 3D的点是具有X、Y、Z的智能对象。每个点有独自的编号和名称,就像身份证一样,编号都是唯一的。每个点可以添加编号、北距、东距、高程和点描述等属性,如下图:
密瓦IX标县道工程共11公里余。目前获得前期带状地形图为多幅拼接,DWG格式。图中等高线属性标高与等高线值不相符合,经检查,每幅图中在出图时将所有等高线作了升高或降低处理。但在同一幅图内,差值是常数。前几日在处理第一段时手工操作,费时费力,且容易出错。在生成曲面时才发现有极个别很小的等高线未更正,导致曲面生成后出现极高、极低点。因后续尚有9公里的带状地形等高线需要更正,工作量巨大,必须借用LISP进行批量修改。程序如下:
;2019-08-06增加了等高线为二维多义线的处理办法
(defun c:zzElevCorrecting () ;程序名:zzElevCorrecting,加载后在命令行输入。
(setq elevDiff (getreal "请输入等高线的高程差值: "))
(setq elevDist (getint "请输入等高距: "))
(prompt "\n <<框选欲更改高程的等高线>>")
(setq ss (ssget)) ;取得选择集。
(setq n 0
Cnt 0
) ;选择集的起始值n=0
(repeat (sslength ss) ;计算选择集的对象个数。
(setq en (ssname ss n)) ;依据索引值取出选择集中的图元名。
(setq endata (entget en)) ;取得对象的联合列表。
(setq oldColor (cdr (assoc 62 endata)))
(setq entType (cdr (assoc 0 endata)))
(setq oldLayer (cdr (assoc 8 endata)))
(if (and (/= oldLayer "1-地形-等高线-更正") ;等高线为多义线时的处理
(= entType "LWPOLYLINE")
)
(progn
(setq elePl (cdr (assoc 38 endata)))
;38表示线段的高程,elePl:多义线标高
(setq elePlProp (assoc 38 endata)) ;elePlProp:多义线标高原属性
(setq eleRt (+ elePl elevDiff)) ;多义线正确的高程值,其标高加上高差
(setq eleRtProp (cons 38 eleRt));eleRtProp:加上高差改正后正确有多义经标高属性表
(if (= (rem eleRt (* 5 elevDist)) 0)
(setq newColor 1) ;计曲线红色
(setq newColor 2) ;首曲线黄色
)
(setq endata (subst eleRtProp elePlProp endata))
;用新的属性表更改旧的属性表
;替代成为新的关系属性
;(setq oldLayer (assoc 8 endata)) ;找到原图层
(setq newLayer (cons 8 "1-地形-等高线-更正")) ;建立新的图层
(setq endata (subst newLayer (cons 8 oldLayer) endata))
;把赋了高程值的等高线放在新的图层中。
(setq
endata (subst (cons 62 newColor) (cons 62 oldColor) endata)
)
(entmod endata) ;按更新的属性列表新生成屏幕上的对象
(setq Cnt (1+ Cnt))
) ;progn
) ;if
(if (and (/= oldLayer "1-地形-等高线-更正")
(= entType "POLYLINE") ;当等高线为二维多义线的处理
)
(progn
(setq elePl (last (assoc 10 endata)))
(print elePl) ;38表示线段的高程,elePl:多义线标高
(setq elePlProp (assoc 10 endata)) ;elePlProp:多义线标高原属性
(setq eleRt (+ elePl elevDiff)) ;多义线正确的高程值,其标高加上高差
(setq eleRtProp (list 10 0.0 0.0 eleRt))
;eleRtProp:加上高差改正后正确有多义经标高属性表
(if (= (rem eleRt (* 5 elevDist)) 0)
(setq newColor 1) ;计曲线红色
(setq newColor 2) ;首曲线黄色
)
(setq endata (subst eleRtProp elePlProp endata))
;用新的属性表更改旧的属性表
;替代成为新的关系属性
;(setq oldLayer (assoc 8 endata)) ;找到原图层
(setq newLayer (cons 8 "1-地形-等高线-更正")) ;建立新的图层
(setq endata (subst newLayer (cons 8 oldLayer) endata))
;把赋了高程值的等高线放在新的图层中。
(setq
endata (subst (cons 62 newColor) (cons 62 oldColor) endata)
)
(entmod endata) ;按更新的属性列表新生成屏幕上的对象
(setq Cnt (1+ Cnt))
) ;progn
) ;if
(setq n (1+ n))
)
(princ
(strcat "\n 共有< " (itoa Cnt) " >条等高线更新完毕!")
)
(prompt "快速更正等高线高程。(C)QinDong 2019.07.31 密瓦IX标"
)
(prin1)
)
有以下原地形图:
更正后地形图:
更正后将计曲线设为红色、首曲线设为黄色,更新至新层,以后执行时会自动跳过已处理过的等高线。
使用AutoCAD Civil 3D打开CASS生成的地形图,由于CASS地形图中的地形点是以块形式存在的,虽然我们可以使用CAD的图元对象中的块进行曲面定义,但这样做的结果就是虽有曲面但没有对应的地形点。我们需要将块状地形点转换成CAD的点对象,再在AutoCAD Civil 3D里根据CAD点生成Civil 3D格式的点对象,并加入点编组用于后组定义曲面或导出等操作。
以下代码的使用方法是,用AutoCAD Civil 3D打开CASS地形图,在命令行执行代码中的命令即可,图中所有块状地形点将消失,取而代之的是生成一些CAD点。
(defun C:CASS2POINT ()
; (setq ss (ssget "X" '((0 . "insert") (8 . "GCD"))))
(setq ss (ssget "X" '((0 . "insert") (2 . "GC*"))))
(setq i 0)
(repeat (sslength ss)
(setq ssn (ssname ss i))
(setq endata (entget ssn))
(setq blockXYZ (assoc 10 endata))
(print blockXYZ)
(entmakeX (list '(0 . "POINT") blockXYZ))
(setq i (1+ i))
(entdel ssn)
)
)
一个地形点即地表上的一个三维点在我们测出平面坐标和高程后,就具有了三维坐标X、Y、Z属性。为了便于管理,通常要给这个点命名,如road01等等,特别是所测的点代表某个明显地物或地形特征点时,但对于无特殊性的地形散点,一般仅加个编号。工程测量上一般测图仅是为了计算工程量,对所测地形点顺序编号即可,如下:
在AutoCAD界较专业的叫法叫实体,但我习惯上叫对象,不管是实体还是对象都是英文单词“Entity”翻译过来的。我们在使用国外软件的中文版时,经常会遇到译不准的情况,也就是我们个人觉得命令按钮上显示的中文会与实际操作的结果意义对不上,造成理解困难,更有甚者会严重影响软件的学习使用。严格意义上讲,也不叫译不准,这些软件的官方中文版在翻译过来时我想也是经过仔细权衡斟酌的,有些英文词也不可能刚好就能找出一个汉字词而且在意义上严格对应,可能要用一句话才能解释清楚,但软件界面上的命令按钮字数是有限的,不可能按钮文字是很长的一句话。如在Civil 3D中的“曲面”,其实在英文版里对应的是“Surface”,将“Surface”在这个软件里译成“曲面”在我们掌握这个软件的应用以后会发现翻译还是很严谨的,但在刚接触和初学时,一时还接受不了,但不要太纠结这个东西,我们只要想到终有一天我会明白地就行了。
国人现在用的测绘成图软件好象只有南方的CASS,至于那些GIS系列,因其功能侧重于GIS,并不适合拿来成图、算量。可惜的是CASS于南方数码来说可能也不挣钱,使其处于几乎停止更新维护的状态。这一两年好象出过一个9.0版本的,让大家看到了一线希望,那就南方公司还并没有彻底地放弃这个软件,但也没太当回事,在我看来,它的策略就如当初任其盗版泛滥一样,只是为了给南方公司吸引点眼球罢了。
在CASS前也出现过一些测绘成图软件,出现得比它早,消失得比它更早,现在也找不到这些软件的安装程序了,即使找到,在更新了无数次的操作系统里,也不一定安装得起来。现在或以后中,也不会有新的公司着手开发这类软件。这跟大环境有关,明知道开发出来也买不了钱,那又有谁会去静下心来开发呢?现在的人普遍心浮,静不下心来好好地干一件事。
即使是国内做得比较好的CASS,与国外(主要是美国佬)的成图或图形处理软件比起来也太小儿科了,从界面、功能上都显得业余,很象以前网上出现的许多个人共享软件作者做出来的小软件,要说这是一家所谓全球知名的数码企业做出来的产品,也只有我们能信。
我在这儿并无贬损它的意思,只是怒其不争,我们在许多方面还真的别无选择,系统、软件、芯片,不是说有差距,而其实是有很多东西我们根本就没有,而且做不出来,又何谈去跟别人PK?
再来说说Civil 3D,它以前是一个独立的软件,而现在跟AutoCAD彻底集成在了一起。关于它我们来看看网上具体一点的介绍:
Autodesk Civil 3D就是根据专业需要进行了专门定制的AutoCAD,是业界认可的土木工程道路与土石方解决的软件包,可以加快设计理念的实现过程。它的三维动态工程模型有助于快速完成道路工程、场地、雨水/污水排放系统以及场地规划设计。所有曲面、横断面、纵断面、标注等均以动态方式链接,可更快、更轻松地评估多种设计方案、做出更明智的决策并生成最新的图纸。
测量命令已完全集成到 Civil 3D 工具集和用户界面中。用户可以在完全一致的环境中进行各种工作,包括从导入外业手簿、最小二乘法平差和编辑测量观测值,到管理点编组、创建地形模型以及设计地块和路线。
Autodesk Civil 3D 增加了对 Civil 3D 模型中核心元素的多用户项目支持,从而提高了项目团队的效率,并降低了在项目周期内进行修改时出现协调性错误的风险。Civil 3D 中的项目支持利用了 Autodesk Vault 的核心数据管理功能,从而确保整个项目团队可以访问完成工作所需的数据。
Civil 3D 这些标准可以方便地在整个企业组织中使用。从等高线的颜色、线型和间距,到横断面或纵断面标注栏中显示的标签,各种标准均可以在样式中进行定义,然后,该样式将用于整个设计和生成图纸的过程。
从今天起,我将就该软件在工程测量方面的应用写一些东西,与大家共同探讨学习,提高实际工作效率,也是为了以后自己忘了时更容易重新拾起。这年头特别容易忘事,估计与在高原缺氧有点关系,专业点的说法叫降效。
各位亲好久不见。不好意思一直被琐事拖着很久没更新。
今天回过头来讲一下这个挡土墙。
首先介绍一下这个挡土墙。挡土墙是指支承路基填土或山坡土体、防止填土或土体变形失稳的构造物。
挡土墙通常长得比较复杂。
AutoLisp程序可用appload命令加载。
推荐加载时加入自启动组。
所有命令均以“zz”开头,程序加载后在命令行中输入“zz”就会弹出所有命令列表,用上、下键在列表中选择后按回车键执行即可。
执行命令:zza、zzarea 将封闭区域的面积直接标在区域内。在命令行输入:zza或zzarea
输入面积编号或名称“a1”,在需求面积的区域内点击即可:
图上求面积区域显示:“a1:103.61”
执行命令:zzArea2Table (注意:低版本不支持表对象)
按提示输入起始序号“1”,并指定面积表放置位置:
将创建一个空的表对象:
依次点击需求面积区域:
面积值将依次加入表中,且求面积区域将显示表中对应序号。
输入命令:ZZAREA2FILE,提示输入保存面积文件名,后续操作与命令“zzArea2table”类似,求面积区域显示序号,存放面积的文本文件中以序号、面积逐行保存。
Civil 3D喜欢以路的中心线作为道路的基准线。所以你最好有这样一条中心线。如果万一你没有,你可以用这个功能生成中心线——在标注菜单栏里:中心线。 现在默认你已经画好了中心线。现在去home栏,找到基准线(alignment,我不是很清楚中文版的叫啥)——从实体创建基准线——选择已经画好的那根中心线——会出来一个箭头让你确定方向(开车的方向),如果对就回车,不对就选翻转——起个名字,线的类型选设计,去掉勾选,搞定。
Define a_gauss2gc()=
Prgm
setgeomode()
RequestStr "施工坐标系名=",tconame
0→stat
For i,1,dim(coname),1
If coname[i]=tconame Then
1→stat
Request "待转换点X(N)=",tpx
Request "待转换点Y(E)=",tpy
xa[i]→txa
ya[i]→tya
xb[i]→txb
yb[i]→tyb
sa[i]→tsa
R►Pθ(txb-txa,tyb-tya)→talpha
EndIf
EndFor
If stat=1 Then
(tpx-txa).cos(talpha)+(tpy-tya).sin(talpha)+tsa→tstage
-(tpx-txa).sin(talpha)+(tpy-tya).cos(talpha)→toff
Disp "高斯坐标→施工坐标:",tconame
Disp "(桩号)x=",round(tstage,3)
Disp "(偏距)y=",round(roff,3)
Else
Disp "选择的坐标系未定义!"
EndIf
EndPrgm
Define a_gc2gauss()=
Prgm
Setgeomode()
RequestStr “施工坐标系名=”,tconame
0→stat
For i,1,dim(coname),1
If coname[i]=tconame Then
1→stat
Request “待转换点桩号x=”,tpx
Request “待转换点偏距y=”,tpy
xa[i]→txa
ya[i]→tya
xb[i]→txb
yb[i]→tyb
sa[i]→tsa
R►Pθ (txb-txa,tyb-tya)→talpha
EndIf
EndFor
If stat=1 Then
txa+(tpx-tsa).cos(talpha)-tpy.sim(talpha)→tpn
tya+(tpx-tsa).sin(talpha)+tpy.cos(talpha)→tpe
Disp “施工坐标→高斯坐标 坐标系:”,tconame
Disp “X(N)=”,round(tpn,3)
Disp “Y(E)=”,round(tpe,3)
Else
Disp “选择的坐标系未定义!”
EndIf
EndPrgm
Define setgeomode()=
Prgm
If getMode(2)≠2 Then
setMode(1,1)
setMode(2,2)
setMode(5,2)
setMode(7,1)
setMode(8,1)
EndIf
EndPrgm
Define a_gc2gc()=
Prgm
RequestStr “源施工坐标系名=”,tconame
0→stat
For i,1,dim(coname),1
If coname[i]=tconame Then
1→stat
Request “待转换点桩号x=”,tpx
Request “待转换点偏距y=”,tpy
xa[i]→txa
ya[i]→tya
xb[i]→txb
yb[i]→tyb
sa[i]→tsa
R►Pθ(txb-txa,tyb-tya)→talpha
EndIf
EndFor
If stat=1 Then
txa+(tpx-tsa).cos(talpha)-tpy.sin(talpha)→tpn
tya+(tpx-tsa).sin(talpha)+tpy.cos(talpha)→tpe
RequestStr “目标坐标系名=”,tarconame
0→stat2
For i,1,dim(coname),1
If coname[i]=tarconame Then
1→stat2
xa[i]→txa
ya[i]→tya
xb[i]→txb
yb[i]→tyb
sa[i]→tsa
R►Pθ(txb-txa,tyb-tya)→talpha
EndIf
EndFor
If stat2=1 Then
(tpn-txa).cos(talpha)+(tpe-tya).sin(talpha)+tsa→tstage
-(tpn-txa).sin(talpha)+(tpe-tya).cos(talpha)→toff
Disp “施工坐标系间转换:”,tconame & “→”& tarconame
Disp “(桩号)x=”,round(tstage,3)
Disp “(偏距) y=”,round(roff,3)
Else
Disp “选择的目标坐标系未定义!”
EndIf
Else
Disp “选择的源坐标系未定义!”
EndIf
EndPrgm
Define a_zbfs()=
Prgm
setgeomode()
Request “起点X=”,x1
Request “起点Y=”,y1
Request “终点X=”,x2
Request “终点Y=”,y2
Disp “距离=”,R►Pr(x2-x1,y2-y1)
R►Pθ (x2-x1,y2-y1)→α
If α<0 Then
α+360→α
EndIf
Disp “方位角=”,α►DMS
EndPrgm
Define a_zbzs()=
Prgm
setgeomode()
Request “起点X=”,x1
Request “起点Y=”,y1
Request “距离=”,s
RequestStr “方位角(D.MMSS)=”,str
expr(str)→α
fdms(α)→α
Disp “计算点X=”,round(x1+s.cos(α),3)
Disp “计算点Y=”,round(y1+s.sin(α),3)
EndPrgm
7、转换D.MMSS格式为十进制度
Define fdms(α)=
Func
Return intDiv(α,1)+(intDiv(remain(α,1).100,1))/60+(remain(α*100,1).100)/3600
EndFunc
我们每次使用命令
git clone git@gitlab.xxx.com:xxxxx.git
默认 clone 的是这个仓库的 master 分支。如果最新的代码不在 master 分支上,该如何拿到呢?如下图所示,最新的代码可能在daily/1.4.1
分支上,我们希望拿到这个分支上的代码。
在Excel或WPS表格中要使用VBA需要先打开“开发工具”菜单,打开方式请在网上度一下: 在“自定义功能区”打开“开发工具”菜单:
由正则表达式如何匹配相同字符出发,讲讲正则表达式中的选择、分组和引用。
在外刊君读者群中看到有人提出这样的一个需求:
把字符串切成连续相同字符的正则怎么写?比如
abbcccdddd
切成a,bb,ccc,dddd
之前我对正则表达式也是略有研究,想尝试一下。其实我对正则表达式的学习基本完全来源于犀牛书的第10章,真正看懂这一章,我觉得操作正则表达式应该不在话下。
本文主要说明对这个博客主题的改版和代码重构的过程。这个简洁高雅的博客主题受到了很多朋友的喜欢。在写第一版界面时,我对前端并不是很熟悉,对Jekyll
也不熟悉。现在距离当时也一年了,对自己当时写的代码也不太满意了,同时Jekyll
如今也已经升级了,目前最新版为3.1.2。因此我在临近毕业尚未入职前做一下博客主题的代码重构和改版吧。
主要想做这些事情有:添加归档,添加标签,添加分类页面,主页显示文章摘要,代码去除 jQuery 和 BootStrap,优化移动端显示,将所有变量写入配置文件_config.yml
中等。再优化一些细节吧。希望更多人会喜欢。
工程测量工作中因计算工程量的需要,测量地形时不会考虑什么测图比例或出图比例,对计量有利的地形变化点都需要布点。这样会导致地形点过密,在出图时需要过滤掉一部分(不在纸质地形图上显示),毕竟纸质版资料还是要按规范要求的点间距来绘图的。在南方CASS中就有点过滤命令用于出图前的图面点过滤。我们在使用Civil3D做测量资料时,在出图方面存在一定局限性,如没有相应图式,也没有点过滤等命令。好在我们可以利用VBA进行扩展。
采用的方法是在Excel(WPS兼容)或是Civil3D里用VBA对地形数据文件过滤后生成新的数据文件,在Civil3D里新建一个曲面添加这个过滤后的点数据文件,出图时隐藏用于算量的曲面,将出图曲面进行绘图。 Excel里的代码:
在表格中添加一个按钮
Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Function Distance(Sx As Double, Sy As Double, Ex As Double, Ey As Double, Precision As Integer) As Double
Dim DltX As Double, DltY As Double
DltX = Ex - Sx
DltY = Ey - Sy
Distance = Round(Sqr(DltX * DltX + DltY * DltY), Precision)
End Function
Sub filter()
Dim Dia1 As Object, Strr As String, PPath As String
Dim filterDist As Integer '抽稀距离
Dim Datums As Variant
Dim RowIndex As Long
Dim rIndex As Long, rIndex2 As Long, xa As Double, ya As Double, xb As Double, yb As Double
RowIndex = 1
filterDist = Sheet1.Cells(1, 6) '抽稀距离
If filterDist = 0 Then filterDist = 2
'Sheet1.Cells(1, 7) = "←F1单元格设置抽稀距离"
'Sheet1.Cells(4, 7) = "cehui@139.com"
Sheet1.Range("A1:E10000").ClearContents
Set Dia1 = Application.FileDialog(msoFileDialogFilePicker)
Dia1.Title = "版权所有(C) QQ:61902475 Email:cehui@139.com V20160225"
With Dia1
.AllowMultiSelect = False '限制只能同时选择一个文件
.Filters.Clear
.Filters.Add "南方CASS格式", "*.dat", 1 '限制显示的文件类型
.Show
For Each vrtSelectedItem In .SelectedItems
PPath = vrtSelectedItem
Next
End With
If Trim(PPath) <> "" Then
Open PPath For Input As #1
Do While Not EOF(1)
Line Input #1, Strr
If Trim(Strr) <> "" Then
Datums = Split(Strr, ",")
If UBound(Datums) = 4 Then
Sheet1.Cells(RowIndex, 1) = RowIndex
Sheet1.Cells(RowIndex, 2) = ""
Sheet1.Cells(RowIndex, 3) = Datums(2)
Sheet1.Cells(RowIndex, 4) = Datums(3)
Sheet1.Cells(RowIndex, 5) = Datums(4)
End If
End If
RowIndex = RowIndex + 1
Loop
Close #1
End If
'点抽稀
rIndex = 1
rIndex2 = rIndex + 1
Do While Sheet1.Cells(rIndex, 1).Text <> ""
If Trim(Sheet1.Cells(rIndex2, 2)) = "" Then
xa = Sheet1.Cells(rIndex, 3)
ya = Sheet1.Cells(rIndex, 4)
rIndex2 = rIndex + 1
Do While Sheet1.Cells(rIndex2, 1).Text <> ""
If (Abs(Sheet1.Cells(rIndex2, 3).Text - xa) < filterDist And Abs(Sheet1.Cells(rIndex2, 4).Text - ya) < filterDist) Then
If Distance(xa, ya, Sheet1.Cells(rIndex2, 3).Text, Sheet1.Cells(rIndex2, 4).Text, 3) < filterDist And Trim(Sheet1.Cells(rIndex, 2)) = "" And Trim(Sheet1.Cells(rIndex2, 2)) = "" Then
Sheet1.Cells(rIndex2, 2) = "T"
End If
End If
rIndex2 = rIndex2 + 1
Loop
End If
rIndex = rIndex + 1
Loop
If Trim(PPath) <> "" Then
rIndex = 1
RowIndex = 1
Open Left(PPath, InStr(UCase(PPath), ".DAT") - 1) & "-抽稀(" & filterDist & "m)-" & Replace(Format(Date, "yyyy-mm-dd"), "-", "") & "-" & Replace(Time, ":", "") & ".dat" For Output As #2
Do While Trim(Sheet1.Cells(rIndex, 1)) <> ""
'Sheet1.Cells(5, 7) = rIndex & ":" & RowIndex
If Trim(Sheet1.Cells(rIndex, 2)) = "" Then
Print #2, RowIndex & ",," & Format(Sheet1.Cells(rIndex, 3), "0.000") & "," & Format(Sheet1.Cells(rIndex, 4), "0.000") & "," & Format(Sheet1.Cells(rIndex, 5), "0.000")
RowIndex = RowIndex + 1
End If
rIndex = rIndex + 1
Loop
Close #2
End If
Sheet1.Range("B1:B10000").ClearContents
End Sub
对于删除重合地形点同样有用,只要将过滤间距设为一个很小的值如0.1即可。
后续将介绍Civil3D里增加VBA点过滤功能,如下图: 点过滤对话框: