天天看點

[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
           

繼續閱讀