天天看点

[EA VBscript] 日常工作 1. 连线调整

来日本3个月,EA也差不多用习惯了。但是越来越多的元素和近千根连线也让整个画面看上去非常凌乱。手调是一辈子都不可能手调的,虽然日本人就想让我干这种杂活……于是网上寻找EA的脚本工具。

EA script支持三种语言 JavaScript,VBscript以及JS。我还是VBscript用的熟练,就一直在用。国内也没有什么论坛网站可以参考的,只能去EA官网看手册,或者官网啃英文论坛……,还有一个叫BELLEKENS的大神做了很多EA的工具。

后期也准备学一学EA Add-In 与EA Shape script 还有EA SQL,这些都会对工作有帮助。

转正题,近千根连线很头疼,我也对EA的函数感觉有点头疼,比如命名选中右击有追加固定点的选项,可是愣是找不到追加固定点的函数或者代码。在官网找了两周都没找到。以至于我没办法完成对线方向布置的想法。EA自带的布线方式太难受了,会将数根线重合在一起,根本分不清哪根是哪根。研究了两周,时间有限我能力也有限也只能写出一些基本的代码。如果有同样使用EA的大神,请给予我一些帮助,谢谢啦。下面是我写的代码。

!INC Local Scripts.EAConstants-VBScript

'
' Script Name: LineAdjust
' Author: Sora Fu
' Purpose: To automatic fix two ends of connectors and change its routing type, but script works not good.
' Date: 2018/11/14
'
sub main
	dim package as EA.Package
	dim element1 as EA.Element
	dim connector1 as EA.Connector
	
	SumConnNum=0
	EleNumCal=0

	set package = Repository.GetTreeSelectedPackage
	
	
	'for each subpackage in package.Packages
	'session.output(subpackage.name)            	'success  To find subpackage
	'next
	
	'--------------------------------------Comps Assignment-------------------------------------------
	dim comps as EA.Collection
	set comps = package.Elements
	SumEleNum=comps.Count
	
	
	' List all resources
	for i = 0 to comps.Count - 1
		dim currentcomp as EA.Element
		set currentcomp = comps.GetAt( i )
		
		SumConnNum=SumConnNum+currentcomp.Connectors.Count	
		
		dim subcomps as EA.Collection
		set subcomps = comps.GetAt(i).Elements
		
		SumEleNum=SumEleNum+subcomps.count
		
		for j = 0 to subcomps.Count - 1
		dim currentsubcomp as EA.Element
		set currentsubcomp = subcomps.GetAt( j )
		SumConnNum=SumConnNum+currentsubcomp.Connectors.Count
		next
		
	next
	SumEleNum=SumEleNum-1
	SumConnNum=SumConnNum/2-1
	
	redim CompArray(SumEleNum,2)   		'ElementID,SumConnNum,ConnNumCal
	redim ConnArray(SumConnNum,2)			'ConnID,ConnType,ElementID
	
	for i = 0 to comps.Count - 1
		set currentcomp = comps.GetAt( i )
		
		CompArray(EleNumCal,0)=currentcomp.ElementID
		CompArray(EleNumCal,1)=0
		CompArray(EleNumCal,2)=0
		EleNumCal=EleNumCal+1	
		
		
		set subcomps = comps.GetAt(i).Elements
				
		for j = 0 to subcomps.Count - 1
		
		set currentsubcomp = subcomps.GetAt( j )
		
		CompArray(EleNumCal,0)=currentsubcomp.ElementID
		CompArray(EleNumCal,1)=0
		CompArray(EleNumCal,2)=0
		EleNumCal=EleNumCal+1	
		
		next
		
	next
	
	
	EleNumCal=0
	ConnNumCal=0
	'--------------------------------------Conns Assignment-------------------------------------------
	
	for EleNumCal=0 to SumEleNum
	for each connector1 in Repository.GetElementByID(CompArray(EleNumCal,0)).Connectors  
	'for each element1 in package.Elements
	'for each connector1 in element1.Connectors
	select case JudgeComplex(connector1.ConnectorID,ConnArray,SumConnNum)
		case 0 	ConnArray(ConnNumCal,0)=connector1.ConnectorID
				ConnArray(ConnNumCal,1)=connector1.Type
				ConnArray(ConnNumCal,2)=CompArray(EleNumCal,0)
				ConnNumCal=ConnNumCal+1
	end select
	CompArray(EleNumCal,1)=CompArray(EleNumCal,1)+1
	next
	next
	'next
	'--------------------------------------Conns Assignment-------------------------------------------	


	EleNumCal=0
	ConnNumCal=0
'--------------------------------------Diagram Excute-------------------------------------------
for each diagram1 in package.Diagrams
   for each dl in diagram1.diagramlinks
	for ConnNumCal= 0 to SumConnNum
	if dl.ConnectorID=ConnArray(ConnNumCal,0) then
	
	select case ConnArray(ConnNumCal,1)
		case "Association"
			for EleNumCal= 0 to SumEleNum
				if CompArray(EleNumCal,0)=ConnArray(ConnNumCal,2) then
					numPort= CompArray(EleNumCal,2)+1
					SumNum = CompArray(EleNumCal,1)+1
					dl.Style="LSP=" & Cint(100*numPort/SumNum) & "R ;LEP=" & Cint(100*numPort/SumNum)  & "L"
				'dl.Style="LSP=050R;LEP=050L"   'lock Start Point 50% position of right side of box, lock end point 50% position of left side of box
					dl.LineStyle=5                 '5=Tree Horizontal
					'dl.LineWidth=3 
					'dl.LineColor=RGB(255,0,255)
					dl.Update()
					CompArray(EleNumCal,2)=CompArray(EleNumCal,2)+1
					end if
					next
	end select

	end if
	next
   next
next
end sub

main

private function JudgeComplex( a , b , k ) 
	dim i
	for i =0 to k
		if a=b(i,0) then
		JudgeComplex=1
		exit function
		end if
	next
	JudgeComplex=0
end function
           

继续阅读