C# Vraagje

Vragen die je boven niet kwijt kunt, kan je hier stellen.

Moderator: Moderators

Plaats reactie
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Wat ik met Cirkels ga doen?.. niet veel.. zoals gezegd in CamBam kan ik de Arcs veranderen in Polylines.. en omdat ik daar toch de "platte code" opmaak, kukelt dat er verder ook niet tegenaan.. gewoon Select all, Edit, Polyline, Remove Arcs.

Daar zie je op een Noniusring uiteindelijk toch niets van..
mijn huidige project maakt letters zonder lijntjes.. :shock: de opdrachtgever wil Braille
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 12027
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: C# Vraagje

Bericht door hugo stoutjesdijk »

Nonius ring, voor die streepjes moet je sowiezo in graden werken, en die tekst kan gewoon in XY, dat diepte verschil vind je niet terug.
Maar het is jouw feestje, ik heb voor de rest van m'n leven genoeg 4 assig freeswerk gedaan. :mrgreen:
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

't gaat er mij om dat ik eens iets heb dat echt werkt om een NC bestandje op een cilinder te kwakken.. zoals gezegd de plugin van CamBam is kødt, en die functie in EdingCNC werkt niet..

Meer dan je Z0 op de Centerlijn zetten, je programma opmaken op Z+Radius, en dan je Y-Coordinaten omzeten in A-Coordinaten, en de getalwaarden vermenigvuldigen met 360/omtrek is het niet..

maar waar ik dus nu nog tegenaan fiets is : hoe peuter ik alleen die cijfertjes die Na de Y staan eruit, en hoe plak ik de verrekende waarde terug in de string, om dan van de Y een A te maken?.. want meer dan dat is het niet..

Code: Selecteer alles

 for (int i= 0; i< textBox1.Lines .Length; i++)
                {
                    if (lines[i].Contains("Y"))
                    {
                       
                lines[i] = lines[i].Replace('Y', 'A');
                    }
                    textBox2.Text=textBox2.Text+lines[i]+Environment .NewLine ;
                }
Dit heb ik al.. en dat werkt feilloos. (dat heb ik al getest met een bestand met een lengte van 360 mm, zodat de Y-A coordinaten niet gewijzigd hoeven te worden.. )

Maar voor het geval dat ze dat wel moeten, heb ik dus nog een snippertje code nodig om dat voor elkaar te boksen.
hfjbuis
Donateur
Berichten: 3070
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Even snel gemaakt:

Code: Selecteer alles

        void test()
        {
            String Source = "G00 X1.1111 Y0.0931 Z2.4";
            String Converted = Source;
            String Mask = "";
            Mask = "";
            Mask += "(?<BEGIN>.*?)";                                      
            Mask += @"(?<AS>Y)";                          
            Mask += @"(?<VALUE>-?\d{1,5}(.\d{1,5})?)";                         
            Mask += "(?<REST>[^\r\n]*)?.*";

            Match MatchResult = Regex.Match(Source, Mask);
            if (MatchResult.Success)
            {
                String b = MatchResult.Groups["BEGIN"].ToString();
                String a = MatchResult.Groups["AS"].ToString();
                String v = MatchResult.Groups["VALUE"].ToString();
                String r = MatchResult.Groups["REST"].ToString();
                Converted = b + "A" + v + r;
            }
Ik bouw de mask regel voor regel op. Dan loop ik er met de debugger door heen. Gaat het fout, dan pas ik de mask aan en probeer opnieuw. Met name als de masks wat complex worden, dan houd ik zo het overzicht.
In de eerste test was de mask niet meer dan: Mask += "(?<BEGIN>.*?)";
There are only 2 limits, the sky and your imagination
lordprimoz
Berichten: 141
Lid geworden op: 27 jun 2017 13:40
Locatie: Hengelo

Re: C# Vraagje

Bericht door lordprimoz »

Hoi Arie,

Voorbeeldje gemaakt, kijk maar of je er iets uit kan halen:
https://github.com/marklendering/GcodeReplaceWithRegex/

implementatie zit in MainWindow.xaml.cs
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Eh.. thanks.. maar ik zit met C#7.3 Visual Studio 2019..
Ik ga met het voorbeeldje van hfjbuis even stoeien..
lordprimoz
Berichten: 141
Lid geworden op: 27 jun 2017 13:40
Locatie: Hengelo

Re: C# Vraagje

Bericht door lordprimoz »

Arie Kabaalstra schreef: 01 jun 2022 21:47 Eh.. thanks.. maar ik zit met C#7.3 Visual Studio 2019..
Ik ga met het voorbeeldje van hfjbuis even stoeien..
mjah, ik heb het gemaakt in visual studio code, maar je zou het prima met VS2019 moeten kunnen openen.
Dit is de code die het werk verricht.

Code: Selecteer alles

using System;
using System.Windows;
using Microsoft.Win32;
using System.IO;
using System.Text.RegularExpressions;

namespace GcodeRegex
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        static readonly string pattern = @"[Y][0-9.]*";
        Regex rg {get;init;}
        public MainWindow()
        {
            InitializeComponent();
            rg = new Regex(pattern);  
        }

        private async void ConvertButtonClick(object sender, RoutedEventArgs e)
        {

            OpenFileDialog d = new OpenFileDialog();
            if(d.ShowDialog() == true)
            {
                String[] lines = await File.ReadAllLinesAsync(d.FileName, cancellationToken:default);
                foreach(String line in lines)
                {
                    //print lines to unchanged output
                    GcodeInput.Text += $"{line}\n";
                    var match = rg.Match(line);
                    if(match.Success)
                    {
                        //we have a match, we need to read it and replace with new calculated value.
                        GcodeOutput.Text += $"{rg.Replace(line, ParseAndConvertFromYToA(match.Value))}\n";
                    }
                    else
                    {
                        GcodeOutput.Text += $"{line}\n";
                    }
                }
            }
        }

        private string ParseAndConvertFromYToA(string input)
        {
            float parsedValue;
            if(float.TryParse(input.Substring(1), out parsedValue))
            {
                parsedValue += 13.37f;
            }
            else
            {
                //error, could not parse value. Should do something here.
            }

            return $"A{parsedValue:0.000}";
        }
    }
}
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik ga er morgen even voor zitten.. 't is nu tijd voor een biertje..in elk geval bedankt.. 't werken met strings is toch wel het lastigste van programmeren..
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

hfjbuis schreef: 01 jun 2022 20:09 Even snel gemaakt:

Code: Selecteer alles

        void test()
        {
            String Source = "G00 X1.1111 Y0.0931 Z2.4";
            String Converted = Source;
            String Mask = "";
            Mask = "";
            Mask += "(?<BEGIN>.*?)";                                      
            Mask += @"(?<AS>Y)";                          
            Mask += @"(?<VALUE>-?\d{1,5}(.\d{1,5})?)";                         
            Mask += "(?<REST>[^\r\n]*)?.*";

            Match MatchResult = Regex.Match(Source, Mask);
            if (MatchResult.Success)
            {
                String b = MatchResult.Groups["BEGIN"].ToString();
                String a = MatchResult.Groups["AS"].ToString();
                String v = MatchResult.Groups["VALUE"].ToString();
                String r = MatchResult.Groups["REST"].ToString();
                Converted = b + "A" + v + r;
            }
en dat werkt!..

Code: Selecteer alles

 if (textBox1.Text != "")
            {
                String[] lines = textBox1.Text.Split('\n');
                for (int i = 0; i < textBox1.Lines.Length; i++)
                {
                    String Converted = lines[i];
                    String Mask = "";
                    Mask = "";
                    Mask += "(?<BEGIN>.*?)";
                    Mask += @"(?<AS>Y)";
                    Mask += @"(?<VALUE>-?\d{1,5}(.\d{1,5})?)";
                    Mask += "(?<REST>[^\r\n]*)?.*";

                    Match MatchResult = Regex.Match(lines[i], Mask);
                    if (MatchResult.Success)
                    {
                        String b = MatchResult.Groups["BEGIN"].ToString();
                        String a = MatchResult.Groups["AS"].ToString();
                        String v = MatchResult.Groups["VALUE"].ToString ();
                        double Val = double.Parse(v);
                        String r = MatchResult.Groups["REST"].ToString();
                        Converted = b + "A" + Math.Round(Val * -anglepermm, 4).ToString() + r;
                    }
                }
            }
en Dit heb ik er van gemaakt.. ik kwam er bij de simulatie achter dat ie alles in spiegelschrift deed.. dat heb ik eerder bij de hand gehad.. in CamBam kun je dat ook instellen dat ie de output spiegelt, maar eigenlijk zou dat niet nodig zijn.. als het gespiegeld uit de machine komt.. dan draait je A-as de verkeerde kant op..

Immers:

Afbeelding

een +A rotatie is dus als de frees boven de as staat, en naar je toe roteert,dus de A-as draait dan van rechts gezien met de klok mee.. en zo is het in EdingCNC ook ingesteld, maar omdat je Y- Coordinaten naar een A+ moet converteren, moet je dus het teken omdraaien.. eigenlijk heel logisch, maar je moet het wel even weten!
TextTest.jpg
en zo ziet mijn TextTest er dan uit op het scherm..
morgen ofzo maar eens even testen.. ik heb toch de A-as nog op de machine staan, alle nulpunten staan goed.. dus kan ik er wel even een testje tussendoor fietsen..

Dan kan ik ook de Software nog even "opnetteren", de button "Wrap Code Y-A" moet even zo ingesteld worden dat ie pas werkt als er een Diameter is ingegeven, en dan nog even wat andere dingetjes uitpuzzelen.. 'k moet er nu nog met de hand een ijlgang beweging inzetten naar Y0, Z veilige afstand, anders wordt het een zooitje.. (dat is bij de CamBam Plugin ook het probleem)

Sowieso is CamBam nog niet helemaal goed.. want hij heeft al een Z beweging voor de Toolcall.. dus als je naar Z14 gaat, en je hebt je huidige tool nog niet gelaten.. dan gaat ie met de spindelneus naar Z14.. en dat is te diep.. boem=ho zeg maar..
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik ben nog even verder gegaan met het Y-A Wrapper programmaatje.
de boel een beetje "opnetteren" enzo.. ik heb de Save Converted File functie er nu ook inzitten.. en de SaveFileDialog toont nu gewoon de originele Filename met ".Wrapped" erachter.. extensie staat automagisch op *.nc

Nu komt de volgende stap (als ik er ook een mooi icoontje voor gemaakt heb ), het "Bouwen" van de software, een Setup maken, en daar ook de juiste Runtimes (redistributables) bij zetten.

Hoe doe ik dat op een Nette manier?
hfjbuis
Donateur
Berichten: 3070
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 05 jun 2022 16:00 Nu komt de volgende stap (als ik er ook een mooi icoontje voor gemaakt heb ), het "Bouwen" van de software, een Setup maken, en daar ook de juiste Runtimes (redistributables) bij zetten.
Hoe doe ik dat op een Nette manier?
Als je met rechts op het project klikt, heb je een optie om het project te publiceren. Die maakt er dan een installer voor.

Het kan zijn dat je voor de installer een certificaat moet hebben. Dat kun je zelf aanmaken via Project | eigenschappen | Signing | create test certificaat. Dat certificaat is een jaar geldig. Daarna moet je weer een nieuw aanmaken.

Je hebt een dotnet applicatie en je kunt bij de Project | eigenschappen | Publish | Prerequisites aangeven of en welke dotnet versie meegeïnstalleerd moet worden.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Code: Selecteer alles

 if (textBox1.Text != "")
            {
                String[] lines = textBox1.Text.Split('\n');
                for (int i = 0; i < textBox1.Lines.Length; i++)
                {
                    String Converted = lines[i];
                    String Mask = "";
                    Mask = "";
                    Mask += "(?<BEGIN>.*?)";
                    Mask += @"(?<AS>Y)";
                    Mask += @"(?<VALUE>-?\d{1,5}(.\d{1,5})?)";
                    Mask += "(?<REST>[^\r\n]*)?.*";

                    Match MatchResult = Regex.Match(lines[i], Mask);
                    if (MatchResult.Success)
                    {
                        String b = MatchResult.Groups["BEGIN"].ToString();
                        String a = MatchResult.Groups["AS"].ToString();
                        String v = MatchResult.Groups["VALUE"].ToString ();
                        double Val = double.Parse(v);
                        String r = MatchResult.Groups["REST"].ToString();
                        Converted = b + "A" + Math.Round(Val * -anglepermm, 4).ToString() + r;
                    }
                }
            }
dit stuk code werkt geweldig, dank @hfjbuis!
Maar.. ik heb me zitten bedenken.. nu moet ik voor elke diameter in CamBam apart een progje aanmaken om het werkvlak op +Radius in Z te krijgen.

Als ik nu een progje aanmaak met Z0 als werkvlak, en ik breidt die code nog wat uit.. dan kan ik gewoon alle Z-waarden vermeerderen met de Radius, en zo in mijn progje de code aanmaken voor elke opgegeven Radius

Nou begrijp ik echt geen bal van RegEx.. 't ziet er voor mij nog altijd uit alsof er een Aap op mijn Toetsenbord heeft zitten rammen, maar ik begrijp ongeveer wat het doet..

eigenlijk omdat Z altijd na Y komt.. zitten de Z-waarden, indien aanwezig in String r.. hoe peuter ik daar nou de Z waarden uit?..
zodat ik onderaan iets krijg in de trant van:

Code: Selecteer alles

Converted = b + "A" + Math.Round(Val * -anglepermm, 4).ToString() + r + Math.Round(zval +radius,4).ToString();
Wat er dus moet gebeuren is kijken of er in String r een "Z" staat, en zo ja, dat ie daar de waarde erachter eruitpeuterd, en de vermeerderd met de Radius van het werkstuk.

Hoedoenemedat?

Ik heb intussen ook een Menubalkje in de applicatie gepropt, en daar staat maar 1 label in.. "Help", waarbij een 2de Form opent, met een webbrowser, die Help.HTML toont.. met daarin opgesomd de vereisten, zoals de orientatie van de assen.. (ik heb het idee dat bij velen de A-as de verkeerde kant op draait) de positie van het werkvlak (komt te vervallen als die Z verrekening erin zit.. Z0 blijft op de Centerlijn van de A-as, net als Y0..

't lastige is dat de code die een CAM programma uitpoept bij elke PP anders is, dus de machine voorpositioneren op Y0 blijft iets wat je makkelijker zelf kan, nadat je de code omgezet hebt.. gewoon boven in het programma op een handige plek een G0 Y0 invoegen.. en klaar is Arie
hfjbuis
Donateur
Berichten: 3070
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Ik zit deze week niet meer achter de pc.
Zondag kan ik wel twee regels code kloppen mocht het nog nodig zijn!
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13457
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik heb even gekeken naar de output van die regels volgens het stukje code wat je eerder geklopt had.. maar die slaat de eerste G-Code regel over, waarbij ie naar Z Workplane+ Veiligheidsafstand gaat..
'k heb even een knoeiprojectje aangemaakt om te testen.. en als ik de waarden van de variabelen b, a, v, en r weergeef.. dan komt de eerste regel met G-Code niet in de lijst voor.. , en de waarde van r, geeft ie alleen weer bij de eerste regel, de rest niet..

Kortom.. ik snap nu nog minder van de code..

Misschien heb ik het helemaal bij't verkeerde eind.. maar ik denk dat ik gewoon elke regel af moet lopen.. zoeken naar een "Y", is die er, het getal erachter eruit peuteren, en dat vermenigvuldigen, en zoeken naar een "Z", als die er is.. de waarde vermeerderen met de Radius..
meer dan dat zou het toch niet moeten zijn?
Plaats reactie