API e Assemblaggio

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#1
Salve a tutti.

Per la tesi sto lavorando su un assemblaggio automatico di una serie di componenti standard in configurazioni differenti.
Ho scritto un programma in C# che permette la selezione di questi componenti e comanda due cad, Solid Works e Solid Edge, per l'assemblaggio dei modelli di tali componenti secondo la configurazione scelta.

Per quanto riguarda Solid Works non ho avuto alcun problema. Ho inserito due piani tra loro ortogonali ed un asse sull'estremità di ciascun pezzo, in modo da accoppiarli tra loro tramite due comandi di complanarità ed uno di coassialità; questa procedura di accoppiamento viene iterata per ciascuna coppia di componenti fino a creare l'assembly finale, in quanto i piani e gli assi hanno sempre lo stesso nome e SW seleziona piani ed assi con una sintassi del tipo "nome_piano@nome_parte@nome_assembly".

Per la precisione i comandi utilizzati sono:

SelectByID2() per la selezione dei piani ed assi con cui eseguire l'accoppiamento;
AddMate3() per l'aggiunta dell'accoppiamento planare ed assiale.

Ora sto cercando di fare la stessa cosa con Solid Edge, però ho delle difficoltà.

Innanzitutto ho trovato i comandi AxialRelation3D() e PlanarRelation3D() per eseguire gli accoppiamenti, ma ho parecchi dubbi su come possa fare. L'SDK della ST4 dice (QUI) che è possibile usare il comando PlanarRelation3D() per rendere parallele due facce di due parti differenti: anziché due facce, sarebbe possibile usare due piani da me creati, nominati in un ben preciso modo, in modo da applicare lo stesso comando iterativamente per i vari componenti?

Per quanto riguarda la coassialità mi sembra di capire che non sia possibile, perchè il comando AxialRelation3D() rende colineari due assi di due parti cilindriche, ma nel mio caso non ho solamente parti cilindriche; d'altronde SE non permette, a differenza di SW, di inserire assi a piacere. Potrei facilmente risolvere il problema usando un terzo piano e una terza complanarità, però volevo accertarmi di questa cosa.

Purtroppo online si trovano pochissime informazioni per quanto riguarda l'uso dell'API di Solid Edge con gli assembly, e l'SDK di SE è estremamente scarno se paragonato a quello di SW, quindi brancolo un po' nel buio.

Ringrazio in anticipo chiunque possa darmi anche solo il più piccolo aiuto!!e sull'estremit
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#2
Salve a tutti.

Per la tesi sto lavorando su un assemblaggio automatico di una serie di componenti standard in configurazioni differenti.
Ho scritto un programma in C# che permette la selezione di questi componenti e comanda due cad, Solid Works e Solid Edge, per l'assemblaggio dei modelli di tali componenti secondo la configurazione scelta.

Per quanto riguarda Solid Works non ho avuto alcun problema. Ho inserito due piani tra loro ortogonali ed un asse sull'estremità di ciascun pezzo, in modo da accoppiarli tra loro tramite due comandi di complanarità ed uno di coassialità; questa procedura di accoppiamento viene iterata per ciascuna coppia di componenti fino a creare l'assembly finale, in quanto i piani e gli assi hanno sempre lo stesso nome e SW seleziona piani ed assi con una sintassi del tipo "nome_piano@nome_parte@nome_assembly".

Per la precisione i comandi utilizzati sono:

SelectByID2() per la selezione dei piani ed assi con cui eseguire l'accoppiamento;
AddMate3() per l'aggiunta dell'accoppiamento planare ed assiale.

Ora sto cercando di fare la stessa cosa con Solid Edge, però ho delle difficoltà.

Innanzitutto ho trovato i comandi AxialRelation3D() e PlanarRelation3D() per eseguire gli accoppiamenti, ma ho parecchi dubbi su come possa fare. L'SDK della ST4 dice (QUI) che è possibile usare il comando PlanarRelation3D() per rendere parallele due facce di due parti differenti: anziché due facce, sarebbe possibile usare due piani da me creati, nominati in un ben preciso modo, in modo da applicare lo stesso comando iterativamente per i vari componenti?

Per quanto riguarda la coassialità mi sembra di capire che non sia possibile, perchè il comando AxialRelation3D() rende colineari due assi di due parti cilindriche, ma nel mio caso non ho solamente parti cilindriche; d'altronde SE non permette, a differenza di SW, di inserire assi a piacere. Potrei facilmente risolvere il problema usando un terzo piano e una terza complanarità, però volevo accertarmi di questa cosa.

Purtroppo online si trovano pochissime informazioni per quanto riguarda l'uso dell'API di Solid Edge con gli assembly, e l'SDK di SE è estremamente scarno se paragonato a quello di SW, quindi brancolo un po' nel buio.

Ringrazio in anticipo chiunque possa darmi anche solo il più piccolo aiuto!!e sull'estremit
Gli assi in solid edge si possono creare, il comando è nascosto e da tirare fuori. Ti consiglio di utilizzare invece i sistemi di coordinate che al tempo stesso contengono sia gli assi che i piani.

Poi puoi inserire la relazione che fa coincidere due sistemi di coordinate, e con una sola relazione posizioni la parte.

Puoi comunque seguire la strada da te intrapresa, invece delle facce dovrai dargli i piani.

Cerca i comandi "AddPlanar" e "AddAxial", la documentazione per la programmazione di Solid Edge è molto ben scritta ho il dubbio che tu stia guardando nel posto sbagliato.

Ciao
 

vespa_83

Utente Standard
Professione: disegnatore
Software: Solid Edge
Regione: Romagna
#3
il consiglio dell'uso del sistema di coordinate mi sembra molto buono. In alternativa, per l'asse, proporrei uno schizzo con una linea.
Per selezionare un elemento, il metodo più semplice (secondo le mie capacità) è utilizzare l'indice, anche se per qualche oggetto funziona anche il nome:
selezione per nome: FamigliaDiOggetti("nomeA")
selezione del primo: FamigliaDiOggetti(0)
selezione dell'ultimo: FamigliaDiOggetti( FamigliaDiOggetti.Count()-1 )

i piani di riferimento penso siano sempre i primi, puoi stabilire se il primo o ultimo schizzo contiene i tuoi assi.
Per la programmazione con Solid Edge ti suggerisco i seguenti link, se già non li conosci:
SESpy: http://solidedgespy.codeplex.com/
di http://www.jasonnewell.net/
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#4
Grazie per le risposte!

Scusate il ritardo con cui rispondo, ho avuto l'ultimo esame prima della laurea e mi ha preso parecchio! Ora posso concentrarmi a pieno sulla tesi :)

L'idea del sistema di coordinate mi sembra ottima! Sto provando ad utilizzarla, ma incontro delle difficoltà.

Ho preso come base QUESTA guida, riscrivendo poi i comandi per C#.

Ora, io ho aperto due file assembly di cui devo far combaciare i sistemi di coordinate, sono "seAssy1" e "seAssy2", e ne ho acquisito il sistema di coordinate con questi comandi:

Codice:
seAssy1COS = seAssy1.CoordinateSystems.Item(2);
seAssy2COS = seAssy2.CoordinateSystems.Item(2);
Item(2) perchè il primo è quello di default, il secondo è quello che ho creato io.

La guida dice poi di usare il comando "GetOrientation()" per ottenere i "dettagli del sistema di coordinate".

Codice:
seAssy1COS.GetOrientation(AXO, AYO, AZO, AXR, AYR, AZR);
Fatto, però già qua trovo un errore. Visual Studio mi fa notare che mancano due parametri al comando, che sarebbero "RelativeToParent" e "ZFirstRotation" ( http://dl2.plm.automation.siemens.c...EdgePart~CoordinateSystem~GetOrientation.html )
Io però non capisco esattamente di che parametri si tratti, nel senso che Visual Studio nell'aiuto alla compilazione mi dice questo

err.jpg

e non so cosa sia "type.missing". Inoltre secondo la pagina del comando Get Orientation sul sito Siemens, ogni parametro dovrebbe essere opzionale, e per questo la guida, penso, non li riporti tutti, però sembra che non siano affatto opzionali in realtà :D

Ho provato a sorvolare ed andare oltre, per concludere qualcosa, per cui ho seguito ancora la guida che a questo punto vuole estrarre i piani che definiscono il sistema di coordinate. Lo fa con il comando "CoordinateSystem.Plane()" che vuole a parametro la costante indicante il piano che si vuole estrarre, che ho trovato QUA

Codice:
AssyXYPlane = seAssy1COS.Plane(seCoordSysXYPlane);
Il problema è che Visual Studio non è ancora contento, e mi dice "Indexed property SolideEdgePart.CoordinateSystem.Plane has non-optional argument that must be provided". Non capisco... il parametro da fornire è solo uno, la costante che indica il piano, e pure nell'auto compilazione VS me ne chiede uno solo... a cosa si riferisce con "parametro non opzionale" che non gli starei dando?

Ogni volta che faccio un passo avanti ne faccio due indietro... è assurdo perchè sono certo che si tratta di una cosa molto semplice, però al momento mi sembra impossibile!!

Vi ringrazio anticipatamente per qualsiasi aiuto sappiate darmi. Grazie anche per il consiglio di Solid Edge Spy, davvero utile!
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#5
Nella guida di solid edge i parametri di GetOrientation li indica tutti come "Variant" per cui non mi preoccuperei troppo ed inserirei due variabili di questo tipo.

Ho appena provato in VB6 e il seguente codice funziona, purtroppo non programmo in C per cui non so aiutarti se non consigliandoti di chiedere sul forum dove hai trovato il codice di cui parli.

Codice:
    Dim objApp As SolidEdgeFramework.Application
    Dim objAsm As SolidEdgeAssembly.AssemblyDocument
    
    Dim Piano As SolidEdgeGeometry.Face
    
    Set objApp = GetObject(, "SolidEdge.Application")
    Set objAsm = objApp.ActiveDocument
    
    Set Piano = objAsm.CoordinateSystems(2).Plane(seCoordSysXYPlane)
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#6
Grazie per la veloce risposta, ora provo! Il fatto che sia in VB non è un problema, tanto C# è molto simile!

Comunque ho scoperto il motivo del primo errore, quello sul GetOrientation(). Vuole dei parametri di tipo "Object" e vanno impostati in uscita, quindi la sintassi corretta è "GetOrientation(out AXO, out AYO, out AZO, out AXR, out AYR, out AZR);" con AXO...AZR dichiarati Object, e non Double come faceva quella guida (che, quindi, mi chiedo come potesse funzionare :D).

Grazie ancora :)
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#7
Dunque, ce l'ho fatta!!! Insomma, quasi :D

Allora dopo un po' di peripezie ho scritto questo codice, che riesce ad allineare perfettamente i sistemi di coordinate di due pezzi, però solo di quelli! Mi spiego meglio.

Io parto inserendo un numero variabile di componenti (minimo 5, massimo 8) in un assembly che creo al momento. Questi componenti sono tutti assembly a parte un solo .par. La funzione di assemblaggio è unica e viene chiamata più volte in un ciclo in modo da unire tutti i componenti necessari. Conosco l'ordine di inserimento dei componenti dell'assembly, che è lo stesso in cui andranno ordinati, per cui alla funzione passo una variabile "c" che indica la posizione nell'ordine, in modo che il codice unisca di volta in volta il componente c-esimo con il c-esimo + 1.

Codice:
//Mi collego all'assembly creato per la visualizzazione dell'assembly
            seAssy = application.ActiveDocument;

            //Creo l'occurrence relativa ai due componenti
            seOcc1 = seAssy.Occurrences.Item(c);
            seOcc2 = seAssy.Occurrences.Item(c+1);

            //Prendo il sistema di coordinate da me creato per ogni componente. Solo per il primo assemblaggio sarà il numero (2)
            if (c == 1)
            {
                seOcc1COS = seOcc1.OccurrenceDocument.CoordinateSystems.Item(2);
            }
            else
            {
                seOcc1COS = seOcc1.OccurrenceDocument.CoordinateSystems.Item(3);
            }
            
            seOcc2COS = seOcc2.OccurrenceDocument.CoordinateSystems.Item(2);


            //Acquisisco i dettagli del sistema di coordinate da me creato
            seOcc1COS.GetOrientation(out A1XO, out A1YO, out A1ZO, out A1XR, out A1YR, out A1ZR);
            seOcc2COS.GetOrientation(out A2XO, out A2YO, out A2ZO, out A2XR, out A2YR, out A2ZR);


            //Acquisisco i piani che costituiscono il sistema di coordinate da me creato
            Occ1XYPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysXYPlane];
            Occ1YZPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysYZPlane];
            Occ1ZXPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysZXPlane];
            
            Occ2XYPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysXYPlane];
            Occ2YZPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysYZPlane];
            Occ2ZXPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysZXPlane];


            //Cancello la relazione Ground dei due componenti
            seOcc1.Relations3d.item(1).Delete();
            seOcc2.Relations3d.item(1).Delete();

            //Acuisisco le relazioni del pezzo
            seRels3D = seAssy.Relations3d;


            //Creo un reference fra il pezzo e il piano ed aggiunge la relazione planare
            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1XYPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2XYPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);

            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1YZPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2YZPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);

            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1ZXPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2ZXPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);

NOTA: quando acquisisco il sistema di coordinate ho messo un if {} perchè tutti i componenti si assemblano verticalmente uno sopra l'altro, per cui di volta in volta prendo il sistema di coordinate di quello sotto e lo unisco a quello del pezzo che sta sopra. Il primo componente, però, ha un solo sistema di coordinate da me creato, perchè essendo sempre il primo non avrà mai la necessità di essere collegato con 2 componenti, ma solo con uno che gli starà sopra. Ecco il perchè dell'if{}.


Ora il codice funziona perchè i primi due componenti vengono assemblati perfettamente, il problema si presenta al secondo ciclo. Fa ancora la parte iniziale senza problemi, ma dà errore quando raggiunge il momento di creare la reference per poi fare l'accoppiamento. In particolare va in errore su:

Codice:
seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1XYPlane);
Ho pensato che magari fosse perchè "seRefOcc1" non fosse inizializzato a "null", ma anche in quel modo dà errore. Ho pensato che magari dovesse poter mantenere i vecchi riferimenti, per cui ho provato facendogli fare il secondo assemblaggio con una variabile diversa, del tipo "seRefOcc3", ma dà errore anche in quel modo.

Chiaramente al secondo assemblaggio "seOcc1" è un componente diverso da prima, in particolare è il secondo che ho assemblato in precedenza (quello che prima era "seOcc2"), e Occ1XYPlane è il piano XY preso dal suo sistema di coordinate.


Non capisco quale sia il problema, ed è sicuramente a livello di Solid Edge. Evidentemente mi sfugge qualcosa sul modo in cui funzionano gli Occurrence, i Reference e il comando CreateReference(), però non capisco cosa possa essere.

Qualcuno ha un'idea su cosa possa essere il problema? Risolto questo avrei praticamente finito!!

Vi ringrazio ancora per l'attenzione, siete gentilissimi :D
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#8
Che tipo di errore ti viene fuori ?

Da una letta veloce del tuo codice il primo componente non è vincolato a nulla e quindi in grado di muoversi.
Sarebbe bene lasciargli la relazione di terra. Questo è vero in tutte le situazioni, il componente principale va vincolato a terra.

Ciao
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#9
Grazie per la risposta.

Allora mi sono accorto di un errore, nel senso che siccome tutto quel codice viene chiamato più volte di fatto è come se fosse in un ciclo, quindi ad ogni volta cercavo di eliminare le relazioni ground dei due pezzi che stava assemblando in quel momento, ma chiaramente uno dei due era già stato assemblato prima e quindi la relazione ground era già stato tolta in precedenza.

Ho modificato il codice in modo da togliere i vincoli a tutti i pezzi tranne il primo solo la prima volta che viene chiamata la funzione.
Ho anche inizializzato a "null" tutte le variabili in modo da eliminare possibili residue informazioni.

Ora, dopo aver inizializzato a null, il programma assembla ancora il primo ed il secondo pezzo, poi quando la funzione si ripete per l'assemblaggio del secondo con il terzo si blocca sul secondo "CreateReference", quello con il piano YZ. L'errore è questo

err.jpg

E' talmente generico che non riesco a capire dove sbagli, per questo dicevo che sicuramente mi sfugge qualcosa nel metodo di funzionamento del CreateReference(), il problema è che non capisco cosa... oltretutto il primo createReference() con il piano XY lo fa.

Ora magari provo a fargli saltare quel componente e passare al successivo, magari è un problema del modello.

Grazie e ciao!
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#10
EDIT: Ho provato ad assemblare a mano i due pezzi usando i piani dei due sistemi di coordinate e non ho alcun problema a farlo, quindi i pezzi non credo abbiano dei problemi. Sempre più incomprensibile :D


Questo è il codice attuale, rispetto a prima ho solo modificato l'eliminazione del vincolo di terra sui componenti.


Codice:
//Mi collego all'assembly creato per la visualizzazione della protesi
            seAssy = application.ActiveDocument;

            //Creo l'occurrence relativa ai due componenti. c inizialmente vale 1 e viene incrementata ad ogni chiamata di questa funzione
            seOcc1 = seAssy.Occurrences.Item(c);
            seOcc2 = seAssy.Occurrences.Item(c+1);

            //Prendo il sistema di coordinate da me creato per ogni componente. Solo per il primo assemblaggio sarà il numero (2)
            if (c == 1)
            {
                //Cancello la relazione Ground di tutti i componenti tranne il primo, che deve restare fisso
                int countOcc = seAssy.Occurrences.Count;
                int a = 2;
                
                while (a <= countOcc)
                {
                    seAssy.Occurrences.Item(a).Relations3d.item(1).Delete();
                    a++;
                }
                seOcc1COS = seOcc1.OccurrenceDocument.CoordinateSystems.Item(2);
            }
            else
            {
                seOcc1COS = seOcc1.OccurrenceDocument.CoordinateSystems.Item(3);
            }
            
            seOcc2COS = seOcc2.OccurrenceDocument.CoordinateSystems.Item(2);

            //Acquisisco i dettagli del sistema di coordinate da me creato
            seOcc1COS.GetOrientation(out A1XO, out A1YO, out A1ZO, out A1XR, out A1YR, out A1ZR);
            seOcc2COS.GetOrientation(out A2XO, out A2YO, out A2ZO, out A2XR, out A2YR, out A2ZR);

            //Acquisisco i piani che costituiscono il sistema di coordinate da me creato
            Occ1XYPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysXYPlane];
            Occ1YZPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysYZPlane];
            Occ1ZXPlane = seOcc1COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysZXPlane];
            
            Occ2XYPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysXYPlane];
            Occ2YZPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysYZPlane];
            Occ2ZXPlane = seOcc2COS.Plane[SolidEdgePart.CoordinateSystemFeatureConstants.seCoordSysZXPlane];


            //Acuisisco le relazioni del pezzo
            seRels3D = seAssy.Relations3d;

            //Creo un reference fra il pezzo e il piano ed aggiunge la relazione planare
            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1XYPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2XYPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);

            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1YZPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2YZPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);

            seRefOcc1 = seAssy.CreateReference(seOcc1, Occ1ZXPlane);
            seRefOcc2 = seAssy.CreateReference(seOcc2, Occ2ZXPlane);
            seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint);
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#11
Ho provato anche cambiando i pezzi, si inchioda sempre sulla creazione del reference fra il pezzo ed il suo piano YZ, indipendentemente dal sistema di coordinate o dal pezzo che prendo.

Quando lo fa per il primo dei pezzi funziona, con qualsiasi altro crasha, eppure con il piano XY non dà problemi ed i sistemi di coordinate sono stati costruiti allo stesso modo. Non capisco...
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#12
In VB6 questo è come lo farei io, e funziona.

Ciao

Codice:
Private Sub Assembla()
    
    Dim objApp As SolidEdgeFramework.Application
    Dim objAsm As SolidEdgeAssembly.AssemblyDocument
    
    Dim objOcc1 As SolidEdgeAssembly.Occurrence
    Dim objOcc2 As SolidEdgeAssembly.Occurrence
    
    Dim objOcc1CS As SolidEdgePart.CoordinateSystem
    Dim objOcc2CS As SolidEdgePart.CoordinateSystem
    
    Dim ObjOcc1XYPlane As SolidEdgeGeometry.Face
    Dim ObjOcc1YZPlane As SolidEdgeGeometry.Face
    Dim ObjOcc1ZXPlane As SolidEdgeGeometry.Face
    Dim ObjOcc2XYPlane As SolidEdgeGeometry.Face
    Dim ObjOcc2YZPlane As SolidEdgeGeometry.Face
    Dim ObjOcc2ZXPlane As SolidEdgeGeometry.Face
    
    Dim XYZPoints1(1 To 6) As Double
    Dim XYZPoints2(1 To 6) As Double
    
    Dim objOcc1Ref As SolidEdgeFramework.Reference
    Dim objOcc2Ref As SolidEdgeFramework.Reference
    
    Set objApp = GetObject(, "SolidEdge.Application")
    Set objAsm = objApp.ActiveDocument
    
    For Each Occurrence In objAsm.Occurrences
        
        If Occurrence.Index <> objAsm.Occurrences.Count Then
        
            Set objOcc1 = Occurrence
            Set objOcc2 = objAsm.Occurrences.Item(objOcc1.Index + 1)
            
            For i = objOcc2.Relations3d.Count To 1 Step -1
                objOcc2.Relations3d(i).Delete
            Next i
            
            Set objOcc1CS = objOcc1.OccurrenceDocument.CoordinateSystems(2)
            Set objOcc2CS = objOcc2.OccurrenceDocument.CoordinateSystems(3)
            
            Call objOcc1CS.GetOrientation(XYZPoints1(1), XYZPoints1(2), XYZPoints1(3), XYZPoints1(4), XYZPoints1(5), XYZPoints1(6))
            Call objOcc2CS.GetOrientation(XYZPoints2(1), XYZPoints2(2), XYZPoints2(3), XYZPoints2(4), XYZPoints2(5), XYZPoints2(6))
            
            Set ObjOcc1XYPlane = objOcc1CS.Plane(seCoordSysXYPlane)
            Set ObjOcc1YZPlane = objOcc1CS.Plane(seCoordSysYZPlane)
            Set ObjOcc1ZXPlane = objOcc1CS.Plane(seCoordSysZXPlane)
            
            Set ObjOcc2XYPlane = objOcc2CS.Plane(seCoordSysXYPlane)
            Set ObjOcc2YZPlane = objOcc2CS.Plane(seCoordSysYZPlane)
            Set ObjOcc2ZXPlane = objOcc2CS.Plane(seCoordSysZXPlane)
            
            Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1XYPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2XYPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
            
            Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1YZPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2YZPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
            
            Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1ZXPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2ZXPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
            
        End If
        
    Next Occurrence
    
End Sub
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#13
Ciao!

Il tuo codice è praticamente come il mio, infatti anche il mio funziona con il primo assemblaggio.

Sul secondo assemblaggio esegue l'AddPlanar sulla prima coppia di piani (QUALSIASI ESSA SIA: XY, YZ, ZX), poi quando creo di nuovo i reference per chiamare per la seconda volta l'AddPlanar crasha SEMPRE sulla creazione del reference. E crasha indipendentemente da quale piano usi!!

Cioè se faccio prima l'XY e poi l'YZ:

Codice:
  Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1XYPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2XYPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
            
            Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1YZPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2YZPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
Fa l'XY ma crasha sull'YZ, cioè su "Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1YZPlane)"

Mentre se scambio l'ordine facendo prima l'YZ e poi l'XY:

Codice:
  Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1YZPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2YZPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
            
            Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1XYPlane)
            Set objOcc2Ref = objAsm.CreateReference(objOcc2, ObjOcc2XYPlane)
            
            Call objAsm.Relations3d.AddPlanar(objOcc1Ref, objOcc2Ref, False, XYZPoints1, XYZPoints2)
Fa l'YZ ma crasha sull'XY, "Set objOcc1Ref = objAsm.CreateReference(objOcc1, ObjOcc1XYPlane)"

Praticamente crasha sempre sul secondo reference, mentre il primo riesce sempre a crearlo, indipendentemente da quali piani io usi! Ho provato pure con ZX, stesso discorso.

Non capisco che senso abbia... come mai sempre sul secondo?
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#14
Nel tuo codice scrivi:

Codice:
seRels3D.AddPlanar(seRefOcc1, seRefOcc2, false, ConstrainingPoint, ConstrainingPoint)
In pratica utilizzi lo stesso punto (ConstrainingPoint) per l'orientamento e non credo che possa funzionare.
Il due punti devono essere relativi alla due facce che gli dai come parametro.

Nel mio codice infatti utilizzo XYZPoints1 e XYZPoints2

Verifica
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#15
Ok ora lo sistemo, ma lui non crasha su AddPlanar ma su CreateReference, per cui non credo sia questo il motivo.
 

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#16
Ok ora lo sistemo, ma lui non crasha su AddPlanar ma su CreateReference, per cui non credo sia questo il motivo.
Dando dei riferimenti sbagliati credo vengano create relazioni apparentemente valide che creano problemi poi a quelle successive.
Hai verificato sul CAD le relazioni create in che stato sono ?

Ciao
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#17
Grazie, hoo fatto come mi hai detto ma purtroppo trovo sempre lo stesso errore.

Le relazioni dove le vedo? Da Spy non riesco a trovare la voce "reference".

Scusa se ne approfitto, ma posso provare a passarti i 3 componenti che sto assemblando? Magari tu vedi l'errore dove io sto sbattendo la testa da 3 giorni...

Il problema è quando crea il secondo reference fra il terzo sistema di coordinate del pezzo 2 (SC_Join_Upper) e il pezzo 2.

Grazie mille, sei gentilissimo.
 

Allegati

Be_on_edge

Moderatore
Staff Forum
Professione: Progettazione
Software: Solid Edge
Regione: Emilia Romagna
#18
Grazie, hoo fatto come mi hai detto ma purtroppo trovo sempre lo stesso errore.

Le relazioni dove le vedo? Da Spy non riesco a trovare la voce "reference".

Scusa se ne approfitto, ma posso provare a passarti i 3 componenti che sto assemblando? Magari tu vedi l'errore dove io sto sbattendo la testa da 3 giorni...

Il problema è quando crea il secondo reference fra il terzo sistema di coordinate del pezzo 2 (SC_Join_Upper) e il pezzo 2.

Grazie mille, sei gentilissimo.
Intendo guardare le relazioni tra i pezzi dentro al CAD non in programmazione.
Comunque le relazioni le trovi dentro occurencedocument.relations3d

Domani ci guardo adesso non ho VB

Ciao

P.S.: Che versione di Solid Edge utilizzi e con quale MP ? Magari è un baco che è stato poi risolto e ti basta un aggiornamento.
 

Sbabba

Utente Junior
Professione: Studente ing meccanica
Software: Solid Edge, Rhinoceros
Regione: Lombardia
#19
La versione è la ST5, l'MP non lo so perchè la mia è la versione accademica, però so che è la 105.00.00.102

Ci ho pensato pure io, sto scaricando la ST6 e dopo la provo!