public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model, ShaftChamferData data, bool isPreview, out AlignDimensionDelegate <ShaftChamferData> alignDim)
        {
            var dir = data.Edge.AdjacentEntities.OfType <ISwPlanarFace>().First().Definition.Plane.Normal * -1;

            var centerPt = data.Edge.Definition.Center;
            var largeRad = data.Edge.Definition.Diameter / 2;

            if (data.Radius >= largeRad)
            {
                throw new Exception($"Specified radius must not exceed {Math.Round(largeRad * 1000, 2)} mm");
            }

            var x      = largeRad - data.Radius;
            var height = x / Math.Tan(data.Angle);

            var coneBody = (ISwBody)(app.MemoryGeometryBuilder.CreateSolidCone(centerPt, dir, data.Radius * 2, largeRad * 2, height).Bodies.First());

            var cylBody = (ISwBody)(app.MemoryGeometryBuilder.CreateSolidCylinder(centerPt, dir, largeRad * 2, height).Bodies.First());

            var targBody = data.Body;

            if (isPreview)
            {
                targBody = targBody.ToTempBody();
            }

            var result = targBody.Substract(cylBody.Substract(coneBody).First()).First();

            alignDim = new AlignDimensionDelegate <ShaftChamferData>((p, d) =>
            {
                switch (p)
                {
                case nameof(data.Radius):
                    this.AlignRadialDimension(d, centerPt, dir);
                    break;

                case nameof(data.Angle):
                    Vector refVec;
                    var yVec = new Vector(0, 1, 0);
                    if (dir.IsSame(yVec))
                    {
                        refVec = new Vector(1, 0, 0);
                    }
                    else
                    {
                        refVec = yVec.Cross(dir);
                    }

                    var refPt        = centerPt.Move(refVec, largeRad);
                    var anglCenterPt = refPt.Move(dir, height);

                    this.AlignAngularDimension(d, anglCenterPt, refPt, dir.Cross(refVec));
                    break;
                }
            });

            return(new ISwBody[] { result });
        }
Example #2
0
 public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model,
                                                      ISwMacroFeature <MySimpleMacroFeatureParameters> feature, MySimpleMacroFeatureParameters parameters,
                                                      out AlignDimensionDelegate <MySimpleMacroFeatureParameters> alignDim)
 {
     alignDim = null;
     return(new CustomFeatureRebuildResult()
     {
         Result = true
     });
 }
Example #3
0
        public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model,
                                                 BoxData data, bool isPreview, out AlignDimensionDelegate <BoxData> alignDim)
        {
            alignDim = null;

            var box = (ISwBody)app.MemoryGeometryBuilder.CreateSolidBox(
                new Point(0, 0, 0), new Vector(0, 0, 1), new Vector(1, 0, 0).CreateAnyPerpendicular(),
                data.Width, data.Height, data.Length).Bodies.First();

            return(new ISwBody[] { box });
        }
        public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model,
                                                             ISwMacroFeature <DimensionWatcherData> feature, DimensionWatcherData parameters,
                                                             out AlignDimensionDelegate <DimensionWatcherData> alignDim)
        {
            alignDim = null;

            var res = parameters.Dimension != null;

            return(new CustomFeatureRebuildResult()
            {
                Result = parameters.Dimension != null,
                ErrorMessage = !res ? "Dimension not found" : ""
            });
        }
        public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model,
                                                 BoxData data, bool isPreview, out AlignDimensionDelegate <BoxData> alignDim)
        {
            var baseCenter = new Point(0, 0, 0);

            var dir = new Vector(0, 1, 0);

            var box = (ISwBody)(app.MemoryGeometryBuilder.CreateSolidBox(baseCenter,
                                                                         dir, dir.CreateAnyPerpendicular(),
                                                                         data.Width, data.Length, data.Height).Bodies.First());

            alignDim = (n, d) =>
            {
                switch (n)
                {
                case nameof(BoxData.Width):
                    this.AlignLinearDimension(d,
                                              baseCenter
                                              .Move(new Vector(-1, 0, 0), data.Width / 2)
                                              .Move(new Vector(0, 0, -1), data.Length / 2),
                                              new Vector(1, 0, 0));
                    break;

                case nameof(BoxData.Length):
                    this.AlignLinearDimension(d,
                                              baseCenter
                                              .Move(new Vector(1, 0, 0), data.Width / 2)
                                              .Move(new Vector(0, 0, 1), data.Length / 2),
                                              new Vector(0, 0, -1));
                    break;

                case nameof(BoxData.Height):
                    this.AlignLinearDimension(d,
                                              baseCenter
                                              .Move(new Vector(1, 0, 0), data.Width / 2)
                                              .Move(new Vector(0, 0, -1), data.Length / 2),
                                              new Vector(0, 1, 0));
                    break;
                }
            };

            return(new ISwBody[] { box });
        }
Example #6
0
        public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model, CabinetSizeData data, bool isPreview, out AlignDimensionDelegate <CabinetSizeData> alignDim)
        {
            alignDim = new AlignDimensionDelegate <CabinetSizeData>((p, d) =>
            {
                switch (p)
                {
                case nameof(CabinetSizeData.Width):
                    this.AlignLinearDimension(d, new Point(0, 0, 0), new Vector(1, 0, 0));
                    break;

                case nameof(CabinetSizeData.Height):
                    this.AlignLinearDimension(d, new Point(0, 0, 0), new Vector(0, 1, 0));
                    break;

                case nameof(CabinetSizeData.Depth):
                    this.AlignLinearDimension(d, new Point(0, 0, 0), new Vector(0, 0, -1));
                    break;
                }
            });

            return(new ISwBody[0]);
        }
        public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model,
                                                 SweepSketchData data, bool isPreview, out AlignDimensionDelegate <SweepSketchData> alignDim)
        {
            m_App = app;

            var cutListLengthTrackingId = app.Sw.RegisterTrackingDefinition(CUT_LIST_LENGTH_TRACKING_DEF_NAME);

            var result = new List <ISwBody>();

            Point  firstCenterPt = null;
            Vector firstDir      = null;

            int index   = 0;
            var lengths = new List <double>();

            var setLengthPrp = !isPreview && data.AddLengthPropety && (model as ISwPart).Part.IsWeldment();

            foreach (var sketch in data.Sketches)
            {
                foreach (var seg in sketch.Entities.OfType <ISwSketchSegment>().Where(s => !s.Segment.ConstructionGeometry))
                {
                    var path = seg.Definition;

                    var startPt = path.StartPoint.Coordinate;

                    if (firstCenterPt == null)
                    {
                        firstCenterPt = startPt;
                    }

                    var uParam = path.Curves.First().ReverseEvaluate(startPt.X, startPt.Y, startPt.Z);

                    var evalData = path.Curves.First().Evaluate2(uParam, 2) as double[];

                    var normalAtPoint = new Vector(evalData[3], evalData[4], evalData[5]);

                    if (firstDir == null)
                    {
                        firstDir = normalAtPoint;
                    }

                    var profile = app.MemoryGeometryBuilder.CreateCircle(startPt, normalAtPoint, data.Radius * 2);

                    var region = app.MemoryGeometryBuilder.CreatePlanarSheet(profile).Bodies.First();

                    var sweep = app.MemoryGeometryBuilder.CreateSolidSweep(path, region);

                    var body = sweep.Bodies.OfType <ISwBody>().First();

                    if (setLengthPrp)
                    {
                        body.Body.SetTrackingID(cutListLengthTrackingId, index++);

                        lengths.Add(path.Length);
                    }

                    result.Add(body);
                }
            }

            alignDim = (name, dim) =>
            {
                switch (name)
                {
                case nameof(SweepSketchData.Radius):
                    this.AlignRadialDimension(dim, firstCenterPt, firstDir);
                    break;
                }
            };

            if (setLengthPrp)
            {
                model.Tags.Put(CUT_LIST_LENGTH_TRACKING_DEF_NAME, lengths);
                (model as ISwPart).CutListRebuild += OnCutListRebuild;
            }

            return(result.ToArray());
        }
Example #8
0
 public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model, ISwMacroFeature feature, MacroFeatureEditBodiesParams parameters, out AlignDimensionDelegate <MacroFeatureEditBodiesParams> alignDim)
 {
     alignDim = null;
     return(new CustomFeatureRebuildResult());
 }
Example #9
0
        public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model, ISwMacroFeature feature,
                                                             PmpMacroFeatData parameters, out AlignDimensionDelegate <PmpMacroFeatData> alignDim)
        {
            alignDim = (n, d) =>
            {
                switch (n)
                {
                case nameof(PmpMacroFeatData.Number):
                    this.AlignLinearDimension(d, new Point(0, 0, 0), new Vector(0, 1, 0));
                    break;

                case nameof(PmpMacroFeatData.Angle):
                    this.AlignAngularDimension(d, new Point(0, 0, 0), new Point(-0.1, 0, 0), new Vector(0, 1, 0));
                    break;
                }
            };

            var sweepArc = app.MemoryGeometryBuilder.WireBuilder.PreCreateArc();

            sweepArc.Center   = new Point(0, 0, 0);
            sweepArc.Axis     = new Vector(0, 0, 1);
            sweepArc.Diameter = 0.01;
            sweepArc.Commit();

            var sweepLine = app.MemoryGeometryBuilder.WireBuilder.PreCreateLine();

            sweepLine.StartCoordinate = new Point(0, 0, 0);
            sweepLine.EndCoordinate   = new Point(1, 1, 1);
            sweepLine.Commit();

            var sweep = (ISwTempSweep)app.MemoryGeometryBuilder.SolidBuilder.PreCreateSweep();

            sweep.Profiles = new ISwTempRegion[] { app.MemoryGeometryBuilder.CreatePlanarSheet(sweepArc).Bodies.OfType <ISwTempPlanarSheetBody>().First() };
            sweep.Path     = sweepLine;
            sweep.Commit();

            parameters.Number = parameters.Number + 1;
            return(new CustomFeatureBodyRebuildResult()
            {
                Bodies = sweep.Bodies
            });
        }
Example #10
0
 public IXBody[] CreateGeometry(IXCustomFeatureDefinition def, TData data, bool isPreview, out AlignDimensionDelegate <TData> alignDim)
 {
     return(m_GeomCreator.Invoke(def, data, isPreview, out alignDim));
 }
Example #11
0
        public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model,
                                                             ISwMacroFeature <DimensionMacroFeatureParams> feature, DimensionMacroFeatureParams parameters, out AlignDimensionDelegate <DimensionMacroFeatureParams> alignDim)
        {
            var resBodies = GetBodies(); //generating bodies

            alignDim = (name, dim) =>
            {
                switch (name)
                {
                case nameof(DimensionMacroFeatureParams.FirstDimension):
                    this.AlignLinearDimension(dim, new Point(0, 0, 0), new Vector(1, 0, 0));
                    break;

                case nameof(DimensionMacroFeatureParams.SecondDimension):
                    this.AlignRadialDimension(dim, new Point(0, 0, 0), new Vector(0, 0, 1));
                    break;
                }
            };

            return(new CustomFeatureBodyRebuildResult()
            {
                Bodies = resBodies
            });                                                                 //returning custom rebuild result
        }
Example #12
0
        public override CustomFeatureRebuildResult OnRebuild(ISwApplication app, ISwDocument model,
                                                             ISwMacroFeature <MacroFeatureParams> feature, MacroFeatureParams parameters, out AlignDimensionDelegate <MacroFeatureParams> alignDim)
        {
            var txt       = parameters.TextParameter;
            var inputBody = parameters.InputBody;

            alignDim = null;
            return(new CustomFeatureRebuildResult());
        }
Example #13
0
        public override ISwBody[] CreateGeometry(ISwApplication app, ISwDocument model, CoordinateSystemData data, bool isPreview, out AlignDimensionDelegate <CoordinateSystemData> alignDim)
        {
            alignDim = null;

            const double SCALE = 0.1;

            var origin = new Point(data.X, data.Y, data.Z);
            var x      = new Vector(1, 0, 0);
            var y      = new Vector(0, 1, 0);
            var z      = new Vector(0, 0, 1);

            var rotation = TransformMatrix.Identity
                           .Multiply(TransformMatrix.CreateFromRotationAroundAxis(x, data.RotationX, origin))
                           .Multiply(TransformMatrix.CreateFromRotationAroundAxis(y, data.RotationY, origin))
                           .Multiply(TransformMatrix.CreateFromRotationAroundAxis(z, data.RotationZ, origin));

            x = x.Transform(rotation);
            y = y.Transform(rotation);
            z = z.Transform(rotation);

            var xLine = (ISwLineCurve)app.MemoryGeometryBuilder.CreateLine(origin, origin.Move(x, SCALE / 3));
            var yLine = (ISwLineCurve)app.MemoryGeometryBuilder.CreateLine(origin, origin.Move(y, SCALE / 2));
            var zLine = (ISwLineCurve)app.MemoryGeometryBuilder.CreateLine(origin, origin.Move(z, SCALE));

            var xBody = (ISwBody)xLine.CreateBody();
            var yBody = (ISwBody)yLine.CreateBody();
            var zBody = (ISwBody)zLine.CreateBody();

            if (!isPreview)
            {
                m_TrackingId = app.Sw.RegisterTrackingDefinition("_CoordinateSystemEx_Bodies_");

                if (xBody.Body.SetTrackingID(m_TrackingId, X_BODY_TRACKING_ID) != (int)swTrackingIDError_e.swTrackingIDError_NoError)
                {
                    throw new Exception("Failed to track body");
                }

                if (yBody.Body.SetTrackingID(m_TrackingId, Y_BODY_TRACKING_ID) != (int)swTrackingIDError_e.swTrackingIDError_NoError)
                {
                    throw new Exception("Failed to track body");
                }

                if (zBody.Body.SetTrackingID(m_TrackingId, Z_BODY_TRACKING_ID) != (int)swTrackingIDError_e.swTrackingIDError_NoError)
                {
                    throw new Exception("Failed to track body");
                }
            }

            return(new ISwBody[] { xBody, yBody, zBody });
        }