VBA实现AutoCadMap下电杆符号批量转换

所属栏目:电子技术论文 发布日期:2012-10-13 10:49 热度:

  摘要:AutoCADMAP是我们所熟知的地理信息制图的重要软件之一,它不仅操作方便,而且功能十分强大.但由于我们需求的多样性,它在有些方面已经不能满足我们的需求.因此需要我们自己开发些功能来解决我们的需求问题.AutoCADMAP提供了强大的VBA开发技术,为我们实现AutoCADMAP的二次开发提供了有效的途径.本文在为提高生产效率与准确度的环境下,基于VBA开发实现了AutoCADMAP电杆符号的批量转换.
  关键词:VBA,电杆符号,AutoCADMAP
  1引言
  所谓电杆符号既电力机车轨道两旁的电杆.在我们进行数字化的时候,轨道载CAD中是一条平行双线,而电杆则是作为符号分布在平行线的两侧,而且要求符号的方向要垂直于轨道方向.通常一条轨道两侧总计会有几千个电杆符号,如果人工操作,则需要对每个符号进行处理,旋转.这将极大的降低工作效率,而且准确度也得不到保障.为解决这种需求。AutoCADMAP提供了强大的VBA开发技术,为我们实现AutoCADMAP的二次开发提供了必要的接口,使我们能通过这些接口和VBA语言实现CAD电杆符号的批量转换。
  2系统目标
  利用VBA语言与AutoCADMAP二次开发接口的结合,编写程序实现电杆符号的批量转换,提高生产效率,增强准确度.
  3系统设计方案
  (1)数据录入,把要数字化的电力机车轨道和符号输入到AutoCADMAP中,电杆符号中心线的末端要画在轨道上或穿过轨道,如图1所示:
  
  图1
  (2)利用AutoCADMAP的打断相交线工具,把刚才绘制的所有相交线打断,删除多余的部分,如图2所示:
  
  图2
  (3)通过以上两个步骤,使电力机车轨道变成了很多条线段,使每相邻两个电杆符号都有一段独立的机车轨道,通过编程获取这段机车轨道的方向(线角度),把电杆符号分别相对这个角度旋转正90度,负90度.通过程序分别选择所有的轨道和电杆符号,通过遍历,最终达到效果如图3所示:
  
  图3
  4主要程序代码:
  SubDIANGAN()
  DimlayerObjAsAcadLayer
  SetlayerObj=ThisDrawing.Layers.Add("GBLOCK")
  DimAngleFirstAsDouble
  DimAngleSecondAsDouble
  DimselsetAsAcadSelectionSet
  DimselAsAcadSelectionSet
  DimFilterType(0)AsInteger
  DimFilterData(0)AsVariant
  DimvarAAsVariant
  DimvarBAsVariant
  DimintIAsInteger
  FilterType(0)=0
  FilterData(0)="LWPOLYLINE"
  varA=FilterType
  varB=FilterData
  IfThisDrawing.SelectionSets.Count<>0Then
  ForintI=0ToThisDrawing.SelectionSets.Count-1
  Setselset=ThisDrawing.SelectionSets.Item(intI)
  selset.Delete
  OnErrorResumeNext
  NextintI
  EndIf
  sset.Delete
  Setselset=ThisDrawing.SelectionSets.Add("SS3")
  selset.SelectOnScreenFilterType,FilterData
  Setsel=ThisDrawing.SelectionSets.Add("SS4")
  FilterType(0)=0
  FilterData(0)="LWPOLYLINE"
  sel.SelectOnScreenFilterType,FilterData
  DimpobAsAcadLWPolyline
  DimPOB2AsAcadLWPolyline
  DimJpointAsVariant,TpointAsVariant
  DimblockBHAsAcadBlockReference
  DimstrDirNameAsString
  Dimbj(10000,2)AsDouble
  DimrAsInteger,jAsInteger,cjAsInteger
  strDirName="D:G500编辑程序dqhtl.dwg"
  r=0
  cj=0
  ForEachpobInselset
  ForEachPOB2Insel
  cj=0
  Jpoint=pob.IntersectWith(POB2,acExtendNone)
  IfUBound(Jpoint)>0Then
  Forj=0Tor-1
  IfJpoint(0)=bj(j,0)AndJpoint(1)=bj(j,1)Then
  cj=cj+1
  EndIf
  Nextj
  bj(r,0)=Jpoint(0)
  bj(r,1)=Jpoint(1)
  r=r+1
  Ifcj>0Then
  Else
  Dimpp(2)AsDouble
  pp(0)=Jpoint(0)
  pp(1)=Jpoint(1)
  pp(2)=0
  DimkAsInteger
  Fork=0ToUBound(pob.Coordinates)
  Ifpob.Coordinate(0)(0)=Jpoint(0)Andpob.Coordinate(0)(1)=Jpoint(1)Then
  CallAngle(pob.Coordinate(0)(0),pob.Coordinate(0)(1),pob.Coordinate(1)(0),pob.Coordinate(1)(1),AngleFirst,AngleSecond)
  Else
  k=(UBound(pob.Coordinates)+1)/2-1
  CallAngle(pob.Coordinate(k-1)(0),pob.Coordinate(k-1)(1),pob.Coordinate(k)(0),pob.Coordinate(k)(1),AngleFirst,AngleSecond)
  EndIf
  Nextk
  SetblockBH=ThisDrawing.ModelSpace.InsertBlock(pp,strDirName,0.1,0.1,0.1,AngleFirst)
  blockBH.Layer="GBLOCK"
  SetblockBH=ThisDrawing.ModelSpace.InsertBlock(pp,strDirName,0.1,0.1,0.1,AngleSecond)
  blockBH.Layer="GBLOCK"
  EndIf
  EndIf
  NextPOB2
  Nextpob
  EndSub
  5结束语
  AutoCADMAP二次开发接口和VBA语言的结合所产生的作用是非常强大的,本文所实现的功能只是它的一个简单的典型应用,它个更多功能还需大家去发掘去体会。
  参考文献
  
  [1]AutoCAD+VBA二次开发来源:InterNet明经通道

文章标题:VBA实现AutoCadMap下电杆符号批量转换

转载请注明来自:http://www.sofabiao.com/fblw/dianxin/dianzijishu/13488.html

相关问题解答

SCI服务

搜论文知识网的海量职称论文范文仅供广大读者免费阅读使用! 冀ICP备15021333号-3