Imports System Imports NXOpen Imports NXOpen.UF Module reposition_component Dim sess As Session = Session.GetSession() Dim ufs As UFSession = UFSession.GetUFSession Dim wp As Part = sess.Parts.Work Sub Main() ' Komponente auswählen Dim mess As String = "Select Component to reposition" Dim title As String = "Select a Component" Dim scope As Selection.SelectionScope = Selection.SelectionScope.AnyInAssembly Dim action As Selection.SelectionAction = Selection.SelectionAction.ClearAndEnableSpecific Dim mask(0) As Selection.MaskTriple Dim obj As NXObject = Nothing Dim cursor As Point3d Dim sel_resp As Selection.Response mask(0).Type = UFConstants.UF_component_type mask(0).Subtype = UFConstants.UF_component_subtype sel_resp = UI.GetUI.SelectionManager.SelectObject(mess, title, scope, action, False, False, mask, obj, cursor) If sel_resp < 4 Then Exit Sub ' Position und Orientierung Dim comp As Assemblies.Component = CType(obj, Assemblies.Component) Dim s_parts As PartCollection = sess.Parts Dim c_part As Part = CType(comp.Prototype, Part) Dim mtx_4 As UFMtx4 = ufs.Mtx4 Dim load_stat As PartLoadStatus = Nothing ufs.Disp.SetDisplay(UFConstants.UF_DISP_SUPPRESS_DISPLAY) ' Csys am WCS Dim wp_wcs As CartesianCoordinateSystem = wp.WCS.CoordinateSystem ' Csys am WCS der Komponente s_parts.SetDisplay(c_part, True, True, load_stat) Dim cp_wcs As CartesianCoordinateSystem = c_part.WCS.CoordinateSystem s_parts.SetDisplay(wp, True, True, load_stat) s_parts.SetWorkComponent(Nothing, load_stat) load_stat.Dispose() ufs.Disp.SetDisplay(UFConstants.UF_DISP_UNSUPPRESS_DISPLAY) ' Nullpunkte und Matrizen Dim comp_org As Point3d Dim comp_dir As Matrix3x3 comp.GetPosition(comp_org, comp_dir) Dim cp_org As Point3d = cp_wcs.Origin Dim cp_dir As Matrix3x3 = cp_wcs.Orientation.Element Dim wp_org As Point3d = wp_wcs.Origin Dim wp_dir As Matrix3x3 = wp_wcs.Orientation.Element ' Position und x/y- Richtungen in Doubles wandeln Dim comp_pnt() As Double = {comp_org.X, comp_org.Y, comp_org.Z} Dim comp_xdir() As Double = {comp_dir.Xx, comp_dir.Xy, comp_dir.Xz} Dim comp_ydir() As Double = {comp_dir.Yx, comp_dir.Yy, comp_dir.Yz} Dim wp_pnt() As Double = {wp_org.X, wp_org.Y, wp_org.Z} Dim wp_xdir() As Double = {wp_dir.Xx, wp_dir.Xy, wp_dir.Xz} Dim wp_ydir() As Double = {wp_dir.Yx, wp_dir.Yy, wp_dir.Yz} ' Csys des Komponenten-WCS Dim undomark As Session.UndoMarkId = sess.SetUndoMark(Session.MarkVisibility.Visible, "Reposition component") Dim cp_wcs_cs As CartesianCoordinateSystem = wp.CoordinateSystems.CreateCoordinateSystem(cp_org, cp_dir, True) ' Ins Csys der Komponente transformieren Dim trans_mtx1(15), trans_mtx2(15) As Double Dim abs_null() As Double = {0, 0, 0} Dim abs_xdir() As Double = {1, 0, 0} Dim abs_ydir() As Double = {0, 1, 0} Dim objs() As Tag = {cp_wcs_cs.Tag} Dim copies(-1), tcg As Tag Dim stat As Integer mtx_4.CsysToCsys(abs_null, abs_xdir, abs_ydir, comp_pnt, comp_xdir, comp_ydir, trans_mtx1) ufs.Trns.TransformObjects(trans_mtx1, objs, objs.Length, 1, 0, 2, copies, tcg, stat) ' Transformierter Nullpunkt und Orientierung cp_org = cp_wcs_cs.Origin cp_dir = cp_wcs_cs.Orientation.Element ' Position und x/y- Richtungen in Doubles wandeln Dim cp_pnt() As Double = {cp_org.X, cp_org.Y, cp_org.Z} Dim cp_xdir() As Double = {cp_dir.Xx, cp_dir.Xy, cp_dir.Xz} Dim cp_ydir() As Double = {cp_dir.Yx, cp_dir.Yy, cp_dir.Yz} ' Transformationsmatrix mtx_4.CsysToCsys(cp_pnt, cp_xdir, cp_ydir, wp_pnt, wp_xdir, wp_ydir, trans_mtx2) ' Verschiebung Dim trans_vec As Vector3d With trans_vec .X = trans_mtx2(3) .Y = trans_mtx2(7) .Z = trans_mtx2(11) End With ' Rotation Dim rot_mtx As Matrix3x3 With rot_mtx .Xx = trans_mtx2(0) .Xy = trans_mtx2(4) .Xz = trans_mtx2(8) .Yx = trans_mtx2(1) .Yy = trans_mtx2(5) .Yz = trans_mtx2(9) .Zx = trans_mtx2(2) .Zy = trans_mtx2(6) .Zz = trans_mtx2(10) End With ' Komponente transformieren wp.ComponentAssembly.MoveComponent(comp, trans_vec, rot_mtx) sess.UpdateManager.DoUpdate(undomark) End Sub End Module