/// <summary> /// 通过父获得partComp /// </summary> /// <param name="parent"></param> /// <param name="part"></param> /// <returns></returns> public static NXOpen.Assemblies.Component GetPartComp(Part parent, Part part) { Tag[] elePartOccsTag; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); theUFSession.Assem.AskOccsOfPart(parent.Tag, part.Tag, out elePartOccsTag); return(NXOpen.Utilities.NXObjectManager.Get(elePartOccsTag[0]) as NXOpen.Assemblies.Component); }
/// <summary> /// 获得直线的数据 /// </summary> /// <param name="edge"></param> /// <param name="lineData"></param> /// <returns></returns> public static bool GetLineData(Edge edge, out NXOpen.UF.UFEval.Line lineData, ref string errorMsg) { if (edge.SolidEdgeType != Edge.EdgeType.Linear) { lineData = new NXOpen.UF.UFEval.Line(); errorMsg = "该边不是直线!"; return(false); } NXOpen.UF.UFSession theUfSession = NXOpen.UF.UFSession.GetUFSession(); IntPtr eval; theUfSession.Eval.Initialize(edge.Tag, out eval); try { theUfSession.Eval.AskLine(eval, out lineData); } catch (Exception ex) { lineData = new NXOpen.UF.UFEval.Line(); errorMsg = ex.Message; LogMgr.WriteLog("EdgeUtils:GetLineData:" + ex.Message); return(false); } finally { theUfSession.Eval.Free(eval); } return(true); }
/// <summary> /// 获取obj的objOcc /// </summary> /// <param name="partOcc"></param> /// <param name="obj"></param> /// <returns></returns> public static NXObject GetNXObjectOfOcc(Tag partOcc, Tag obj) { Tag objOccTag = Tag.Null; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); objOccTag = theUFSession.Assem.FindOccurrence(partOcc, obj); return(NXObjectManager.Get(objOccTag) as NXObject); }
/// <summary> /// 矢量差乘 /// </summary> /// <param name="vec1">矢量1</param> /// <param name="vec2">矢量2</param> /// <returns>差乘矢量</returns> public static NXOpen.Vector3d VectorCross(NXOpen.Vector3d vec1, NXOpen.Vector3d vec2) { NXOpen.UF.UFSession ufSession = NXOpen.UF.UFSession.GetUFSession(); double[] x = { vec1.X, vec1.Y, vec1.Z }; double[] y = { vec2.X, vec2.Y, vec2.Z }; double[] z = new double[3]; ufSession.Vec3.Cross(x, y, z); NXOpen.Vector3d zVec = new NXOpen.Vector3d(z[0], z[1], z[2]); return(zVec); }
/// <summary> /// 获取装配档下Occs值 /// </summary> /// <param name="parent"></param> /// <returns></returns> public NXOpen.Assemblies.Component GetPartComp(Part parent) { Tag[] elePartOccsTag; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); try { theUFSession.Assem.AskOccsOfPart(parent.Tag, this.PartTag.Tag, out elePartOccsTag); return(NXOpen.Utilities.NXObjectManager.Get(elePartOccsTag[0]) as NXOpen.Assemblies.Component); } catch { return(null); } }
/// <summary> /// 逆矩阵 /// </summary> /// <returns></returns> public Matrix4 GetInversMatrix() { double[] mat = { matrix[0, 0], matrix[0, 1], matrix[0, 2], matrix[0, 3], matrix[1, 0], matrix[1, 1], matrix[1, 2], matrix[1, 3], matrix[2, 0], matrix[2, 1], matrix[2, 2], matrix[2, 3], matrix[3, 0], matrix[3, 1], matrix[3, 2], matrix[3, 3] }; double[] inversMat = new double[16]; NXOpen.UF.UFSession ufSession = NXOpen.UF.UFSession.GetUFSession(); ufSession.Mtx4.Invert(mat, inversMat); return(new Matrix4(inversMat[0], inversMat[1], inversMat[2], inversMat[3], inversMat[4], inversMat[5], inversMat[6], inversMat[7], inversMat[8], inversMat[9], inversMat[10], inversMat[11], inversMat[12], inversMat[13], inversMat[14], inversMat[15])); }
/// <summary> /// 获取obj的objOcc /// </summary> /// <param name="partOcc"></param> /// <param name="obj"></param> /// <returns></returns> public static NXObject GetOccOfInstance(Tag partOcc) { Tag objOccTag = Tag.Null; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); try { objOccTag = theUFSession.Assem.AskInstOfPartOcc(partOcc); return(NXObjectManager.Get(objOccTag) as NXObject); } catch (NXException ex) { LogMgr.WriteLog("AssmbliesUtils:GetNXObjectOfInstance: " + ex.Message); throw ex; } }
/// <summary> /// 通过父获得partComp /// </summary> /// <param name="parent"></param> /// <param name="part"></param> /// <returns></returns> public static List <NXOpen.Assemblies.Component> GetPartComp(Part parent, Part part) { Tag[] elePartOccsTag; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); try { List <NXOpen.Assemblies.Component> ct = new List <NXOpen.Assemblies.Component>(); theUFSession.Assem.AskOccsOfPart(parent.Tag, part.Tag, out elePartOccsTag); foreach (Tag tg in elePartOccsTag) { ct.Add(NXOpen.Utilities.NXObjectManager.Get(tg) as NXOpen.Assemblies.Component); } return(ct); } catch (NXException ex) { LogMgr.WriteLog("AssmbliesUtils:GetPartComp: " + ex.Message); throw ex; } }
public static double GetArcRadius(Edge edge) { NXOpen.UF.UFSession theUfSession = NXOpen.UF.UFSession.GetUFSession(); IntPtr eval; theUfSession.Eval.Initialize(edge.Tag, out eval); NXOpen.UF.UFEval.Arc arcData; try { theUfSession.Eval.AskArc(eval, out arcData); return(arcData.radius); } catch (Exception ex) { return(0); } finally { theUfSession.Eval.Free(eval); } }
public static ArcEdgeData GetArcData(Edge edge, ref string errorMsg) { if (edge.SolidEdgeType != Edge.EdgeType.Circular) { errorMsg = errorMsg + "该边不是圆弧"; return(null); } NXOpen.UF.UFSession theUfSession = NXOpen.UF.UFSession.GetUFSession(); IntPtr eval; theUfSession.Eval.Initialize(edge.Tag, out eval); NXOpen.UF.UFEval.Arc arc; try { theUfSession.Eval.AskArc(eval, out arc); ArcEdgeData arcData = new ArcEdgeData(edge); arcData.Center = new Point3d(arc.center[0], arc.center[1], arc.center[2]); arcData.Radius = arc.radius; arcData.IsWholeCircle = UMathUtils.IsEqual(Math.PI * 2, Math.Abs(arc.limits[1] - arc.limits[0])); arcData.Angle = Math.Abs(arc.limits[1] - arc.limits[0]); return(arcData); } catch (Exception ex) { errorMsg += ex.Message; LogMgr.WriteLog("EdgeUtils:GetArcData1:" + edge.Tag.ToString() + ex.Message); throw ex; } finally { theUfSession.Eval.Free(eval); } }
/// <summary> /// 最大外形 /// </summary> /// <param name="nxobj"></param> /// <param name="cs">坐标</param> /// <param name="mat">坐标矩阵</param> /// <param name="centerPt">中心点</param> /// <param name="disPt">外形一半</param> public static void GetBoundingBoxInLocal(NXObject[] nxobj, CartesianCoordinateSystem cs, Matrix4 mat, ref Point3d centerPt, ref Point3d disPt) { Session theSession = Session.GetSession(); Part workPart = theSession.Parts.Work; NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession(); Tag temp = Tag.Null; if (cs != null) { temp = cs.Tag; } else { cs = workPart.WCS.CoordinateSystem; } if (nxobj[0] == null) { LogMgr.WriteLog("BoundingBoxUtils.GetBoundingBoxInLocal 传入参数为空!"); return; } double[] minCorner = new double[3]; double[,] directions = new double[3, 3]; double[] distances = new double[3]; double[] box = new double[6]; double[] max = new double[6]; double[] center = new double[3]; double[] centerAbs = new double[3]; theUFSession.Modl.AskBoundingBoxExact(nxobj[0].Tag, temp, minCorner, directions, distances); //查询最大边界盒 mat.ApplyPos(ref minCorner[0], ref minCorner[1], ref minCorner[2]); box[0] = minCorner[0]; box[1] = minCorner[1]; box[2] = minCorner[2]; box[3] = minCorner[0] + distances[0]; box[4] = minCorner[1] + distances[1]; box[5] = minCorner[2] + distances[2]; if (nxobj.Length >= 2) { for (int i = 1; i < nxobj.Length; i++) { theUFSession.Modl.AskBoundingBoxExact(nxobj[i].Tag, temp, minCorner, directions, distances); mat.ApplyPos(ref minCorner[0], ref minCorner[1], ref minCorner[2]); max[0] = minCorner[0]; max[1] = minCorner[1]; max[2] = minCorner[2]; max[3] = minCorner[0] + distances[0]; max[4] = minCorner[1] + distances[1]; max[5] = minCorner[2] + distances[2]; if (max[0] < box[0]) { box[0] = max[0]; } if (max[1] < box[1]) { box[1] = max[1]; } if (max[2] < box[2]) { box[2] = max[2]; } if (max[3] > box[3]) { box[3] = max[3]; } if (max[4] > box[4]) { box[4] = max[4]; } if (max[5] > box[5]) { box[5] = max[5]; } } } centerPt.X = 0.5 * (box[0] + box[3]); centerPt.Y = 0.5 * (box[1] + box[4]); centerPt.Z = 0.5 * (box[2] + box[5]); disPt.X = 0.5 * (box[3] - box[0]); disPt.Y = 0.5 * (box[4] - box[1]); disPt.Z = 0.5 * (box[5] - box[2]); }