Profile Rerouting Rule

This action rule reroutes the inputs of stiffeners, stiffeners on free edges, beams, and openings on profiles.

This page discusses:

General Information

This action rule is invoked when it is called in the main rerouting rule.

Arguments

Name Type
lvProfileReroutingInputs List

Sample

/* Argument List
lvProfileReroutingInputs : List
*/

/* Contents of lvProfileReroutingInputs list
The order of inputs MUST be respected
iCopySpecification Type = StrStructureCopySpecification // First item of lvProfileReroutingInputs
iSourceObject Type = Feature // Second item of lvProfileReroutingInputs
iResultObject Type = Feature  // Thrid item of lvProfileReroutingInputs
*/

/* About Action
The name of this Action should be 'Profile Rerouting Rule'
This Action should be located under a Related Set named 'Copy Rerouting Rule'
*/

let iCopySpecification(StrStructureCopySpecification)
let iSourceObject(Feature)
let iResultObject(Feature)

let NbrmyInput(Integer)
set NbrmyInput = lvProfileReroutingInputs->Size()
if(NbrmyInput == 3)
{	
	set iCopySpecification = lvProfileReroutingInputs->GetItem(1)
	set iSourceObject = lvProfileReroutingInputs->GetItem(2)
	set iResultObject = lvProfileReroutingInputs->GetItem(3)
}

if(iCopySpecification <> NULL and iSourceObject <> NULL and iResultObject <> NULL)
{	
	let DestinationPartFeature(PartFeature)
	let Destination(Feature)
	
	DestinationPartFeature = iResultObject->Find("PartFeature", "", false)
	let ChildrenList1, ChildrenList2, ChildrenList3(List)
	if( NULL <> DestinationPartFeature )
		ChildrenList1 = DestinationPartFeature.Children
	set ChildrenList2 = ChildrenList1->Filter("OpenBodyFeature", "x.Name == \"RuleCopyReferences\"") // a geometrical set for new input objects
	if( 0 < ChildrenList2->Size() )
		set Destination = ChildrenList2->GetItem(1)
	if(Destination == NULL and DestinationPartFeature <> NULL)
		new("OpenBodyFeature", "RuleCopyReferences", DestinationPartFeature)	
	
	let SymmetryPlane, SourcePlaneWF, DestinationPlaneWF(Wireframe)
	let CopyMode(Integer)	
	let TranslateDirection(Direction)
	let TranslateVector(Vector)
	let TranslateDistance(LENGTH)
	let TranslationLine(Line)
	let CopyReferencePlane(List)
	let TransformationCopyMatrix(Matrix)
	
	iCopySpecification->GetReferencePlane(CopyReferencePlane)
	if(CopyReferencePlane.Size() == 1)
	{
		set SymmetryPlane = CopyReferencePlane.GetItem(1)	
		CopyMode = 1
	}
	else if(CopyReferencePlane.Size() == 2)
	{
		set SourcePlaneWF = CopyReferencePlane.GetItem(1)
		set DestinationPlaneWF = CopyReferencePlane.GetItem(2)
		CopyMode = 2
		let SourcePlaneCOG, DestinationPlaneCOG(Point)
		set SourcePlaneCOG = new("Point", "SourcePointCoG", Destination)
		set SourcePlaneCOG = centerofgravity(SourcePlaneWF)
		set DestinationPlaneCOG = new("Point", "DestinationPointCoG", Destination)
		set DestinationPlaneCOG = centerofgravity(DestinationPlaneWF)	
		
		set TranslationLine = new("Line", "TranslationLine", Destination)
		set TranslationLine = line(SourcePlaneCOG, DestinationPlaneCOG)
		TranslateDirection = direction(TranslationLine)
		TranslateDistance = length(TranslationLine)	
		set TranslateVector = TranslateDirection.Vector()
		
		SourcePlaneCOG->Delete()
		DestinationPlaneCOG->Delete()
	}
	
	let SourceProfile, ResultProfile(SldProfile)
	set SourceProfile = iSourceObject
	set ResultProfile = iResultObject
	if(SourceProfile <> NULL and ResultProfile <> NULL)
	{		
		let iProfileType(Integer)
		SourceProfile->GetType(iProfileType)
		if(iProfileType == 0) //ProfilePtLength
		{
			let SourceMember, ResultMember(SldMember)
			set SourceMember = SourceProfile
			let SourceStartPoint(Feature)
			SourceMember->GetStartPt(SourceStartPoint)		
			
			let NewPoint(Point)
			if(CopyMode == 1)
			{
				set NewPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name , Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				set NewPointWireFrame = symmetry(SourceStartPointWireFrame , SymmetryPlane)
				set NewPoint = NewPointWireFrame			
			}
			else if(CopyMode == 2)
			{
				set NewPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				let SourcePlane(Plane)
				set SourcePlane = SourcePlaneWF
				
				set NewPointWireFrame = translate(SourceStartPointWireFrame , TranslateDirection, TranslateDistance)
				set NewPoint = NewPointWireFrame
			}
			if(NewPoint <> NULL)
			{
				set ResultMember = ResultProfile
				if(ResultMember <> NULL)
				{
					ResultMember->SetStartPt(NewPoint)
				}
			}
			
			let SourceDirectionFeature, ResultDirectionFeature(Feature)
			let NewDirectionOrientation(Integer)
			SourceMember->GetDirection(SourceDirectionFeature)
			if(SourceDirectionFeature <> NULL)
			{
				let bRetrievedDirection(Boolean)
				bRetrievedDirection = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceDirectionFeature, -1, ResultDirectionFeature, NewDirectionOrientation)
				if(bRetrievedDirection == FALSE)
				{
					if(CopyMode == 1)
					{
						set ResultDirectionFeature = new("Plane", SourceDirectionFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceDirectionWireFrame, NewDirectionWireFrame(Wireframe)
						set SourceDirectionWireFrame = SourceDirectionFeature
						set NewDirectionWireFrame = symmetry(SourceDirectionWireFrame , SymmetryPlane)
						set ResultDirectionFeature = NewDirectionWireFrame			
					}
					else if(CopyMode == 2)
					{
						set ResultDirectionFeature = new("Plane", SourceDirectionFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceDirectionWireFrame, NewDirectionWireFrame(Wireframe)
						set SourceDirectionWireFrame = SourceDirectionFeature
						
						set NewDirectionWireFrame = translate(SourceDirectionWireFrame , TranslateDirection, TranslateDistance)
						set ResultDirectionFeature = NewDirectionWireFrame
					}	
				}
				if(ResultDirectionFeature <> NULL)
				{
					set ResultMember = ResultProfile
					if(ResultMember <> NULL)
					{
						ResultMember->SetDirection(ResultDirectionFeature)
					}		
				}
			}
		}
		else if(iProfileType == 1) //ProfilePtLimit
		{
			let SourceMember, ResultMember(SldMember)
			set SourceMember = SourceProfile
			let SourceStartPoint(Feature)
			SourceMember->GetStartPt(SourceStartPoint)		
			
			let NewPoint(Point)
			if(CopyMode == 1)
			{
				set NewPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				set NewPointWireFrame = symmetry(SourceStartPointWireFrame , SymmetryPlane)
				set NewPoint = NewPointWireFrame			
			}
			else if(CopyMode == 2)
			{
				set NewPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				let SourcePlane(Plane)
				set SourcePlane = SourcePlaneWF
				
				set NewPointWireFrame = translate(SourceStartPointWireFrame , TranslateDirection, TranslateDistance)
				set NewPoint = NewPointWireFrame
			}
			if(NewPoint <> NULL)
			{
				set ResultMember = ResultProfile
				if(ResultMember <> NULL)
				{
					ResultMember->SetStartPt(NewPoint)
				}
			}
			
			let SourceLimitFeature, ResultLimitFeature(Feature)
			let NewLimitOrientation(Integer)
			SourceMember->GetUpToLimit(SourceLimitFeature)
			if(SourceLimitFeature <> NULL)
			{
				let bRetrievedLimit(Boolean)
				bRetrievedLimit = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceLimitFeature, -1, ResultLimitFeature, NewLimitOrientation)
				if(bRetrievedLimit == FALSE)
				{
					if(CopyMode == 1)
					{
						set ResultLimitFeature = new("Plane", SourceLimitFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceLimitWireFrame, NewLimitWireFrame(Wireframe)
						set SourceLimitWireFrame = SourceLimitFeature
						set NewLimitWireFrame = symmetry(SourceLimitWireFrame , SymmetryPlane)
						set ResultLimitFeature = NewLimitWireFrame			
					}
					else if(CopyMode == 2)
					{
						set ResultLimitFeature = new("Plane", SourceLimitFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceLimitWireFrame, NewLimitWireFrame(Wireframe)
						set SourceLimitWireFrame = SourceLimitFeature
						
						set NewLimitWireFrame = translate(SourceLimitWireFrame , TranslateDirection, TranslateDistance)
						set ResultLimitFeature = NewLimitWireFrame
					}	
				}
				if(ResultLimitFeature <> NULL)
				{
					set ResultMember = ResultProfile
					if(ResultMember <> NULL)
					{
						ResultMember->SetUpToLimit(ResultLimitFeature)
					}		
				}
			}
			let SourceDirectionFeature, ResultDirectionFeature(Feature)
			let NewDirectionOrientation(Integer)
			SourceMember->GetDirection(SourceDirectionFeature)
			if(SourceDirectionFeature <> NULL)
			{
				let bRetrievedDirection(Boolean)
				bRetrievedDirection = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceDirectionFeature, -1, ResultDirectionFeature, NewDirectionOrientation)
				if(bRetrievedDirection == FALSE)
				{
					if(CopyMode == 1)
					{
						set ResultDirectionFeature = new("Plane", SourceDirectionFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceDirectionWireFrame, NewDirectionWireFrame(Wireframe)
						set SourceDirectionWireFrame = SourceDirectionFeature
						set NewDirectionWireFrame = symmetry(SourceDirectionWireFrame , SymmetryPlane)
						set ResultDirectionFeature = NewDirectionWireFrame			
					}
					else if(CopyMode == 2)
					{
						set ResultDirectionFeature = new("Plane", SourceDirectionFeature.Name + "_" + iCopySpecification.Name, Destination)
						let SourceDirectionWireFrame, NewDirectionWireFrame(Wireframe)
						set SourceDirectionWireFrame = SourceDirectionFeature
						
						set NewDirectionWireFrame = translate(SourceDirectionWireFrame , TranslateDirection, TranslateDistance)
						set ResultDirectionFeature = NewDirectionWireFrame
					}	
				}			
				if(ResultDirectionFeature <> NULL)
				{
					set ResultMember = ResultProfile
					if(ResultMember <> NULL)
					{
						ResultMember->SetDirection(ResultDirectionFeature)
					}		
				}
			}		
		}
		
		else if(iProfileType == 2) //ProfilePts
		{
			let SourceMember, ResultMember(SldMember)
			set SourceMember = SourceProfile
			let SourceStartPoint, SourceEndPoint(Feature)
			SourceMember->GetStartPt(SourceStartPoint)
			SourceMember->GetEndPt(SourceEndPoint)
			
			let NewStartPoint(Point)
			if(CopyMode == 1)
			{
				set NewStartPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				set NewPointWireFrame = symmetry(SourceStartPointWireFrame , SymmetryPlane)
				set NewStartPoint = NewPointWireFrame			
			}
			else if(CopyMode == 2)
			{
				set NewStartPoint = new("Point", SourceStartPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceStartPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceStartPointWireFrame = SourceStartPoint
				let SourcePlane(Plane)
				set SourcePlane = SourcePlaneWF
				
				set NewPointWireFrame = translate(SourceStartPointWireFrame , TranslateDirection, TranslateDistance)
				set NewStartPoint = NewPointWireFrame
			}
			if(NewStartPoint <> NULL)
			{
				set ResultMember = ResultProfile
				if(ResultMember <> NULL)
					ResultMember->SetStartPt(NewStartPoint)
			}
			
			let NewEndPoint(Point)
			if(CopyMode == 1)
			{
				set NewEndPoint = new("Point", SourceEndPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceEndPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceEndPointWireFrame = SourceEndPoint
				set NewPointWireFrame = symmetry(SourceEndPointWireFrame , SymmetryPlane)
				set NewEndPoint = NewPointWireFrame			
			}
			else if(CopyMode == 2)
			{
				set NewEndPoint = new("Point", SourceEndPoint.Name + "_" + iCopySpecification.Name, Destination)
				let SourceEndPointWireFrame, NewPointWireFrame(Wireframe)
				set SourceEndPointWireFrame = SourceEndPoint
				let SourcePlane(Plane)
				set SourcePlane = SourcePlaneWF
				
				set NewPointWireFrame = translate(SourceEndPointWireFrame , TranslateDirection, TranslateDistance)
				set NewEndPoint = NewPointWireFrame
			}
			if(NewEndPoint <> NULL)
			{
				set ResultMember = ResultProfile
				if(ResultMember <> NULL)
					ResultMember->SetEndPt(NewEndPoint)
			}		
		}
		else if(iProfileType == 3) //ProfileCrv --> Member, SFE
		{
			let SourceCurve(Feature)
			SourceProfile->GetCurve(SourceCurve)		
			let NewCurve(Curve)
			if(CopyMode == 1)
			{
				set NewCurve = new("Curve", SourceCurve.Name + "_" + iCopySpecification.Name, Destination)
				let SourceCurveWireFrame, NewCurveWireFrame(Wireframe)
				set SourceCurveWireFrame = SourceCurve
				set NewCurveWireFrame = symmetry(SourceCurveWireFrame , SymmetryPlane)
				set NewCurve = NewCurveWireFrame			
			}
			else if(CopyMode == 2)
			{
				set NewCurve = new("Curve", SourceCurve.Name + "_" + iCopySpecification.Name, Destination)
				let SourceCurveWireFrame, NewCurveWireFrame(Wireframe)
				set SourceCurveWireFrame = SourceCurve
				let SourcePlane(Plane)
				set SourcePlane = SourcePlaneWF
				
				set NewCurveWireFrame = translate(SourceCurveWireFrame , TranslateDirection, TranslateDistance)
				set NewCurve = NewCurveWireFrame
			}
			if(NewCurve <> NULL)
			{
				ResultProfile->SetCurve(NewCurve)
			}
			
			let SourceReference, ResultReference(Feature)
			SourceProfile->GetReference(SourceReference)
			
			let SourceWebOrientation, NewWebOrientation(Integer)
			SourceProfile->GetWebOrientation(SourceWebOrientation)	
			let bRetrievedReference(Boolean)
			bRetrievedReference = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceReference, SourceWebOrientation, ResultReference, NewWebOrientation)
			if(bRetrievedReference == TRUE)
			{			
				ResultProfile->SetReference(ResultReference)
			}
			else
			{
				
				let PanelSourceReference, PanelResultReference(SldPanel)
				set PanelSourceReference = SourceReference.Owner
				if(PanelSourceReference <> NULL)
				{				
					bRetrievedReference = iCopySpecification->RetrieveNewObject(SourceReference, ResultReference)
					if(bRetrievedReference == TRUE)
					{
						set PanelResultReference = ResultReference
						PanelResultReference->GetSupport(ResultReference)
						ResultProfile->SetReference(ResultReference)
					}
				}
				else
				{
					bRetrievedReference = iCopySpecification->CreateTransformedObject(SourceReference, Destination, ResultReference, 0)
					if(bRetrievedReference == TRUE)
					{
						ResultProfile->SetReference(ResultReference)
					}
				}
			}
		}
		else if(iProfileType == 5) //ProfileSurfSurf
		{
			// Stiffener and Member(ReferencePlane)
			let SourceFirstSurfaceFeature, NewFirstSurfaceFeature(Feature)
			SourceProfile->GetFirstSurface(SourceFirstSurfaceFeature)
			let SourceSupportPanel(SldPanel)
			set SourceSupportPanel = SourceFirstSurfaceFeature.Owner
			if(SourceSupportPanel <> NULL)
			{
				SourceSupportPanel->GetSupport(SourceFirstSurfaceFeature)
			}
			let SourceWebOrientation, NewWebOrientation(Integer)
			SourceProfile->GetWebOrientation(SourceWebOrientation)	
			let bRetrievedFirstSurface(Boolean)
			bRetrievedFirstSurface = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceFirstSurfaceFeature, SourceWebOrientation, NewFirstSurfaceFeature, NewWebOrientation)
			if(bRetrievedFirstSurface == TRUE)
			{
				let SourceMember(SldMember)
				set SourceMember = SourceProfile
				if( SourceMember <> NULL)
					ResultProfile->SetFirstSurface(NewFirstSurfaceFeature)
				
				ResultProfile->SetWebOrientation(NewWebOrientation)			
			}
			
			let SourceSecondSurfaceFeature, NewSecondSurfaceFeature(Feature)
			SourceProfile->GetSecondSurface(SourceSecondSurfaceFeature)
			let SourceFlangeOrientation, NewFlangeOrientation(Integer)
			SourceProfile->GetFlangeOrientation(SourceFlangeOrientation)	
			let bRetrievedSecondSurface(Boolean)
			bRetrievedSecondSurface = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceSecondSurfaceFeature, SourceFlangeOrientation, NewSecondSurfaceFeature, NewFlangeOrientation)
			if(bRetrievedSecondSurface == FALSE)
			{
				iCopySpecification->CreateTransformedObject(SourceSecondSurfaceFeature, Destination, NewSecondSurfaceFeature, 0)
			}
			if(NewSecondSurfaceFeature <> NULL)
			{
				ResultProfile->SetSecondSurface(NewSecondSurfaceFeature)
				ResultProfile->SetFlangeOrientation(NewFlangeOrientation)			
			}
		}
		else if(iProfileType == 6) //ProfileOnOpening
		{
			let SourceStiffenerOnFreeEdge(SldStiffenerOnFreeEdge)
			set SourceStiffenerOnFreeEdge = SourceProfile
			if(SourceStiffenerOnFreeEdge <> NULL)
			{
				let SourceSFEOpening, ResultSFEOpening(Feature)
				SourceStiffenerOnFreeEdge->GetOpening(SourceSFEOpening)
				
				let SourceSupportPanelFeature, ResultSupportPanelFeature(Feature)
				set SourceSupportPanelFeature = SourceProfile.Owner
				
				let NewResultSupportPanelFeature(Feature)
				iCopySpecification->RetrieveNewObject(SourceSupportPanelFeature, NewResultSupportPanelFeature)
				if(ResultSupportPanelFeature == NULL)
				{
					set ResultSupportPanelFeature = ResultProfile.Owner
					if(NewResultSupportPanelFeature <> ResultSupportPanelFeature)
					{
						let SourceSupportPanel, ResultSupportPanel(SldPanel)
						set SourceSupportPanel = SourceSupportPanelFeature
						set ResultSupportPanel = NewResultSupportPanelFeature
						
						let SourcePanelOpenings, ResultPanelOpening(List)
						SourceSupportPanel->GetOpenings(SourcePanelOpenings, 0)
						ResultSupportPanel->GetOpenings(ResultPanelOpening, 0)
						
						let nbrSourcePanelOpening(Integer)
						nbrSourcePanelOpening = SourcePanelOpenings->Size()
						if(nbrSourcePanelOpening == ResultPanelOpening->Size())
						{
							let idxCnt(Integer)
							set idxCnt = 1
							for idxCnt while idxCnt <= nbrSourcePanelOpening
							{
								let SourceOpening(Feature)
								SourceOpening = SourcePanelOpenings->GetItem(idxCnt)
								
								if(SourceOpening == SourceSFEOpening)
								{
									let NewResultOpening(Feature)
									NewResultOpening = ResultPanelOpening->GetItem(idxCnt)
									
									let ResultStiffenerOnFreeEdge(SldStiffenerOnFreeEdge)
									set ResultStiffenerOnFreeEdge = ResultProfile
									if(ResultStiffenerOnFreeEdge <> NULL)
									{
										ResultStiffenerOnFreeEdge->SetOpening(NewResultOpening)
									}
								}
							}	
						}	
					}
				}
			}
		}
		else if(iProfileType == 7) //ProfileOnLimit
		{
			let SourceStiffenerOnFreeEdge, ResultStiffenerOnFreeEdge(SldStiffenerOnFreeEdge)
			set SourceStiffenerOnFreeEdge = SourceProfile
			set ResultStiffenerOnFreeEdge = ResultProfile
			if(SourceStiffenerOnFreeEdge<> NULL)
			{
				let SourceFirstSurface, NewFirstSurface(Feature)
				let SourceSupportPanel(SldPanel)
				set SourceSupportPanel = SourceProfile.Owner		
				if(SourceSupportPanel <> NULL)
				{
					SourceSupportPanel->GetSupport(SourceFirstSurface)
					let SourceWebOrientation, NewWebOrientation(Integer)
					SourceProfile->GetWebOrientation(SourceWebOrientation)	
					let bRetrievedFirstSurface(Boolean)
					bRetrievedFirstSurface = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceFirstSurface, SourceWebOrientation, NewFirstSurface, NewWebOrientation)
					if(bRetrievedFirstSurface == TRUE)
					{			
						ResultProfile->SetWebOrientation(NewWebOrientation)			
					}					
				}
				
				let lvSourceLimits, lvResultLimits(List)
				SourceStiffenerOnFreeEdge->GetSupportLimits(lvSourceLimits)			
				ResultStiffenerOnFreeEdge->GetSupportLimits(lvResultLimits)
				let SourceSupportLimit, NewSupportLimit(Feature)
				if(lvSourceLimits->Size() == lvResultLimits->Size() and lvSourceLimits->Size() >= 1)
				{
					let lvNewResultLimits(List)
					let SourceSupportOrientation, NewSupportOrientation(Integer)
					SourceSupportOrientation = 0
					set SourceSupportLimit = lvSourceLimits.GetItem(1)
					let bRetrievedSupport(Boolean)
					bRetrievedSupport = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceSupportLimit, SourceSupportOrientation, NewSupportLimit, NewSupportOrientation)
					if(bRetrievedSupport == TRUE and NewSupportLimit <> NULL)
					{
						lvNewResultLimits->Append(NewSupportLimit)
						ResultStiffenerOnFreeEdge->SetSupportLimits(lvNewResultLimits)				
					}
				}
			}
		}
		
		// Limit for all Profile types
		// Compute Start Limit
		let SourceStartLimit, NewStartLimit(Feature)
		SourceProfile->GetLimitingObject(1, SourceStartLimit)
		let SourceStartLimitOrientation, NewStartLimitOrientation(Integer)
		SourceStartLimitOrientation = -1
		let bRetrievedStartLimit(Boolean)
		bRetrievedStartLimit = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceStartLimit, SourceStartLimitOrientation, NewStartLimit, NewStartLimitOrientation)
		if(bRetrievedStartLimit == FALSE)
		{
			let SourceStartLimit_Function(SldFunction)
			let SourceStartLimit_Panel(SldPanel)
			set SourceStartLimit_Function = SourceStartLimit
			set SourceStartLimit_Panel = SourceStartLimit
			if(SourceStartLimit_Function <> NULL or SourceStartLimit_Panel <> NULL)
			{
				iCopySpecification->RetrieveNewObject(SourceStartLimit, NewStartLimit)
			}
			else
			{
				let NewLimit(Feature)
				if(CopyMode == 1)
				{
					set NewLimit = new("Plane", SourceStartLimit.Name + "_" + iCopySpecification.Name, Destination)
					let SourceSupportWireFrame, NewSupportWireFrame(Wireframe)
					set SourceSupportWireFrame = SourceStartLimit
					set NewSupportWireFrame = symmetry(SourceSupportWireFrame , SymmetryPlane)
					set NewLimit = NewSupportWireFrame			
				}
				else if(CopyMode == 2)
				{
					set NewLimit = new("Plane", SourceStartLimit.Name + "_" + iCopySpecification.Name, Destination)
					let SourceSupportWireFrame, NewSupportWireFrame(Wireframe)
					set SourceSupportWireFrame = SourceStartLimit
					let SourcePlane(Plane)
					set SourcePlane = SourcePlaneWF
					
					set NewSupportWireFrame = translate(SourceSupportWireFrame , TranslateDirection, TranslateDistance)
					set NewLimit = NewSupportWireFrame
				}
				if(NewLimit <> NULL)
					set NewStartLimit = NewLimit
			}		
		}
		
		// Compute End Limit
		let SourceEndLimit, NewEndLimit(Feature)
		SourceProfile->GetLimitingObject(2, SourceEndLimit)
		let SourceEndLimitOrientation, NewEndLimitOrientation(Integer)
		SourceEndLimitOrientation = -1
		let bRetrievedEndLimit(Boolean)
		bRetrievedEndLimit = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceEndLimit, SourceEndLimitOrientation, NewEndLimit, NewEndLimitOrientation)
		if(bRetrievedEndLimit == FALSE)
		{
			let SourceEndLimit_Function(SldFunction)
			let SourceEndLimit_Panel(SldPanel)
			set SourceEndLimit_Function = SourceEndLimit
			set SourceEndLimit_Panel = SourceEndLimit
			if(SourceEndLimit_Function <> NULL or SourceEndLimit_Panel <> NULL)
			{
				iCopySpecification->RetrieveNewObject(SourceEndLimit, NewEndLimit)
			}
			else
			{
				let NewLimit(Feature)
				if(CopyMode == 1)
				{
					set NewLimit = new("Plane", SourceEndLimit.Name + "_" + iCopySpecification.Name, Destination)
					let SourceSupportWireFrame, NewSupportWireFrame(Wireframe)
					set SourceSupportWireFrame = SourceEndLimit
					set NewSupportWireFrame = symmetry(SourceSupportWireFrame , SymmetryPlane)
					set NewLimit = NewSupportWireFrame			
				}
				else if(CopyMode == 2)
				{
					set NewLimit = new("Plane", SourceEndLimit.Name + "_" + iCopySpecification.Name, Destination)
					let SourceSupportWireFrame, NewSupportWireFrame(Wireframe)
					set SourceSupportWireFrame = SourceEndLimit
					let SourcePlane(Plane)
					set SourcePlane = SourcePlaneWF
					
					set NewSupportWireFrame = translate(SourceSupportWireFrame , TranslateDirection, TranslateDistance)
					set NewLimit = NewSupportWireFrame
				}
				if(NewLimit <> NULL)
					set NewEndLimit = NewLimit			
			}		
		}
		
		// Set Start and End Limit
		if(NewStartLimit <> NULL and NewEndLimit <> NULL)
		{
			let rc_ProfileLimit(Boolean)
			rc_ProfileLimit = ResultProfile->SetLimitingObjects(NewStartLimit, NewEndLimit)
			if(rc_ProfileLimit == FALSE)
			{
				ResultProfile->InvertProfile()
				ResultProfile->SetLimitingObjects(NewStartLimit, NewEndLimit)
			}		
		}
		else
		{
			if(NewStartLimit <> NULL)
			{
				ResultProfile->SetLimitingObject(1, NewStartLimit)
			}
			if(NewEndLimit <> NULL)
			{
				ResultProfile->SetLimitingObject(2, NewEndLimit)
			}		
		}
		
		
		// Reroute Profile Opening
		let lvSourceOpenings, lvResultOpenings(List)
		let OpeningType(Integer)
		set OpeningType = 0
		SourceProfile->GetOpenings(lvSourceOpenings, OpeningType)	
		ResultProfile->GetOpenings(lvResultOpenings, OpeningType)
		
		let nbrSourceOpenings, nbrResultOpenings(Integer)
		set nbrSourceOpenings = lvSourceOpenings.Size()
		set nbrResultOpenings = lvResultOpenings.Size()
		if(nbrSourceOpenings == nbrResultOpenings)
		{
			let idxCnt(Integer)
			set idxCnt = 1
			for idxCnt while idxCnt <= nbrSourceOpenings
			{
				let SourceOpeningFeature, ResultOpeningFeature(Feature)
				set SourceOpeningFeature = lvSourceOpenings->GetItem(idxCnt)
				set ResultOpeningFeature = lvResultOpenings->GetItem(idxCnt)
				
				let SourceOpening, ResultOpening(SldOpeningPr)
				set SourceOpening = SourceOpeningFeature
				set ResultOpening = ResultOpeningFeature
				
				let SourceOpeningType, ResultOpeningType(Integer)			
				SourceOpeningType = SourceOpening.OpeningType
				ResultOpeningType = ResultOpening.OpeningType
				
				if(SourceOpeningType == ResultOpeningType)
				{
					if(SourceOpeningType == 0) // 3DObject Opening
					{
						let SourceCuttingElement, NewCuttingElement(Feature)
						SourceOpening->GetCuttingElement(SourceCuttingElement)
						
						iCopySpecification->CreateTransformedObject(SourceCuttingElement, Destination, NewCuttingElement, 0)
						if(NewCuttingElement <> NULL)
						{
							ResultOpening->SetCuttingElement(NewCuttingElement)
						}
					}
					else if(SourceOpeningType == 1) // OutputProfile Opening
					{
						let SourcePanel(Feature)
						set SourcePanel = SourceProfile.Owner
						
						let SketchOutputProfile(Feature)
						SourceOpening->GetOutputProfile(SketchOutputProfile)				
						let SketchProfile, NewSketchProfile(Sketch)
						set SketchProfile = SketchOutputProfile.Owner
						iCopySpecification->GenerateSketchOnDestination(SourcePanel, SketchProfile, NewSketchProfile)
						if(NewSketchProfile <> NULL)
						{
							let lvSketchChildrenList, lvOutputProfile(List)
							lvSketchChildrenList = NewSketchProfile.Children
							let nbrChild(Integer)
							nbrChild = lvSketchChildrenList->Size()
							lvOutputProfile = lvSketchChildrenList->Filter("2DOutputProfile", "")
							if(lvOutputProfile->Size() >= 1)
							{
								let NewOutputProfile(Feature)
								set NewOutputProfile = lvOutputProfile->GetItem(1)
								ResultOpening->SetOutputProfile(NewOutputProfile)
							}
						}
						else
						{
							if(SketchProfile <> NULL)
							{
								let NewOutputProfile(Feature)
								iCopySpecification->CreateTransformedObject(SketchOutputProfile, Destination, NewOutputProfile, 0)
								if(NewOutputProfile <> NULL)
								{
									ResultOpening->SetOutputProfile(NewOutputProfile)
								}
							}
						}					
					}				
					else if(SourceOpeningType == 2) // Standard Opening
					{
						let PositionStrategy(String)
						PositionStrategy = SourceOpening.PositionStrategy
						
						if(PositionStrategy == "CATStrPosMidDistOffsetProfile")
						{
							let SourceU1Reference, SourceU2Reference(Feature)
							SourceOpening->GetURefMidDist(SourceU1Reference, SourceU2Reference)
							if(SourceU1Reference <> NULL and SourceU2Reference <> NULL )
							{
								let SourceU1RefOrientation, SourceU2RefOrientation(Integer)
								SourceU1RefOrientation = SourceOpening.UOffsetSideOrientation						
								let bRetrievedU1,  bRetrievedU2(Boolean)
								let NewU1Ref, NewU2Ref(Feature)
								let NewU1RefOrientation, NewU2RefOrientation(Integer)
								bRetrievedU1 = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceU1Reference, SourceU1RefOrientation, NewU1Ref, NewU1RefOrientation)
								if(bRetrievedU1 == FALSE)
								{								
									if(CopyMode == 1)
									{
										set NewU1Ref = new("Plane", SourceU1Reference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceU1Reference
										set NewURefWireFrame = symmetry(SourceURefWireFrame , SymmetryPlane)
										set NewU1Ref = NewURefWireFrame			
									}
									else if(CopyMode == 2)
									{
										set NewU1Ref = new("Plane", SourceU1Reference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceU1Reference
										
										set NewURefWireFrame = translate(SourceURefWireFrame , TranslateDirection, TranslateDistance)
										set NewU1Ref = NewURefWireFrame
									}								
								}							
								bRetrievedU2 = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceU2Reference, SourceU2RefOrientation, NewU2Ref, NewU2RefOrientation)
								if(bRetrievedU2 == FALSE)
								{								
									if(CopyMode == 1)
									{
										set NewU2Ref = new("Plane", SourceU2Reference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceU2Reference
										set NewURefWireFrame = symmetry(SourceURefWireFrame , SymmetryPlane)
										set NewU2Ref = NewURefWireFrame			
									}
									else if(CopyMode == 2)
									{
										set NewU2Ref = new("Plane", SourceU2Reference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceU2Reference
										
										set NewURefWireFrame = translate(SourceURefWireFrame , TranslateDirection, TranslateDistance)
										set NewU2Ref = NewURefWireFrame
									}								
								}							
								if(NewU1Ref <> NULL and  NewU2Ref <> NULL)
								{
									ResultOpening->SetURefMidDist(NewU1Ref, NewU2Ref)
								}
							}
						}
						if(PositionStrategy == "CATStrPosOffsetOffsetProfile")
						{
							let SourceUReference(Feature)
							SourceOpening->GetURef(SourceUReference)
							if(SourceUReference <> NULL)
							{
								let SourceURefOrientation(Integer)
								SourceURefOrientation = SourceOpening.UOffsetSideOrientation						
								let bRetrievedU(Boolean)
								let NewURef(Feature)
								let NewURefOrientation(Integer)
								bRetrievedU = iCopySpecification->ComputeCandidatePlaneFromProjectData(SourceUReference, SourceURefOrientation, NewURef, NewURefOrientation)
								if(bRetrievedU == FALSE)
								{
									if(CopyMode == 1)
									{
										set NewURef = new("Plane", SourceUReference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceUReference
										set NewURefWireFrame = symmetry(SourceURefWireFrame , SymmetryPlane)
										set NewURef = NewURefWireFrame			
									}
									else if(CopyMode == 2)
									{
										set NewURef = new("Plane", SourceUReference.Name + "_" + iCopySpecification.Name, Destination)
										let SourceURefWireFrame, NewURefWireFrame(Wireframe)
										set SourceURefWireFrame = SourceUReference
										
										set NewURefWireFrame = translate(SourceURefWireFrame , TranslateDirection, TranslateDistance)
										set NewURef = NewURefWireFrame
									}								
								}							
								if(bRetrievedU == TRUE)
								{
									ResultOpening->SetURef(NewURef)
									ResultOpening->SetUOffsetSideOrientation(NewURefOrientation)							
								}
							}
						}					
					}
				}
			}		
		}	
	}
	
	
	if(TranslationLine <> NULL)
		TranslationLine->Delete()	
	
}