void GeomcopyJiaju(bool isPreview, NXOpen.Plane plane) { if (!isPreview) { if (toggleJiaju.Value) { var x = expressionX.Value; var y = expressionY.Value; var z = expressionZ.Value; var trans = Snap.Geom.Transform.CreateTranslation(new Snap.Vector(x, y, z)); selectionJiaju.SelectedObjects.ToList().ForEach(u => { Snap.NX.Body snapU = Snap.NX.Body.Wrap(u.NXOpenTag); if (snapU != null) { var jiaju = snapU.Copy(); var firstPos = new Snap.Position((jiaju.Box.MinX + jiaju.Box.MaxX) / 2, (jiaju.Box.MinY + jiaju.Box.MaxY) / 2, (jiaju.Box.MinZ + jiaju.Box.MaxZ) / 2); var twoPos = firstPos.Copy(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); jiaju.Move(Snap.Geom.Transform.CreateTranslation(twoPos - firstPos)); //if (toggle0.Value) //继承 //{ // var firstPos = new Snap.Position((jiaju.Box.MinX + jiaju.Box.MaxX) / 2, (jiaju.Box.MinY + jiaju.Box.MaxY) / 2, (jiaju.Box.MinZ + jiaju.Box.MaxZ) / 2); // var twoPos = firstPos.Copy(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); // jiaju.Move(Snap.Geom.Transform.CreateTranslation(twoPos - firstPos)); //} //else //{ // jiaju.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); //} jiaju.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); jiaju.Move(trans); snapU.Delete(); } }); } } }
NXOpen.DisplayableObject GeomcopyElec(bool isPreview, NXOpen.Body body, NXOpen.Plane plane) { Snap.NX.Body SnapBody = body; var oldWorkPart = theSession.Parts.Work; var objs = new List <NXOpen.NXObject> { body }; Snap.NX.Body newBody = null; if (body.OwningComponent != null && body.Prototype != null) { //析出 SnapEx.Create.ExtractObject(objs, oldWorkPart.FullPath, false, false); newBody = oldWorkPart.Bodies.ToArray().FirstOrDefault(u => u.Name == body.Name); } else { newBody = SnapBody.Copy(); } if (newBody == null) { return(newBody); } var guid = Guid.NewGuid().ToString(); var tempElecOrigin = SnapEx.Helper.GetElecMidPosition(oldWorkPart, body); if (tempElecOrigin == null) { theUI.NXMessageBox.Show("提示", NXOpen.NXMessageBox.DialogType.Information, "该电极未发现基准点!"); return(null); } var transRef = Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal)); var topFace = SnapEx.Helper.GetTopFace(newBody); var bottomFace = SnapEx.Helper.GetBottomFace(newBody); var minU = topFace.BoxUV.MinU; var minV = topFace.BoxUV.MinV; var maxU = topFace.BoxUV.MaxU; var maxV = topFace.BoxUV.MaxV; var centerPosition = (Snap.Position)tempElecOrigin; var movePosition = centerPosition.Copy(transRef); bool isJC = toggle0.Value && topFace.NXOpenTag != bottomFace.NXOpenTag; if (isJC) //继承 { var markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "reflectionBody"); var normal = topFace.Normal(minU, minV); var point = topFace.Position(minU, minV); var datumPlane = Snap.Create.DatumPlane(point, normal); var splitBody = Snap.Create.SplitBody(newBody, datumPlane); var topBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) == null).Copy(); var reflectionBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) != null).Copy(); splitBody.Delete(); newBody.Delete(); topBody.Move(transRef); reflectionBody.Move(Snap.Geom.Transform.CreateTranslation(movePosition - centerPosition)); var result = Snap.Create.Unite(reflectionBody, topBody); result.Orphan(); datumPlane.Delete(); theSession.UpdateManager.DoUpdate(markId1); theSession.DeleteUndoMark(markId1, null); newBody = reflectionBody; } else { newBody.Move(transRef); } var x = expressionX.Value; var y = expressionY.Value; var z = expressionZ.Value; var trans = Snap.Geom.Transform.CreateTranslation(new Snap.Vector(x, y, z)); newBody.Move(trans); if (!isPreview) { newBody.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); if (topFace != null) { //SetJZJAttr(topFace, newBody); SetGeomcopyAttr(newBody, plane, isJC); } var oldPoint = SnapEx.Helper.GetElecMidPointInPart(Snap.Globals.WorkPart, body); var newPoint = SnapEx.Helper.GetElecMidPoint(Snap.Globals.WorkPart, body); if (newPoint != null) { //newPoint.SetStringAttribute(SnapEx.EactConstString.EACT_ELECT_GROUP, guid); newPoint.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); newPoint.Move(trans); } if (body.OwningComponent != null && body.Prototype != null) { } else { if (oldPoint != null) { oldPoint.Delete(); } SnapBody.Delete(); } } return(newBody); }
NXOpen.DisplayableObject GeomcopyElec(bool isPreview, NXOpen.Body body, NXOpen.Plane plane, int order) { Snap.NX.Body SnapBody = body; var oldWorkPart = theSession.Parts.Work; var objs = new List <NXOpen.NXObject> { body }; Snap.NX.Body newBody = null; if (body.OwningComponent != null && body.Prototype != null) { //析出 SnapEx.Create.ExtractObject(objs, oldWorkPart.FullPath, false, false); newBody = oldWorkPart.Bodies.ToArray().FirstOrDefault(u => u.Name == body.Name); } else { newBody = SnapBody.Copy(); } if (newBody == null) { return(newBody); } var tempElecOrigin = SnapEx.Helper.GetElecMidPosition(oldWorkPart, body); if (tempElecOrigin == null) { theUI.NXMessageBox.Show("提示", NXOpen.NXMessageBox.DialogType.Information, "该电极未发现基准点!"); return(null); } var guid = Guid.NewGuid().ToString(); //TODO 修改名称 修改属性 newBody.Name = GetElecName(order - 1); newBody.SetStringAttribute("EACT_ELEC_NAME", newBody.Name); newBody.SetStringAttribute("EACT_ELECT_GROUP", guid); newBody.Layer = order; Snap.Globals.LayerStates[order] = isPreview ? Snap.Globals.LayerState.Visible : Snap.Globals.LayerState.Selectable; var transRef = Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal)); var topFace = SnapEx.Helper.GetTopFace(newBody); var bottomFace = SnapEx.Helper.GetBottomFace(newBody); var minU = topFace.BoxUV.MinU; var minV = topFace.BoxUV.MinV; var maxU = topFace.BoxUV.MaxU; var maxV = topFace.BoxUV.MaxV; var centerPosition = (Snap.Position)tempElecOrigin; var movePosition = centerPosition.Copy(transRef); bool isJC = toggle0.Value && topFace.NXOpenTag != bottomFace.NXOpenTag; if (isJC) //继承 { var markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "reflectionBody"); var normal = topFace.Normal(minU, minV); var point = topFace.Position(minU, minV); var datumPlane = Snap.Create.DatumPlane(point, normal); var splitBody = Snap.Create.SplitBody(newBody, datumPlane); var topBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) == null).Copy(); var reflectionBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) != null).Copy(); splitBody.Delete(); newBody.Delete(); topBody.Move(transRef); reflectionBody.Move(Snap.Geom.Transform.CreateTranslation(movePosition - centerPosition)); var result = Snap.Create.Unite(reflectionBody, topBody); result.Orphan(); datumPlane.Delete(); theSession.UpdateManager.DoUpdate(markId1); theSession.DeleteUndoMark(markId1, null); newBody = reflectionBody; } else { newBody.Move(transRef); } var x = expressionX.Value; var y = expressionY.Value; var z = expressionZ.Value; var trans = Snap.Geom.Transform.CreateTranslation(new Snap.Vector(x, y, z)); newBody.Move(trans); if (!isPreview) { newBody.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); topFace = SnapEx.Helper.GetTopFace(newBody); if (topFace != null) { SetGeomcopyAttr(newBody, plane, isJC); } var newPoint = SnapEx.Helper.GetElecMidPoint(Snap.Globals.WorkPart, body); if (newPoint != null) { newPoint.SetStringAttribute(SnapEx.EactConstString.EACT_ELECT_GROUP, guid); newPoint.Layer = order; newPoint.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); newPoint.Move(trans); } if (toggleJiaju.Value && selectionJiaju.Show) { var tempJiaju = selectionJiaju.SelectedObjects.FirstOrDefault(); Snap.NX.Body jiaju = tempJiaju == null ? null : Snap.NX.Body.Wrap(tempJiaju.NXOpenTag); if (jiaju != null) { jiaju = jiaju.Copy(); jiaju.Layer = order; jiaju.Move(Snap.Geom.Transform.CreateTranslation(movePosition - centerPosition)); //if (toggle0.Value) //继承 //{ // var firstPos = new Snap.Position((jiaju.Box.MinX + jiaju.Box.MaxX) / 2, (jiaju.Box.MinY + jiaju.Box.MaxY) / 2, (jiaju.Box.MinZ + jiaju.Box.MaxZ) / 2); // var twoPos = firstPos.Copy(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); // jiaju.Move(Snap.Geom.Transform.CreateTranslation(twoPos - firstPos)); //} //else //{ // jiaju.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); //} jiaju.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); jiaju.Move(trans); } } } return(newBody); }
NXOpen.DisplayableObject GeomcopyElec(bool isPreview, NXOpen.Body body, NXOpen.Plane plane, int order) { Snap.NX.Body SnapBody = body; var oldWorkPart = theSession.Parts.Work; var objs = new List <NXOpen.NXObject> { body }; Snap.NX.Body newBody = null; if (body.OwningComponent != null && body.Prototype != null) { //析出 SnapEx.Create.ExtractObject(objs, oldWorkPart.FullPath, false, false); newBody = oldWorkPart.Bodies.ToArray().FirstOrDefault(u => u.Name == body.Name); } else { newBody = Snap.NX.Body.Wrap(oldWorkPart.Bodies.ToArray().FirstOrDefault(u => u.Name == body.Name).Tag).Copy(); } if (newBody == null) { return(newBody); } var guid = Guid.NewGuid().ToString(); //TODO 修改名称 修改属性 newBody.Name = GetElecName(order - 1); newBody.SetStringAttribute("EACT_ELEC_NAME", newBody.Name); newBody.SetStringAttribute("EACT_ELECT_GROUP", guid); newBody.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); newBody.Layer = order; Snap.Globals.LayerStates[order] = isPreview ? Snap.Globals.LayerState.Visible : Snap.Globals.LayerState.Selectable; if (toggle0.Value) //继承 { var markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "reflectionBody"); var topFace = SnapEx.Helper.GetTopFace(newBody); var minU = topFace.BoxUV.MinU; var minV = topFace.BoxUV.MinV; var maxU = topFace.BoxUV.MaxU; var maxV = topFace.BoxUV.MaxV; var centerPosition = topFace.Position((minU + maxU) / 2, (minV + maxV) / 2); var normal = topFace.Normal(minU, minV); var point = topFace.Position(minU, minV); var datumPlane = Snap.Create.DatumPlane(point, normal); var splitBody = Snap.Create.SplitBody(newBody, datumPlane); var topBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) == null); var reflectionBody = splitBody.Bodies.FirstOrDefault(b => SnapEx.Helper.GetTopFace(b) != null); var newDatumPlane = Snap.Create.DatumPlane(centerPosition, new Snap.Orientation(normal).AxisY); reflectionBody.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(centerPosition, newDatumPlane.Normal))); var result = Snap.Create.Unite(reflectionBody, topBody); result.Orphan(); datumPlane.Delete(); newDatumPlane.Delete(); theSession.UpdateManager.DoUpdate(markId1); theSession.DeleteUndoMark(markId1, null); newBody = reflectionBody; } var x = expressionX.Value; var y = expressionY.Value; var z = expressionZ.Value; var trans = Snap.Geom.Transform.CreateTranslation(new Snap.Vector(x, y, z)); newBody.Move(trans); if (!isPreview) { newBody.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); var topFace = SnapEx.Helper.GetTopFace(newBody); if (topFace != null) { SetJZJAttr(topFace, newBody); } var newPoint = SnapEx.Helper.GetElecMidPoint(Snap.Globals.WorkPart, body); if (newPoint != null) { newPoint.SetStringAttribute(SnapEx.EactConstString.EACT_ELECT_GROUP, guid); newPoint.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); newPoint.Move(trans); } if (toggleJiaju.Value && selectionJiaju.Show) { Snap.NX.Body jiaju = selectionJiaju.GetSelectedObjects().FirstOrDefault() as NXOpen.Body; if (jiaju != null) { jiaju = jiaju.Copy(); jiaju.Layer = order; jiaju.Move(Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(plane.Origin, plane.Normal))); jiaju.SetStringAttribute("EACT_MIRROR_ELECT", "Y"); jiaju.Move(trans); } } } return(newBody); }
void Perform(bool isHighlighted = false) { var workPart = theSession.Parts.Work; var body = selection0.SelectedObjects.FirstOrDefault() as Snap.NX.Body; var jiajuBody = selectionJiaju.SelectedObjects.FirstOrDefault() as Snap.NX.Body; tempObjs.ForEach(u => { Snap.NX.NXObject snapU = u; snapU.Delete(); }); tempObjs.Clear(); if (body != null) { Snap.NX.Body snapBody = body; //电极原点 var tempElecOrigin = SnapEx.Helper.GetElecMidPosition(workPart, body); if (tempElecOrigin == null) { theUI.NXMessageBox.Show("提示", NXOpen.NXMessageBox.DialogType.Information, "该电极未发现基准点!"); return; } var elecOrgin = (Snap.Position)tempElecOrigin; if (isHighlighted) { SnapEx.Create.DisplayModification(tempObjs); } bool isPatter = false; if (enum01.SelectedItem == "平移") { isPatter = toggleMovePatter.Value; } else { isPatter = toggleRotationPatter.Value; } int sum = 0; if (isPatter) { sum = (int)(expressionPatterSum.Value < 0?0:expressionPatterSum.Value); } double distance = expressionPatterDistance.Value; var vector = Snap.Vector.Unit(vectorPatter.Direction); if (body.NXOpenBody.OwningComponent != null && snapBody.Prototype != null) { var snapComponent = snapBody.OwningComponent;; NXOpen.Assemblies.Component component = snapComponent; var transForm = GetTransform(elecOrgin); for (int i = 0; i < sum + 1; i++) { Snap.NX.Component newComponent = workPart.ComponentAssembly.CopyComponents(new List <NXOpen.Assemblies.Component> { component }.ToArray()).First(); newComponent.Prototype.Bodies.First().SetDateTimeAttribute(EACT_POSITIONING_DATE, DateTime.Now); tempObjs.Add(newComponent); //平移旋转 var trans = transForm.Matrix; Matrix3x3 matrix = new Matrix3x3(); matrix.Xx = trans[0]; matrix.Xy = trans[4]; matrix.Xz = trans[8]; matrix.Yx = trans[1]; matrix.Yy = trans[5]; matrix.Yz = trans[9]; matrix.Zx = trans[2]; matrix.Zy = trans[6]; matrix.Zz = trans[10]; workPart.ComponentAssembly.MoveComponent(newComponent, new Vector3d(trans[3], trans[7], trans[11]), matrix); if (i != 0) { workPart.ComponentAssembly.MoveComponent(newComponent, (distance * i) * vector, new Snap.Orientation()); } } } else { NXOpen.Point point = null; if (!isHighlighted) { var tempPoint = SnapEx.Helper.GetElecMidPointInPart(Snap.Globals.WorkPart, snapBody); if (tempPoint != null) { point = tempPoint; } } for (int i = 0; i < sum + 1; i++) { var newBody = snapBody.Copy(); var guid = Guid.NewGuid().ToString(); newBody.SetStringAttribute(SnapEx.EactConstString.EACT_ELECT_GROUP, guid); newBody.SetDateTimeAttribute(EACT_POSITIONING_DATE, DateTime.Now); tempObjs.Add(newBody); var transForm = GetTransform(elecOrgin); if (i != 0) { transForm = Snap.Geom.Transform.Composition(transForm, Snap.Geom.Transform.CreateTranslation((distance * i) * vector)); } newBody.Move(transForm); if (point != null) { Snap.NX.Point newPoint = Snap.NX.Point.Wrap(point.Tag).Copy(); newPoint.SetStringAttribute(SnapEx.EactConstString.EACT_ELECT_GROUP, guid); newPoint.Move(transForm); } } } if (toggleJiaju.Value && jiajuBody != null) { for (int i = 0; i < sum + 1; i++) { Snap.NX.Body snapJiajuBody = jiajuBody; var newJiajuBody = snapJiajuBody.Copy(); var guid = Guid.NewGuid().ToString(); newJiajuBody.Layer = body.Layer; newJiajuBody.SetDateTimeAttribute(EACT_POSITIONING_DATE, DateTime.Now); tempObjs.Add(newJiajuBody); elecOrgin = new Snap.Position((snapBody.Box.MaxX + snapBody.Box.MinX) / 2, (snapBody.Box.MaxY + snapBody.Box.MinY) / 2, snapBody.Box.MinZ); var transForm = GetTransform(elecOrgin); if (i != 0) { transForm = Snap.Geom.Transform.Composition(transForm, Snap.Geom.Transform.CreateTranslation((distance * i) * vector)); } newJiajuBody.Move(transForm); } } if (isHighlighted) { SnapEx.Create.DisplayModification(tempObjs); } } }