Welkom, Gasten
Gebruikersnaam: Wachtwoord: Onthoud mij
Hier kunt u vragen stellen over iLogic en nuttige codes delen.
  • Pagina:
  • 1

Onderwerp:

CODE: iLogic - Sweep lengte naar parameter 3 jaren 7 maanden geleden #1340

  • Rvdveek
  • Rvdveek's Profielfoto Onderwerp Auteur
  • Offline
  • Gouden gebruiker
  • Gouden gebruiker
  • Berichten: 10
  • Karma: 5
  • Ontvangen bedankjes 5
Deze iLogic regel maakt van iedere Sweep in een part een parameter aan waarin de lengte van de sweep wordt opgeslagen.
Ik maak soms onderdelen waarin een pijp stuk is ontworpen met behulp van een Sweep. Deze sweep is ontstaan uit meerdere 2D en 3D schetsen. Om nu in de stuklijst de lengte van het pijp stuk weer te kunnen geven gebruik ik deze iLogic regel om een parameter aan te maken met de naam van de sweep. Hernoem eventueel de Sweep naam in de Browser om de Paramter herkenbaar te maken.

Rob van der Veek
' Add a Trigger for Part Geometry Change
' standard code found in the Inventor Api Help
' Added to API code: create a parameter for each sweep with the name of the sweep
' Set a reference to the active part document
Dim oDoc As PartDocument
oDoc = ThisApplication.ActiveDocument

Dim oDef As PartComponentDefinition
oDef = oDoc.ComponentDefinition

'iterate trhu the part and create for each sweep a parameter that contains the length
	For Each xSweep In oDef.Features.SweepFeatures

		Dim opath As Path
		opath = xSweep.Path
		Dim TotalLength As Double
		TotalLength = 0

		Dim oCurve As Object
		Dim i As Integer
	
		For i = 1 To opath.Count
			oCurve = opath.Item(i).Curve
			
			Dim oCurveEval As CurveEvaluator
			oCurveEval = oCurve.Evaluator
			
			Dim MinParam As Double
			Dim MaxParam As Double
			Dim length As Double
			
			Call oCurveEval.GetParamExtents(MinParam, MaxParam)
			Call oCurveEval.GetLengthAtParam(MinParam, MaxParam, length)
			
			TotalLength = TotalLength + length
		Next i
	
		Dim oparams As Parameters
		Dim oparam As Parameter
		oparams = oDoc.ComponentDefinition.Parameters
		Dim exists As Boolean
		exists = False
	
		'Find out if parameter exists
		For Each oparam In oparams
		If oparam.Name = xSweep.Name Then exists = True
		Next oparam
	
		'Change the value if the parameter exists otherwise add the parameter
		If exists Then
			oparams.Item(xSweep.Name).Value = TotalLength
		Else
			oparams.UserParameters.AddByValue( xSweep.Name, TotalLength, 11266)
		End If
		oDoc.Update
Next	
MessageBox.Show("For each sweep found in this part, the length is written to a parameter", "Sweeplength")

Rob van der Veek
De volgende gebruiker (s) zei dank u: A.C.Hasselaar

Please Inloggen or Maak een account aan to join the conversation.

Rob van der Veek

CODE: iLogic - Sweep lengte naar parameter 3 jaren 7 maanden geleden #1341

  • bnwgraaf
  • bnwgraaf's Profielfoto
  • Offline
  • Admin
  • Admin
  • Berichten: 165
  • Karma: 14
  • Ontvangen bedankjes 14
bedankt Rob!

Dat is een interessante, waar we best zo nu en dan vragen over krijgen!

Bedankt voor het delen!

Please Inloggen or Maak een account aan to join the conversation.

CODE: iLogic - Sweep lengte naar parameter 2 jaren 4 maanden geleden #1676

  • RJacobs
  • RJacobs's Profielfoto
  • Offline
  • Bronzen gebruiker
  • Bronzen gebruiker
  • Berichten: 3
  • Ontvangen bedankjes 0
Bedankt Rob!

Is er ook nog een mogelijkheid om automatisch de berekende sweep lengte bij elkaar op te laten tellen en dit in een parameter "L" weg te laten schrijven. Dus zonder dat de losse parameters per sweep worden aangemaakt? Ik ben er mee bezig geweest maar krijg het niet voor elkaar met mijn iets wat beperkte ilogic kennis.

Ik hoor het graag.

Please Inloggen or Maak een account aan to join the conversation.

CODE: iLogic - Sweep lengte naar parameter 2 jaren 4 maanden geleden #1677

  • Rvdveek
  • Rvdveek's Profielfoto Onderwerp Auteur
  • Offline
  • Gouden gebruiker
  • Gouden gebruiker
  • Berichten: 10
  • Karma: 5
  • Ontvangen bedankjes 5
Hoi RJacobs,

Ik heb de code wat herschreven zodat er geen aparte parameters meer aangemaakt worden maar alleen "L" waaraan de totale lengte van de sweeps wordt gegeven.
Ik heb nu wat snelle tests gedaan, en alles lijkt goed te werken. Mocht er nog iets niet goed werken dan hoor ik dat graag. Hier de aangepaste code:

' Add a Trigger for Part Geometry Change
' standard code found in the Inventor Api Help
' Added to API code: create a parameter for each sweep with the name of the sweep
' Set a reference to the active part document
Dim oDoc As PartDocument
oDoc = ThisApplication.ActiveDocument
Dim oDef As PartComponentDefinition
oDef = oDoc.ComponentDefinition
'create an array to store all sweep lengths
Dim myArrayList As New ArrayList
'iterate trhu the part and create for each sweep a parameter that contains the length
For Each xSweep In oDef.Features.SweepFeatures
Dim opath As Path
opath = xSweep.Path
Dim TotalLength As Double
TotalLength = 0
Dim oCurve As Object
Dim i As Integer

For i = 1 To opath.Count
oCurve = opath.Item(i).Curve

Dim oCurveEval As CurveEvaluator
oCurveEval = oCurve.Evaluator

Dim MinParam As Double
Dim MaxParam As Double
Dim length As Double

Call oCurveEval.GetParamExtents(MinParam, MaxParam)
Call oCurveEval.GetLengthAtParam(MinParam, MaxParam, length)

TotalLength = TotalLength + length
Next i
'add value of sweep to Array
myArrayList.add(TotalLength)
Next
'Calculate all value's in the array
Dim sum As Double
For Each item As Double In myArrayList
sum += item
Next
'show total of sweep lengths
MessageBox.Show("Total sweep length: " & sum*10, "Total sweep length")
Dim oparams As Parameters
Dim oparam As Parameter
oparams = oDoc.ComponentDefinition.Parameters
Dim exists As Boolean
exists = False
'Find out if parameter exists
For Each oparam In oparams
If oparam.Name = "L" Then exists = True
Next oparam

'Change the value if the parameter exists otherwise add the parameter
If exists Then
oparams.Item("L").Value = sum
Else
oparams.UserParameters.AddByValue("L", sum, 11266)
End If
oDoc.Update

Rob van der Veek
Bijlagen:

Please Inloggen or Maak een account aan to join the conversation.

Rob van der Veek

CODE: iLogic - Sweep lengte naar parameter 2 jaren 4 maanden geleden #1679

  • RJacobs
  • RJacobs's Profielfoto
  • Offline
  • Bronzen gebruiker
  • Bronzen gebruiker
  • Berichten: 3
  • Ontvangen bedankjes 0
Hoi Rob,

Bedankt voor de snelle reactie. Dit is super! Hier was ik zelf niet op gekomen.
Ik heb alleen wel de oDoc.Update vervangen door
InventorVb.DocumentUpdate()Anders liep de "L" waarde telkens 1 stap achter als je via de parameters de lengte aan zou passen.

Ik heb nog twee punten die nog niet goed meegenomen worden bij een aanpassing:
 1. Een Sweep die suppressed is telt hij mee in de totale lengte.
 2. Een Sweep die net verwijderd is, en er is vervolgens geen wijziging aan een dimensie gedaan dan wordt de lengte ook nog niet geupdate.

Ik weet niet of je daar snel een oplossing voor hebt, anders probeer ik heb zelf uit te zoeken. De event triggers zijn al ingesteld dat hij bij de volgende Events de Rule uitvoerd: Any Model Parameter Change, iProperty change, Feature Suppression, Part Geometry.

Alvast bedankt!!
Ruud Jacobs

Please Inloggen or Maak een account aan to join the conversation.

CODE: iLogic - Sweep lengte naar parameter 2 jaren 4 maanden geleden #1688

  • Rvdveek
  • Rvdveek's Profielfoto Onderwerp Auteur
  • Offline
  • Gouden gebruiker
  • Gouden gebruiker
  • Berichten: 10
  • Karma: 5
  • Ontvangen bedankjes 5
Ruud,
Ik heb de code wat aangepast zodat sweeps die ge-suppressed zijn niet mee geteld worden.
Alleen sweeps die onder het end of part item staan telt hij ook mee, hiervoor zie ik zo snel even geen voorbeeld.
Ook zie ik geen trigger die je andere probleem op zou kunnen oplossen. Misschien toch maar een handmatige Run uitvoeren? of een before Save? Zie bijlage voor de aangepaste code.
Rob

Rob van der Veek
Bijlagen:
De volgende gebruiker (s) zei dank u: RJacobs

Please Inloggen or Maak een account aan to join the conversation.

Rob van der Veek

CODE: iLogic - Sweep lengte naar parameter 2 jaren 4 maanden geleden #1689

  • RJacobs
  • RJacobs's Profielfoto
  • Offline
  • Bronzen gebruiker
  • Bronzen gebruiker
  • Berichten: 3
  • Ontvangen bedankjes 0
Rob,

Dat is alweer een goede aanpassing!

De before save geeft een foutmelding als het part in een assembly wordt bewerkt. Ik heb namelijk de oDoc wat anders staan om het mogelijk te maken dat de rule ook werkt in een assembly als het part daarin bewerkt wordt.
oDoc = ThisApplication.ActiveEditDocument

Nadeel daarvan is dat hij dan de on save niet meer pikt. Maar met deze code is de foutmarge op de lengte van sweeps al vele malen betrouwbaarder dan met de hand alles opmeten en in de parameter optellen. Met name bij het door kopiëren van files ging het 80% van de tijd mis (lees werd vergeten dit handmatig te updaten). Nu zal dat nog maar 5% zijn schat ik in. De meeste uitzonderingen zijn zo wel afgevangen.

Super bedankt voor je tijd en inzet!
Groeten Ruud

Please Inloggen or Maak een account aan to join the conversation.

Laatst bewerkt: door RJacobs.
  • Pagina:
  • 1
Moderators: bnwgraafA.C.Hasselaar
Tijd voor maken pagina: 0.443 seconden

Deel deze pagina