| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: Export Bodies von Assembly (2259 mal gelesen)
|
sjoedi Mitglied
Beiträge: 9 Registriert: 18.01.2005 NX5/NX6 Win-dose xp professional
|
erstellt am: 09. Jul. 2009 11:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Beim Export von einem Assembly in ein STL-File funktioniert die Positionierung der einzelnen Körper nicht richtig. Wenn ich ein Displayed Part exportiere funktioniert der Export tadellos. Der Körper wird auf den Nullpunkt gesetzt. Sobald ich aber ein Assembly als Workpart habe und durch die einzelnen Komponenten durchgehe und exportiere, werden alle Körper auf den Nullpunkt plaziert. Also dachte ich, dass ich zuerst die Position der Komponente herauslese und anschliessend das WCS auf diesen Punkt setze. Jedoch wird auch dann die Komponente falsch positioniert (siehe Anhang). Der Export des Körpers geht irgendwie vom Nullpunkt der Komponente aus und nicht die des Assemblies. Das ganze habe ich in Java geschrieben, jedoch bin ich diesbezüglich offen. Jeder Hinweis von C/C++ oder auch VB ist willkommen. Besten Dank im Voraus //Beispielcode (JAVA)
Code:
//.... Befindet sich in der Schleife durch die Komponenten Part part = (Part) components[ii].prototype(); BodyCollection body = part.bodies(); BodyCollection.Iterator it1 = body.iterator();lw.writeLine(""); Point3d point3dComponents = components[ii].getPosition().position; lw.writeLine("position: " + point3dComponents.x + " - " + point3dComponents.y + " - " + point3dComponents.z); Matrix3x3 m3x3 = components[ii].getPosition().orientation; lw.writeLine("orientation: " + m3x3.xx + " ; " + m3x3.xy + " ; " + m3x3.xz + " | " + m3x3.yx + " ; " + m3x3.yy + " ; " + m3x3.yz + " | " + m3x3.zx + " ; " + m3x3.zy + " ; " + m3x3.zz); workPart.wcs().setOriginAndMatrix(point3dComponents, m3x3); UFCsys csys = theUFSession.csys(); Tag TagWCS = csys.askWcs();
while (it1.hasNext()) { lw.writeLine("export bodies"); Body bd = (Body) it1.next();
if (bd.isSolidBody()) { PutSolidInStlFileData pub = theUFSession.std().putSolidInStlFile( fileHandle, TagWCS, bd.tag(), 0, 1000, 0.08); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denizO Mitglied Student
Beiträge: 26 Registriert: 08.07.2009
|
erstellt am: 09. Jul. 2009 11:23 <-- editieren / zitieren --> Unities abgeben: Nur für sjoedi
Hi, ich bin nicht ganz sicher was das Problem ist, aber ich könnte mir vorstellen, dass es klappen könnte, wenn der Vektor point3dComponents negiert wird und m3x3 transponiert wird. Viele Grüße Denis Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sjoedi Mitglied
Beiträge: 9 Registriert: 18.01.2005 NX5/NX6 Win-dose xp professional
|
erstellt am: 09. Jul. 2009 13:31 <-- editieren / zitieren --> Unities abgeben:
Besten Dank für deine Antwort. Dies hat mich bereits ein wenig weitergebracht! Jetzt fehlt noch das letzte i-Pünktlein. Einige Komponenten stimmen bereits, jedoch noch nicht alle. Was ich herausgefunden habe ist, dass diejenigen welche nicht passen, einen negativen Wert im Vektor haben. (jetzt würde diese Vektorgeometrie wieder helfen Hast du noch einen weiteren Tipp für mich? Code: double[] csysOrigin = new double[3]; csysOrigin[0] = -components[ii].getPosition().position.x; csysOrigin[1] = -components[ii].getPosition().position.y; csysOrigin[2] = -components[ii].getPosition().position.z;double[] matrixValues = new double[9]; matrixValues[0]=components[ii].getPosition().orientation.xx; matrixValues[1]=components[ii].getPosition().orientation.yx; matrixValues[2]=components[ii].getPosition().orientation.zx; matrixValues[3]=components[ii].getPosition().orientation.xy; matrixValues[4]=components[ii].getPosition().orientation.yy; matrixValues[5]=components[ii].getPosition().orientation.zy; matrixValues[6]=components[ii].getPosition().orientation.xz; matrixValues[7]=components[ii].getPosition().orientation.yz; matrixValues[8]=components[ii].getPosition().orientation.zz; lw.writeLine("vor"); Tag tagMatrixId = csys.createMatrix(matrixValues); lw.writeLine("nach");
Tag tagTempWCS = csys.createCsys(csysOrigin, tagMatrixId); csys.setWcs(tagTempWCS); Tag TagWCS = csys.askWcs();
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denizO Mitglied Student
Beiträge: 26 Registriert: 08.07.2009
|
erstellt am: 09. Jul. 2009 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für sjoedi
Hi, es muss wohl daran liegen, dass etwas mit der Rotationsmatrix nicht stimmt. Um die Drehung umzukehren, musst Du die Drehmatrix transponieren (m[1,2] = m[2,1], m[0,1] = m[1,0]) etc. . Wenn Du zweidimensionale Array eindimensional machst musst Du aufpassen. Hierbei läuft oft etwas schief. Besser umgehen.
Code:
mT.Xx = m.Xx; mT.Xy = m.Yx; mT.Xz = m.Zx; mT.Yx = m.Xy; mT.Yy = m.Yy; mT.Yz = m.Zy; mT.Zx = m.Xz; mT.Zy = m.Yz; mT.Zz = m.Zz;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sjoedi Mitglied
Beiträge: 9 Registriert: 18.01.2005 NX5/NX6 Win-dose xp professional
|
erstellt am: 09. Jul. 2009 14:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Ich habe genau dies mit dem Befehl:
Code: matrixValues[0]=components[ii].getPosition().orientation.xx; ...
gemacht. xx = xx yx = xy zx = xz etc.Hab den Code noch etwas umgeschrieben. Die Schlaufe durch die Komponenten sieht jetzt folgendermassen aus:
Code: Part part = (Part) components[ii].prototype(); BodyCollection body = part.bodies(); BodyCollection.Iterator it1 = body.iterator();lw.writeLine(""); Point3d point3dComponents = components[ii].getPosition().position; lw.writeLine("position: " + point3dComponents.x + " - " + point3dComponents.y + " - " + point3dComponents.z); Matrix3x3 m3x3 = components[ii].getPosition().orientation; lw.writeLine("orientation: " + m3x3.xx + " ; " + m3x3.xy + " ; " + m3x3.xz + " | " + m3x3.yx + " ; " + m3x3.yy + " ; " + m3x3.yz + " | " + m3x3.zx + " ; " + m3x3.zy + " ; " + m3x3.zz); Point3d point3dN = new Point3d(); point3dN.x=-point3dComponents.x; point3dN.y=-point3dComponents.y; point3dN.z=-point3dComponents.z;
Matrix3x3 m3x3T = new Matrix3x3(); m3x3T.xx=m3x3.xx; m3x3T.yx=m3x3.xy; m3x3T.zx=m3x3.xz; m3x3T.xy=m3x3.yx; m3x3T.yy=m3x3.yy; m3x3T.zy=m3x3.yz; m3x3T.xz=m3x3.zx; m3x3T.yz=m3x3.zy; m3x3T.zz=m3x3.zz; UFCsys csys = theUFSession.csys(); workPart.wcs().setOriginAndMatrix(point3dN, m3x3T); Tag TagWCS = csys.askWcs(); while (it1.hasNext()) { lw.writeLine("export bodies"); Body bd = (Body) it1.next(); if (bd.isSolidBody()) { PutSolidInStlFileData pub = theUFSession.std().putSolidInStlFile( fileHandle, TagWCS, bd.tag(), 0, 1000, 0.08); } } //wieder auf original zurücksetzten workPart.wcs().setOriginAndMatrix(OrigWorkPartPoint3d, OrigWorkPartMatrix);
Der Import sieht aber immer noch genau gleich wie vorhin aus. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sjoedi Mitglied
Beiträge: 9 Registriert: 18.01.2005 NX5/NX6 Win-dose xp professional
|
erstellt am: 10. Jul. 2009 09:01 <-- editieren / zitieren --> Unities abgeben:
Ich habs! -Matrix transponieren -Vektor mit Matrix multiplizieren -Vektor negieren Besten Dank für deinen Input Denis ps: es gibt ja da ganz schöne Libraries mit Funktionen...
theUFSession.mtx3().transpose(...) theUFSession.mtx3().vecMultiply(...) theUFSession.vec3().negate(...)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| |
denizO Mitglied Student
Beiträge: 26 Registriert: 08.07.2009
|
erstellt am: 10. Jul. 2009 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für sjoedi
|