Jump to content

Welcome to eMastercam

Register now to participate in the forums, access the download area, buy Mastercam training materials, post processors and more. This message will be removed once you have signed in.

Use your display name or email address to sign in:

Rate my code!


Recommended Posts

I've added everything I've learned this week into one file.

Unfortunately, there's a bug where it moves whatever geometry is on the screen when it starts.

Nonetheless, I'd appreciate feedback. This is the only C# I've ever done 😅

 

public Mastercam.App.Types.MCamReturn CustomNethookRun(Mastercam.App.Types.MCamReturn notused)
        {
            var upperCreaseID = new List<int>();
            var lowerCreaseID = new List<int>();
            var creaseX1 = 0.0;
            var creaseX2 = 0.0;
            var creaseY1 = 0.0;
            var creaseY2 = 0.0;
            var creaseX3 = 0.0;
            var creaseX4 = 0.0;
            var creaseY3 = 0.0;
            var creaseY4 = 0.0;

            void offsetCutchain(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 75 to main level and visible
                LevelsManager.SetMainLevel(75);
                LevelsManager.SetLevelVisible(75, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                //Selects all geometry on level 75
                var selectedCutChain = ChainManager.ChainAll(75);
                //Creates and names level 500 and level 501
                int createdUpperLevel = 500;
                int createdLowerLevel = 501;
                LevelsManager.SetLevelName(500, "Upper Created Cut Geo");
                LevelsManager.SetLevelName(501, "Lower Created Cut Geo");

                //edits each entity of all chains
                foreach (var chain in selectedCutChain){
                    //offsets line of lower
                    var lowerChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0225, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var cutResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometry){
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerLevel, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    //offsets line of upper
                    var upperChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0385, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var cutResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometryNew){
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperLevel, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                }
            }


            bool CreateLine1(){
                bool result = false;
                Point3D crease1 = new Point3D(creaseX1, creaseY1, 0.0);
                Point3D crease3 = new Point3D(creaseX3, creaseY3, 0.0);
                LineGeometry Line1 = new LineGeometry(crease1, crease3);
                Line1.Selected = true;
                result = Line1.Commit();
                return result;
            }

            bool CreateLine2(){
                bool result = false;
                Point3D crease2 = new Point3D(creaseX2, creaseY2, 0.0);
                Point3D crease4 = new Point3D(creaseX4, creaseY4, 0.0);
                LineGeometry Line2 = new LineGeometry(crease2, crease4);
                Line2.Selected = true;
                result = Line2.Commit();
                return result;
            }

            void offsetCreasechain(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 101 to main level and visible
                LevelsManager.SetMainLevel(101);
                LevelsManager.SetLevelVisible(101, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                //Selects all geometry on level 101
                var selectedCreaseChain = ChainManager.ChainAll(101);
                //Creates and names level 502 and level 503
                int createdUpperCrease = 502;
                int createdLowerCrease = 503;
                LevelsManager.SetLevelName(502, "Upper Created Crease Geo");
                LevelsManager.SetLevelName(503, "Lower Created Crease Geo");

                //edits each entity of all chains
                foreach (var chain in selectedCreaseChain){
                    //offsets line of lower
                    var lowerChainCrease1 = chain.OffsetChain2D(OffsetSideType.Left, .040, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease2 = chain.OffsetChain2D(OffsetSideType.Left, .065, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease3 = chain.OffsetChain2D(OffsetSideType.Right, .040, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease4 = chain.OffsetChain2D(OffsetSideType.Right, .065, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var creaseResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in creaseResultGeometry){
                        lowerCreaseID.Add(entity.GetEntityID());
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerCrease, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    //offsets line of upper
                    var upperChainCrease1 = chain.OffsetChain2D(OffsetSideType.Left, .014, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainCrease2 = chain.OffsetChain2D(OffsetSideType.Right, .014, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var creaseResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in creaseResultGeometryNew){
                        upperCreaseID.Add(entity.GetEntityID());
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperCrease, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                    }
            }

            void connectUpperLines(){
                var set = 0;
                foreach (var i in upperCreaseID){
                    if (set == 0){
                        var creaseGeo = Geometry.RetrieveEntity(i);
                        var line = (LineGeometry)creaseGeo;
                        creaseX1 = line.EndPoint1.x;
                        creaseX2 = line.EndPoint2.x;
                        creaseY1 = line.EndPoint1.y;
                        creaseY2 = line.EndPoint2.y;
                        set = 1;
                    }
                    else{
                        var creaseGeo2 = Geometry.RetrieveEntity(i);
                        var line2 = (LineGeometry)creaseGeo2;
                        creaseX3 = line2.EndPoint1.x;
                        creaseX4 = line2.EndPoint2.x;
                        creaseY3 = line2.EndPoint1.y;
                        creaseY4 = line2.EndPoint2.y;
                        CreateLine1();
                        CreateLine2();

                        var creaseResultGeometryNew = SearchManager.GetSelectedGeometry();
                        foreach (var entity in creaseResultGeometryNew){
                            entity.Color = 10;
                            entity.Selected = true;
                            entity.Commit();
                        }
                        //Moves result geometry
                        int createdUpperCrease = 502;
                        GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperCrease, true);
                        //Clears geometry in result
                        GraphicsManager.ClearColors(new GroupSelectionMask(true));
                        //Deselects all
                        SelectionManager.UnselectAllGeometry();

                        set = 0;
                    }
                }
            }

            void connectLowerLines()
            {
                var set = 0;
                foreach (var i in lowerCreaseID){
                    if (set == 0){
                        var creaseGeo = Geometry.RetrieveEntity(i);
                        var line = (LineGeometry)creaseGeo;
                        creaseX1 = line.EndPoint1.x;
                        creaseX2 = line.EndPoint2.x;
                        creaseY1 = line.EndPoint1.y;
                        creaseY2 = line.EndPoint2.y;
                        set = 1;
                    }
                    else{
                        var creaseGeo2 = Geometry.RetrieveEntity(i);
                        var line2 = (LineGeometry)creaseGeo2;
                        creaseX3 = line2.EndPoint1.x;
                        creaseX4 = line2.EndPoint2.x;
                        creaseY3 = line2.EndPoint1.y;
                        creaseY4 = line2.EndPoint2.y;
                        CreateLine1();
                        CreateLine2();

                        var creaseResultGeometryNew = SearchManager.GetSelectedGeometry();
                        foreach (var entity in creaseResultGeometryNew){
                            entity.Color = 11;
                            entity.Selected = true;
                            entity.Commit();
                        }
                        //Moves result geometry
                        int createdLowerCrease = 503;
                        GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerCrease, true);
                        //Clears geometry in result
                        GraphicsManager.ClearColors(new GroupSelectionMask(true));
                        //Deselects all
                        SelectionManager.UnselectAllGeometry();

                        set = 0;
                    }
                }
            }


            void DemoAlterLine(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 101 to main level and visible
                LevelsManager.SetMainLevel(101);
                LevelsManager.SetLevelVisible(101, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                var geomask = new GeometryMask{Lines = true};
                var geoSel = new SelectionMask{};
                var geo = SearchManager.GetGeometry(geomask,geoSel, 101);
                if (geo != null) {
                    //Selects each line. Determines orientation and alters by 1 inch from both ends
                    foreach (var singleGeo in geo) {
                        var line = (LineGeometry)singleGeo;
                        //If line is vertical
                        if (line.Data.Point1.x == line.Data.Point2.x){
                            if (line.Data.Point1.y >= line.Data.Point2.y){
                                line.Data.Point1.y += -1;
                                line.Data.Point2.y += +1;
                                line.Selected = false;
                            };
                            if (line.Data.Point1.y <= line.Data.Point2.y){
                                line.Data.Point1.y += +1;
                                line.Data.Point2.y += -1;
                                line.Selected = false;
                            };
                        };
                        //If line is horizontal
                        if (line.Data.Point1.y == line.Data.Point2.y){
                            if (line.Data.Point1.x >= line.Data.Point2.x){
                                line.Data.Point1.x += -1;
                                line.Data.Point2.x += +1;
                                line.Selected = false;
                            };
                            if (line.Data.Point1.x <= line.Data.Point2.x){
                                line.Data.Point1.x += +1;
                                line.Data.Point2.x += -1;
                                line.Selected = false;
                            };
                        };
                        //Stores result in Mastercam
                        line.Commit();
                    }
                    //Updates screen shown
                    GraphicsManager.Repaint(true);
                }
            }

            DemoAlterLine();
            offsetCreasechain();
            connectUpperLines();
            connectLowerLines();
            offsetCutchain();

            return MCamReturn.NoErrors;

            

        }

 

Link to comment
Share on other sites

I suggest always first try using the non-full rebuild overload of Repaint() to see if that is enough.
GraphicsManager.Repaint();

The "true" parameter forces a complete rebuild of the graphics.
GraphicsManager.Repaint(true);
If that's what you really need, then you can accept the time hit of doing this.

But if just the simple GraphicsManager.Repaint() is "good enough" that's going to be faster.
Also be careful of putting a full rebuild call Repaint(true) within a loop.
Doing so is rarely correct and can really slow down your add-in's execution.
----------------

This is not a correct method signature for an "entry" method (incorrect parameter type) ->
public Mastercam.App.Types.MCamReturn CustomNethookRun(Mastercam.App.Types.MCamReturn notused)

Should be ->
public Mastercam.App.Types.MCamReturn CustomNethookRun(int param)

----------------

If you have geometry other than lines on level #101, code in connectUpperLines will throw an Exception ->
var line = (LineGeometry)creaseGeo;
This is because the upperCreaseID list of IDs contains IDs for all geometry from that level.
So, for example if there is an arc on that level, its ID is getting added to the upperCreaseID list and 
when the code attempts to cast what is an ArcGeometry to a LineGeometry => failure.

Either make sure you do not add non-line entities to that list of entity IDs, or check before you cast.

foreach (var i in upperCreaseID)
      {
      if (set == 0)
        {
        var creaseGeo = Geometry.RetrieveEntity(i);
        // Make sure that this entity is a line before casting.
        if (creaseGeo is LineGeometry line)
          {
          var line = (LineGeometry)creaseGeo;
          creaseX1 = line.EndPoint1.x;
	      // <...snipped...>
          }
        }
      }

 

  • Like 1
Link to comment
Share on other sites

I haven't done a full refactor of your code, but you are repeating yourself a lot.

I refactored one of your methods, offsetCutchain.

First, I created two service classes: SelectionUtilities...

// File: SelectionUtilities.cs

using Mastercam.Database.Types;
using Mastercam.GeometryUtility;
using Mastercam.IO;
using Mastercam.Support;

namespace eMastercamRateMyCode
{
    internal class SelectionUtilities
    {
        public void UnselectAll() 
            => SelectionManager.UnselectAllGeometry();

        public void TurnOffVisibleLevels(bool refreshLevelsList = true)
        {
            var shown = LevelsManager.GetVisibleLevelNumbers();
            foreach (var level in shown)
            {
                LevelsManager.SetLevelVisible(level, false);
            }
            if (refreshLevelsList)
                LevelsManager.RefreshLevelsManager();
        }

        public void SetMainLevel(int levelNumber, bool makeVisible = true, bool refreshLevelsList = true)
        {
            LevelsManager.SetMainLevel(levelNumber);
            LevelsManager.SetLevelVisible(levelNumber, makeVisible);

            if (refreshLevelsList)
                LevelsManager.RefreshLevelsManager();

            GraphicsManager.Repaint(true);
        }

        public bool CreateLevel(int levelNumber, string levelName, bool setAsMain = true, bool makeVisible = true)
        {
            var result = LevelsManager.SetLevelName(levelNumber, levelName);

            if (setAsMain)
                LevelsManager.SetMainLevel(levelNumber);

            LevelsManager.SetLevelVisible(levelNumber, makeVisible);

            LevelsManager.RefreshLevelsManager();

            return result;
        }

        public int MoveSelectedToLevel(int levelNumber, bool clearSelection = true, bool clearColors = true)
        {
            var numberOfEntsCopied = GeometryManipulationManager.MoveSelectedGeometryToLevel(levelNumber, clearSelection);

            if (clearColors)
                GraphicsManager.ClearColors(new GroupSelectionMask(true));

            return numberOfEntsCopied;
        }

        public int ColorAndSelectResultGeometry(int colorID, bool isSelected = true)
        {
            var numberOfEntsCommitted = 0;

            var resultGeometry = SearchManager.GetResultGeometry();
            foreach (var geometryEntity in resultGeometry)
            {
                geometryEntity.Color = colorID;
                geometryEntity.Selected = isSelected;
                
                if (geometryEntity.Commit())
                    numberOfEntsCommitted++;
            }

            return numberOfEntsCommitted;
        }
    }
}

...and GeometryUtilities...

// File: GeometryUtilities.cs

using Mastercam.Curves;
using Mastercam.Database;
using Mastercam.Database.Types;
using Mastercam.Math;
using System.Collections.Generic;
using System.Linq;

namespace eMastercamRateMyCode
{
    internal class GeometryUtilities
    {
        public bool CreateLine(Crease crease)
        {
            var lowerPoint = new Point3D(crease.LowerPoint.X, crease.UpperPoint.Y, 0.0);
            var upperPoint = new Point3D(crease.UpperPoint.X, crease.UpperPoint.Y, 0.0);
            var line = new LineGeometry(lowerPoint, upperPoint);
            line.Selected = true;
            return line.Commit();         
        }

        public List<Chain> ChainAllByLevel(int levelToChain) 
            => ChainManager.ChainAll(levelToChain).ToList();


        public Chain OffsetChainLeft(Chain chainToOffset, double radius)
        {
            return OffsetChain(chainToOffset, OffsetSideType.Left, radius);
        }

        public Chain OffsetChainRight(Chain chainToOffset, double radius)
        {
            return OffsetChain(chainToOffset, OffsetSideType.Right, radius);
        }

        private Chain OffsetChain(Chain chainToOffset, OffsetSideType offsetSide, double radius)
        {
            return chainToOffset.OffsetChain2D(offsetSide, radius, OffsetRollCornerType.None, .5, false, .005, false);
        }
    }
}

The I created the UtilitiesFacade facade... 

// File: UtilitiesFacade.cs

namespace eMastercamRateMyCode
{
    internal class UtilitiesFacade
    {
        public SelectionUtilities Selection;
        public GeometryUtilities Geometry;

        public UtilitiesFacade()
        {

        }
    }
}

I also created two small structs to hold common chain data.

    public struct LevelData
    {
        public int Number { get; set; }
        public string Name { get; set; }
    }

    public struct ChainData
    {
        public LevelData Level { get; set; }

        public int ColorID { get; set; }

        public double SmallOffsetRadius { get; set; }

        public double LargeOffsetRadius { get; set; }
    }

With that done, the refactored method offsetCutchain looks like this...

            void OffsetCutChain(int cutChainlevel, ChainData lower, ChainData upper)
            {
                var utilities = new UtilitiesFacade();

                utilities.Selection.UnselectAll();
                utilities.Selection.TurnOffVisibleLevels();

                utilities.Selection.SetMainLevel(cutChainlevel);

                utilities.Selection.CreateLevel(lower.Level.Number, lower.Level.Name);

                utilities.Selection.CreateLevel(upper.Level.Number, upper.Level.Name);

                foreach (var chain in utilities.Geometry.ChainAllByLevel(cutChainlevel))
                {
                    utilities.Geometry.OffsetChainRight(chain, lower.SmallOffsetRadius);
                    utilities.Geometry.OffsetChainLeft(chain, lower.LargeOffsetRadius);

                    utilities.Selection.ColorAndSelectResultGeometry(11);
                    utilities.Selection.MoveSelectedToLevel(lower.Level.Number);

                    utilities.Geometry.OffsetChainLeft(chain, upper.SmallOffsetRadius);
                    utilities.Geometry.OffsetChainRight(chain, upper.LargeOffsetRadius);

                    utilities.Selection.ColorAndSelectResultGeometry(upper.ColorID);
                    utilities.Selection.MoveSelectedToLevel(upper.Level.Number);
                }
            }

 

This still is not ideal (could use more abstraction, less dependencies, etc.), but it's far less repetitive.
  
Hope that helped,

Zaffin

  • Like 2
Link to comment
Share on other sites
On 11/11/2022 at 3:57 PM, JKLINE said:

I've added everything I've learned this week into one file.

Unfortunately, there's a bug where it moves whatever geometry is on the screen when it starts.

Nonetheless, I'd appreciate feedback. This is the only C# I've ever done 😅

 

public Mastercam.App.Types.MCamReturn CustomNethookRun(Mastercam.App.Types.MCamReturn notused)
        {
            var upperCreaseID = new List<int>();
            var lowerCreaseID = new List<int>();
            var creaseX1 = 0.0;
            var creaseX2 = 0.0;
            var creaseY1 = 0.0;
            var creaseY2 = 0.0;
            var creaseX3 = 0.0;
            var creaseX4 = 0.0;
            var creaseY3 = 0.0;
            var creaseY4 = 0.0;

            void offsetCutchain(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 75 to main level and visible
                LevelsManager.SetMainLevel(75);
                LevelsManager.SetLevelVisible(75, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                //Selects all geometry on level 75
                var selectedCutChain = ChainManager.ChainAll(75);
                //Creates and names level 500 and level 501
                int createdUpperLevel = 500;
                int createdLowerLevel = 501;
                LevelsManager.SetLevelName(500, "Upper Created Cut Geo");
                LevelsManager.SetLevelName(501, "Lower Created Cut Geo");

                //edits each entity of all chains
                foreach (var chain in selectedCutChain){
                    //offsets line of lower
                    var lowerChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0225, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var cutResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometry){
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerLevel, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    //offsets line of upper
                    var upperChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0385, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var cutResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometryNew){
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperLevel, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                }
            }


            bool CreateLine1(){
                bool result = false;
                Point3D crease1 = new Point3D(creaseX1, creaseY1, 0.0);
                Point3D crease3 = new Point3D(creaseX3, creaseY3, 0.0);
                LineGeometry Line1 = new LineGeometry(crease1, crease3);
                Line1.Selected = true;
                result = Line1.Commit();
                return result;
            }

            bool CreateLine2(){
                bool result = false;
                Point3D crease2 = new Point3D(creaseX2, creaseY2, 0.0);
                Point3D crease4 = new Point3D(creaseX4, creaseY4, 0.0);
                LineGeometry Line2 = new LineGeometry(crease2, crease4);
                Line2.Selected = true;
                result = Line2.Commit();
                return result;
            }

            void offsetCreasechain(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 101 to main level and visible
                LevelsManager.SetMainLevel(101);
                LevelsManager.SetLevelVisible(101, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                //Selects all geometry on level 101
                var selectedCreaseChain = ChainManager.ChainAll(101);
                //Creates and names level 502 and level 503
                int createdUpperCrease = 502;
                int createdLowerCrease = 503;
                LevelsManager.SetLevelName(502, "Upper Created Crease Geo");
                LevelsManager.SetLevelName(503, "Lower Created Crease Geo");

                //edits each entity of all chains
                foreach (var chain in selectedCreaseChain){
                    //offsets line of lower
                    var lowerChainCrease1 = chain.OffsetChain2D(OffsetSideType.Left, .040, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease2 = chain.OffsetChain2D(OffsetSideType.Left, .065, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease3 = chain.OffsetChain2D(OffsetSideType.Right, .040, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainCrease4 = chain.OffsetChain2D(OffsetSideType.Right, .065, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var creaseResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in creaseResultGeometry){
                        lowerCreaseID.Add(entity.GetEntityID());
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerCrease, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    //offsets line of upper
                    var upperChainCrease1 = chain.OffsetChain2D(OffsetSideType.Left, .014, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainCrease2 = chain.OffsetChain2D(OffsetSideType.Right, .014, OffsetRollCornerType.None, .5, false, .005, false);
                    //Colors and selects result geometry
                    var creaseResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in creaseResultGeometryNew){
                        upperCreaseID.Add(entity.GetEntityID());
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    //Moves result geometry
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperCrease, true);
                    //Clears geometry in result
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                    }
            }

            void connectUpperLines(){
                var set = 0;
                foreach (var i in upperCreaseID){
                    if (set == 0){
                        var creaseGeo = Geometry.RetrieveEntity(i);
                        var line = (LineGeometry)creaseGeo;
                        creaseX1 = line.EndPoint1.x;
                        creaseX2 = line.EndPoint2.x;
                        creaseY1 = line.EndPoint1.y;
                        creaseY2 = line.EndPoint2.y;
                        set = 1;
                    }
                    else{
                        var creaseGeo2 = Geometry.RetrieveEntity(i);
                        var line2 = (LineGeometry)creaseGeo2;
                        creaseX3 = line2.EndPoint1.x;
                        creaseX4 = line2.EndPoint2.x;
                        creaseY3 = line2.EndPoint1.y;
                        creaseY4 = line2.EndPoint2.y;
                        CreateLine1();
                        CreateLine2();

                        var creaseResultGeometryNew = SearchManager.GetSelectedGeometry();
                        foreach (var entity in creaseResultGeometryNew){
                            entity.Color = 10;
                            entity.Selected = true;
                            entity.Commit();
                        }
                        //Moves result geometry
                        int createdUpperCrease = 502;
                        GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperCrease, true);
                        //Clears geometry in result
                        GraphicsManager.ClearColors(new GroupSelectionMask(true));
                        //Deselects all
                        SelectionManager.UnselectAllGeometry();

                        set = 0;
                    }
                }
            }

            void connectLowerLines()
            {
                var set = 0;
                foreach (var i in lowerCreaseID){
                    if (set == 0){
                        var creaseGeo = Geometry.RetrieveEntity(i);
                        var line = (LineGeometry)creaseGeo;
                        creaseX1 = line.EndPoint1.x;
                        creaseX2 = line.EndPoint2.x;
                        creaseY1 = line.EndPoint1.y;
                        creaseY2 = line.EndPoint2.y;
                        set = 1;
                    }
                    else{
                        var creaseGeo2 = Geometry.RetrieveEntity(i);
                        var line2 = (LineGeometry)creaseGeo2;
                        creaseX3 = line2.EndPoint1.x;
                        creaseX4 = line2.EndPoint2.x;
                        creaseY3 = line2.EndPoint1.y;
                        creaseY4 = line2.EndPoint2.y;
                        CreateLine1();
                        CreateLine2();

                        var creaseResultGeometryNew = SearchManager.GetSelectedGeometry();
                        foreach (var entity in creaseResultGeometryNew){
                            entity.Color = 11;
                            entity.Selected = true;
                            entity.Commit();
                        }
                        //Moves result geometry
                        int createdLowerCrease = 503;
                        GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerCrease, true);
                        //Clears geometry in result
                        GraphicsManager.ClearColors(new GroupSelectionMask(true));
                        //Deselects all
                        SelectionManager.UnselectAllGeometry();

                        set = 0;
                    }
                }
            }


            void DemoAlterLine(){
                //Unselects all Geometry
                SelectionManager.UnselectAllGeometry();
                //Turns off all visible levels
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.RefreshLevelsManager();
                //Sets level 101 to main level and visible
                LevelsManager.SetMainLevel(101);
                LevelsManager.SetLevelVisible(101, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                var geomask = new GeometryMask{Lines = true};
                var geoSel = new SelectionMask{};
                var geo = SearchManager.GetGeometry(geomask,geoSel, 101);
                if (geo != null) {
                    //Selects each line. Determines orientation and alters by 1 inch from both ends
                    foreach (var singleGeo in geo) {
                        var line = (LineGeometry)singleGeo;
                        //If line is vertical
                        if (line.Data.Point1.x == line.Data.Point2.x){
                            if (line.Data.Point1.y >= line.Data.Point2.y){
                                line.Data.Point1.y += -1;
                                line.Data.Point2.y += +1;
                                line.Selected = false;
                            };
                            if (line.Data.Point1.y <= line.Data.Point2.y){
                                line.Data.Point1.y += +1;
                                line.Data.Point2.y += -1;
                                line.Selected = false;
                            };
                        };
                        //If line is horizontal
                        if (line.Data.Point1.y == line.Data.Point2.y){
                            if (line.Data.Point1.x >= line.Data.Point2.x){
                                line.Data.Point1.x += -1;
                                line.Data.Point2.x += +1;
                                line.Selected = false;
                            };
                            if (line.Data.Point1.x <= line.Data.Point2.x){
                                line.Data.Point1.x += +1;
                                line.Data.Point2.x += -1;
                                line.Selected = false;
                            };
                        };
                        //Stores result in Mastercam
                        line.Commit();
                    }
                    //Updates screen shown
                    GraphicsManager.Repaint(true);
                }
            }

            DemoAlterLine();
            offsetCreasechain();
            connectUpperLines();
            connectLowerLines();
            offsetCutchain();

            return MCamReturn.NoErrors;

            

        }

 

 

sometimes if u hit the limit of memory in RAM or disk space(or something else went wrong), you might get a null pointer to something you need and then you'll get an exception,

 

 it's good practice to check if a pointer is valid and send a specific error to the mastercam event log using the Mastercam::IO::EventManager::LogEvent() function, this

will save you loads of trouble down the line, when something goes wrong you can just check the event log and see where in the code things went south,

 

also with .NET there are lots of exceptions, so all code should have a try/catch/finally around it with error handling

 

error handling and clear messages to show where the error occurred are the most important thing imo

 

HTH

  • Like 2
Link to comment
Share on other sites
On 11/19/2022 at 5:18 PM, Zaffin_D said:

Here is a link to a full refactor on GitHub.  I'm not sure if it's doing what you want, but it does something! 

This is outstanding! Definitely hits me like a brick and it's certainly shows I have a lot to learn about C#. It's so clean and organized :D

I'm going to use this as a reference when I'm finished so I can make the code faster. I imagine the DWG files I'll be working with are going to get quite complicated.

Link to comment
Share on other sites
On 11/19/2022 at 5:18 PM, Zaffin_D said:

Here is a link to a full refactor on GitHub.  I'm not sure if it's doing what you want, but it does something! 

I used an excerpt of your code to start understanding where my code is going wrong. The code you provided creates moves and alters level 101. I purposely left out the call to the "crease" parts of the code. This is very similar to my current issue. Did I load it incorrectly?

            var utilities = new UtilitiesFacade();
            var lowerCut = new EntityData()
            {
                ColorID = 11,
                SmallOffsetRadius = 0.0025,
                LargeOffsetRadius = 0.0225,
                Level = new LevelData(501, "Lower Created Cut Geo")
            };

            var upperCut = new EntityData()
            {
                ColorID = 10,
                SmallOffsetRadius = 0.0025,
                LargeOffsetRadius = 0.0385,
                Level = new LevelData(500, "Upper Created Cut Geo")
            };

            utilities.OffsetCutChain(75, lowerCut, upperCut);

 

Link to comment
Share on other sites

My current issue is that it moves my geometry. For example, if I call offset_75 before offset_76 it will move the geometry on level 75 to level 502 (the last 'move to level' line). If I call offset_76 before offset_75 it moves all the geometry from level 76 to level 502.

I thought I was being diligent about unselecting all geometry, clearColors, Repaint, but it still seems to grab the geometry.

 

            void offsetCutchain75(){
                SelectionManager.UnselectAllGeometry();

                LevelsManager.RefreshLevelsManager();
                LevelsManager.SetMainLevel(75);
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.SetLevelVisible(75, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                var selectedCutChain = ChainManager.ChainAll(75);
                var chainDirection = ChainDirectionType.Clockwise;

                int createdUpperLevel = 500;
                int createdLowerLevel = 501;
                LevelsManager.SetLevelName(500, "Upper Created Cut Geo");
                LevelsManager.SetLevelName(501, "Lower Created Cut Geo");

                foreach (var chain in selectedCutChain){
                    chain.Direction = chainDirection;
                    var lowerChainLarge = chain.OffsetChain2D(OffsetSideType.Right, .0225, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainSmall = chain.OffsetChain2D(OffsetSideType.Left, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var cutResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometry){
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerLevel, true);
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    var upperChainLarge = chain.OffsetChain2D(OffsetSideType.Right, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainSmall = chain.OffsetChain2D(OffsetSideType.Left, .0385, OffsetRollCornerType.None, .5, false, .005, false);
                    var cutResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometryNew){
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperLevel, true);
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                }
            }

            void offsetCutchain76(){
                SelectionManager.UnselectAllGeometry();
                LevelsManager.RefreshLevelsManager();
                LevelsManager.SetMainLevel(76);
                var shown = LevelsManager.GetVisibleLevelNumbers();
                foreach (var level in shown){
                    LevelsManager.SetLevelVisible(level, false);
                }
                LevelsManager.SetLevelVisible(76, true);
                LevelsManager.RefreshLevelsManager();
                GraphicsManager.Repaint(true);

                var selectedCutChain = ChainManager.ChainAll(76);
                var chainDirection = ChainDirectionType.Clockwise;
                int createdUpperLevel = 500;
                int createdLowerLevel = 501;
                LevelsManager.SetLevelName(500, "Upper Created Cut Geo");
                LevelsManager.SetLevelName(501, "Lower Created Cut Geo");

                foreach (var chain in selectedCutChain){
                    chain.Direction=chainDirection;
                    var lowerChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0225, OffsetRollCornerType.None, .5, false, .005, false);
                    var lowerChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var cutResultGeometry = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometry){
                        entity.Color = 11;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdLowerLevel, true);
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));

                    var upperChainLarge = chain.OffsetChain2D(OffsetSideType.Left, .0025, OffsetRollCornerType.None, .5, false, .005, false);
                    var upperChainSmall = chain.OffsetChain2D(OffsetSideType.Right, .0385, OffsetRollCornerType.None, .5, false, .005, false);
                    var cutResultGeometryNew = SearchManager.GetResultGeometry();
                    foreach (var entity in cutResultGeometryNew){
                        entity.Color = 10;
                        entity.Selected = true;
                        entity.Commit();
                    }
                    GeometryManipulationManager.MoveSelectedGeometryToLevel(createdUpperLevel, true);
                    GraphicsManager.ClearColors(new GroupSelectionMask(true));
                }
            }

 

Link to comment
Share on other sites

Zaffin_D, I blocked out (/* */) the second half of the UtilitiesFacade.cs and only kept the void OffsetCutChain and that worked out for me. Although, your code seems to have the same error that mine does. Whatever is on the first starting level gets moved to a new level. The geo on level 76 ended on level 502 while geo from level 75 stayed on level 75. If I call 75 first, 75 ends up on 502 and geo on level 76 stays on level 76.

            utilities.OffsetCutChain(76, lowerCut, upperCut);
            utilities.OffsetCutChain(75, lowerCut2, upperCut2);

I have put the MCAM file I am working to in the gitHub folder

https://github.com/UberGamz/CustomNethook

Link to comment
Share on other sites

Your changes did fix the 'crease bug' but it does move the initial entities to the final destination. In this case, it took from level 101 and moved it to 502. All the colors were rendered at color 1 (I think it's the default when color is not specified) but I'm seeing that you clearly are passing the data and I'm not finding any linking issues. 😕 How very odd.

Link to comment
Share on other sites
1 minute ago, theebyte.com said:

Usually I call SetMainLevel before offsetchain so that it goes on the level that i want

The offsetchain is ending up on the level I want it to. One of the current issues is that the initially selected geometry also goes with it. Even though it's in its' own 'void' and the second 'void' unselects all geometry and refreshes everything ect ect.

So it'll offset the geo i have on level 75 to level 501 and level 502, but then when I run the same exact code for level 76, the offset result ends up on level 501 and 502 but the starting geometry from level 75 also goes to level 502. Vice Versa if I put 76 before the 75 code.

Link to comment
Share on other sites
2 hours ago, JKLINE said:

The offsetchain is ending up on the level I want it to. One of the current issues is that the initially selected geometry also goes with it. Even though it's in its' own 'void' and the second 'void' unselects all geometry and refreshes everything ect ect.

So it'll offset the geo i have on level 75 to level 501 and level 502, but then when I run the same exact code for level 76, the offset result ends up on level 501 and 502 but the starting geometry from level 75 also goes to level 502. Vice Versa if I put 76 before the 75 code.

There is a function to Get the geometry from the chain, that would be better than getting what's set with the result bit,

 

Mastercam::Database::ChainManager::GetGeometryInChain(Mastercam::Database::Chain^)

 

Then you can check each chain and set and commit the entities to the correct level

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

Join us!

eMastercam - your online source for all things Mastercam.

Together, we are the strongest Mastercam community on the web with over 56,000 members, and our online store offers a wide selection of training materials for all applications and skill levels.

Follow us

×
×
  • Create New...