Hot News:

Unser Angebot:

  Foren auf CAD.de
  VBasic / vb.net / vbs / wsh
  Auswählen von Parts per Code

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
Autor Thema:  Auswählen von Parts per Code (337 mal gelesen)
RolandWeber
Mitglied
Zimmermann


Sehen Sie sich das Profil von RolandWeber an!   Senden Sie eine Private Message an RolandWeber  Schreiben Sie einen Gästebucheintrag für RolandWeber

Beiträge: 40
Registriert: 01.02.2002

Inv. 9 / 11 / 2008
XP Prof, SP2
3DLabs VP760
P IV 3 GZh, 2GB
Raid 0

erstellt am: 01. Feb. 2002 14:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen
Heute habe ich dieses Forum entdeckt. Finde ich spitze ....
Ich hoffe, Ihr könnt mir weiterhelfen und sage schon mal danke.

Mein Problem:
Ich will eine komplexe Zeichnung "animieren", bzw. muss gewisse Bewegungsabläufe simulieren und testen.

Nun möchte ich mit VisualBasic die errechnte Positionen der Element plazieren. Dies sollte mit einer Frequenz von ca. 10 Bildern pro Sekunde gehen, doch .... na ja, im muss optimieren.

Wie kann ich ein Element in einem Zusammenbau direkt per Index ansprechen, ohne jedesmal die ganze Auflistung zu durchlaufen diesem Element dann den richtigen Namen geben?
Ist das Möglich?
Kann ich den Index auslesen, und wie kann das Teil wieder als aktiv setzen?

Meine "Bremse":

**************************************************
Public Sub MoveChain()
    Dim oDoc As Inventor.AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument
   
    Dim oCompDef As Inventor.ComponentDefinition
    Set oCompDef = oDoc.ComponentDefinition
   
    Dim oTransform As Matrix
    Set oTransform = oOccurrence.Transformation
   
   
    Dim oCompOcc As ComponentOccurrence
   
    For i = 1 To 200
       
        For Each oCompOcc In oCompDef.Occurrences
            If oCompOcc.Name = "Kettenglied" & i Then
                Debug.Print oCompOcc.Name
                       
                oTransform.SetTranslation ThisApplication.TransientGeometry.CreateVector(KG(i).x, KG(i).y, KG(i).z)
                oOccurrence.Transformation = oTransform
               
            End If
        Next
   
    Next i
   
End Sub
**************************************************

Vielen Dank
Roland

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AndreasK
Administrator
Daseinsinformatiker


Sehen Sie sich das Profil von AndreasK an!   Senden Sie eine Private Message an AndreasK  Schreiben Sie einen Gästebucheintrag für AndreasK

Beiträge: 1126
Registriert: 02.03.2000

erstellt am: 01. Feb. 2002 16:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für RolandWeber 10 Unities + Antwort hilfreich

Deine Bremse ist das wohl das ständige Suchen nach den Kettengliedern.
Das brauchst Du aber eigentlich nur ein einziges Mal, beim ersten Aufruf von MoveChain, zu machen. Das machr MoveChain jetzt aufgrund der statischen InitMe, die, falls der Compiler richtig arbeitet, nicht TRUE ist.
In der 'IF Not InitMe' werden für max. 200 Kettenglieder, die stehen bestimmt unsortiert in der Liste, die zugehörigen Indizes ermittelt:
KGIdxUsed[n] bestimmt, ob es ein n-tes Kettenglied gibt.
oCompOcc[n] ist das Objekt des n-ten Kettengliedes.
minIdx das kleinste n
MaxIdx das größte n

(n sollte natürlich im Bereich von 1 bis 200 liegen!)


Jetzt nur noch KG[n].x, .y und .z berechnen und MoveChain nach jeder Neuberechnung aufrufen.

Code:

Public Sub MoveChain()
    Static InitMe as Boolean
    Static KGIdxUsed[1 .. 200] as Boolean
    Dim idx as integer
    Static maxIdx as integer
    Static minIdx as integer

    Dim oDoc As Inventor.AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument
   
    Dim oCompDef As Inventor.ComponentDefinition
    Set oCompDef = oDoc.ComponentDefinition
   
    Dim oTransform As Matrix
    Set oTransform = oOccurrence.Transformation
   
   
    Dim oCompOccTemp As ComponentOccurrence
    Static oCompOcc[1 .. 200] As ComponentOccurrence

    Dim n AS Integer

    IF Not InitMe THEN
      maxIdx = 0
      minIdx = 9999
      For n = 1 To 200
        KGIdxUsed[n] = FALSE
      NEXT n

      For Each oCompOccTemp In oCompDef.Occurrences
          If Left$(oCompOccTemp.Name,11) = "Kettenglied" Then
            idx = CInt(Mid$(oCompOccTemp.Name,11))
            Set oCompOcc[idx] = oCompOccTemp
            KGIdxUsed[idx] = TRUE
            IF idx > maxIdx THEN
              maxIdx = idx
            ELSE
              IF idx < minIdx THEN
                minIdx = idx
              ENDIF
            ENDIF
          ENDIF
      NEXT
      InitMe = TRUE
    ENDIF
   
    For n = minIdx To maxIdx       
      IF KGIdxUsed[n] THEN
         Debug.Print oCompOcc[KGIdx[n]].Name
        oTransform.SetTranslation     ThisApplication.TransientGeometry.CreateVector(KG(n).x, KG(n).y, KG(n).z)
        oOccurrence.Transformation = oTransform
      ENDIF
    Next n
   
End Sub


Was ich allerdings nicht begriffen habe ist, wie oOccurrence.Transformation = oTransform sich auf das Listenelement oCompOcc beziehen kann. Hoffentlich nicht, weil vorher mit Debug.Print die 'Name'-Property ausgegeben wurde      
Wie auch immer, es bleibt für jeden weiteren Aufruf von MoveChain nur die Schleife i = minIdx TO maxIdx übrig. Ohne Suche nach den Kettengliedern.
Tipp: In den Modulen immer die Option für explizite Variablen-Deklaration verwenden!!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

RolandWeber
Mitglied
Zimmermann


Sehen Sie sich das Profil von RolandWeber an!   Senden Sie eine Private Message an RolandWeber  Schreiben Sie einen Gästebucheintrag für RolandWeber

Beiträge: 40
Registriert: 01.02.2002

Inv. 9 / 11 / 2008
XP Prof, SP2
3DLabs VP760
P IV 3 GZh, 2GB
Raid 0

erstellt am: 01. Feb. 2002 18:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Andreas
Das ging schnell ..... Vielen Dank

1. Mein Fehler mit oOccurence .....  Ist natürlich nur, weil ich in diesem "zusammengestellten" Beispiel etwas von extern reinkopiert habe.

Deine Lösung habe ich mir auch zusammengebaut. Doch leider ist sie nicht viel schneller.

Es ist so, dass der Rechner rechnet, aber sobald die Anzeigefrequenz > als 6 pro Sekunde ist und die Anzahl zu verschiebenden Teile > 20 wird das Bild nicht mehr neu aufgebaut. Erst am Schluss des Vorganges mit einem grossen Sprung.


Das Problem scheint folgendes zu sein:
Den Takt der Berechnung definiere ich damit einer Warteschleiffe.

************************************************************
Takt = 1 / AnzahlRefreshProSekunde
While Ablauf=True
    NextTakt = NextTakt + Takt
    Do While Timer < NextTakt
      DoEvents    ' Steuerung an andere Prozesse abgeben.
    Loop
MoveChain    'Bewegung nächster Takt
oDoc.Update  'Aufbau des Bildes
Wend
************************************************************
Dabei bleibt die Prozessorleistung voll beim Inventor (Gemäss TaskManager ...).

Anders mit folgendem Befehl:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Call Sleep(AnzahlRefreshProSekunde * 1000)  'Versuche mit Wartezeiten zwischen 200 und 1000 Milisekunden

Dabei ist die Prozesszeit beim Leerlauf, der Inventor wird fast nicht gebraucht, und es gibt trotzdem keinen neuen Bildaufbau.

Wo bleibt die Zeit hängen? Warum wird das Bild nicht regelmässig neu aufgebaut?

Viele Grüsse
Roland

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz