Asked — Edited

Need Help With Plugin

I need some help with a plugin I am working on. I am new to C# and OOP. Have went thru the Tutorial and the SDK Tutorials also.

User-inserted image

How do I get the values from the form in to my C# code?

 public enum LocationType
            {
                Wall = 255,
                Empty = 0,
                Destination = 254,
                Source = 1
            }
            public struct Location
            {

instead of Wall = 255, how do I get Wall = textBox1.Text. textBox1 being the Textbox name.

Thanks RichardZ


ARC Pro

Upgrade to ARC Pro

Experience early access to the latest features and updates. You'll have everything that is needed to unleash your robot's potential.

PRO
USA
#1  

//Option1:
//  null        => 0 AND returns false
//  empty       => 0 AND returns false
//  non integer => 0 AND returns false
int i1;
if (!int.TryParse(textBox1.Text, out i1))
{
    //it's not an integer 
    //raise an error
}

//Option2: 
//  null        => 0
//  empty       => raises an exception
//  non integer => raises an exception
int i2 = Convert.ToInt32(textBox1.Text);

//Option2: 
//  null        => raises an exception
//  empty       => raises an exception
//  non integer => raises an exception
int i3 = int.Parse(textBox1.Text);

If you're collecting input from a user, I'd go with option #1

PRO
USA
#2  

Thank you ptp, I have decided to leave the values for Robot, Empty, Wall and Goal as set values. Having them as part of an enumeration is my problem there I think.

In the picture I posted, Map Variable is $MyMap. This is a string of 6400 characters. Each character represents a 1'x1' block. How do I get this variable from ARC into my C#? I plan to use 2 for loops to move the data from the $MyMap variable to a 2 dimension array in the plugin.

PRO
USA
#3  

private void DoSomething()
{
	//Get EZScript's map variable
	var mapString = VariableManager.GetVariable("$MyMap");
	//example map 4 x 3 => "X....X....X."

	//Convert string to an array of 4 by 3
	var map4X3 = StringToMap(mapString, 4);

	DoSomethingWithMap(map4X3);

	//Convert array to string
	var newMapString = MapToString(map4X3);

	//Set EZScript's map variable
	VariableManager.SetVariable("$MyMap", newMapString);
}

private void DoSomethingWithMap(char[,] map)
{
	for (var rowIndex = 0; rowIndex < map.GetLength(0); rowIndex++)
	{
		for (var colIndex = 0; colIndex < map.GetLength(1); colIndex++)
		{
			var cellValue = map[rowIndex, colIndex];
			//DoSomething with cellValue
		}
	}
}

private static string MapToString(char[,] map)
{
	return new string(map.Cast<char>().ToArray());
}

private static char[,] StringToMap(string flatString, int width)
{
	var flatArray = flatString.ToCharArray();

	var height = (int)Math.Ceiling(flatArray.Length / (double)width);
	var result = new char[height, width];

	for (var index = 0; index < flatArray.Length; index++)
	{
		var rowIndex = index / width;
		var colIndex = index % width;
		result[rowIndex, colIndex] = flatArray[index];
	}

	return result;
}

PRO
USA
#4  

Quote:

instead of Wall = 255, how do I get Wall = textBox1.Text. textBox1 being the Textbox name.

Quote:

Having them as part of an enumeration is my problem there I think.

If your wall value is an enum you should use a ComboBox to capture the user input.

To load the ComboBox LocationTypeComboBox:


LocationTypeComboBox.DataSource = Enum.GetValues(typeof(LocationType));
LocationTypeComboBox.SelectedIndex = 0;

To get the enum from the ComboBox:


LocationType locationType;
Enum.TryParse<LocationType>(LocationTypeComboBox.SelectedValue.ToString(), out locationType); 

The "Standard" for a Label and Input is: Label TextBox Label ComboBox ...

PRO
USA
#5  

Thank you I believe this is what I was missing. I have picked up a few books on C# and going thru the lessons. catching on to the syntax easy enough but some of the concepts are a bit tough to get my head around. It is a bit different from TRS-80 Basic.

PRO
USA
#6  

When I execute the plugin, I get an error:

An exception of type 'System.Exception' occurred in ARC.exe but was not handled in user code

Additional information: Variable is an array: $MyMap

Makes sense to me. in ARC $MyMap is an array of 6400

the line of code reads:


var mapString = VariableManager.GetVariable("$MyMap");

PRO
USA
#7  

Quote:

In the picture I posted, Map Variable is $MyMap. This is a string of 6400 characters.
You mentioned a string.

if your variable is an Array:


//Get value from position 0 of $MyMap array
VariableManager.GetVariable("$MyMap", 0) 

PRO
USA
#8  

I'm curious, what you plan to do with EZ-Script and an Array of 80x80 i.e. 6400 positions ?

PRO
USA
#9  

if you want to minimize the code you can use my extension method. EZ-Script doesn't have typed types, GetVariable always returns a string. My method will convert the string or array of strings to the type specified in the invocation.

Examples:


var str1 = this.GetVariable<string>("$str1");
var int1 = this.GetVariable<int>("$int1");
var arrayOfString1 = this.GetVariable<string[]>("$arrayOfString1");
var arrayOfInteger1 = this.GetVariable<int[]>("$arrayOfInteger1");

although is your responsibility to store the correct data type when using EZ-Script.


private T GetVariable<T>(string variableName)
{
	if (!VariableManager.DoesVariableExist(variableName))
	{
		return default(T);
	}

	if (!typeof(T).IsArray)
	{
		if (!VariableManager.IsVariableArray(variableName))
		{
			return (T)Convert.ChangeType(VariableManager.GetVariable(variableName), typeof(T));
		}

		//requested type is array but the variable is not an array => return null;
		return default(T);
	}

	var arraySize = VariableManager.GetArraySize(variableName);
	var elementType = typeof(T).GetElementType();
	var array = Array.CreateInstance(elementType, arraySize);

	for (var i = 0; i < arraySize; i++)
	{
		var elementValue = Convert.ChangeType(VariableManager.GetVariable(variableName, i), elementType);
		array.SetValue(elementValue, i);
	}
	return (T)(object)array;
}

PRO
USA
#10  

@PTP, I am working on a wavefront navigation plugin and $MyMap is the flat array of the house (80x80). I have written it in EZ-Script but it was extremely slow. So I decided to make a plugin. I have sense discovered that it I get rid of the variable monitor, the array initializes in less the a second instead of 20 min. I have thought of going back to the EZ-Script version but It is about time I learned C# anyway. My son if fluent in C# OOP, but he is so busy with his work and his 2 autistic children. I will read thru the code and get back with you soon. I could attach my C# project and the EZ-Script for that matter if you like.

Thanks again

RichardZ

PRO
Synthiam
#11  

Good discovery, Richard. Any of the debugging controls will dramatically slow down the project. It's because rendering a significant number of items to the screen is very taxing on the CPU.

Sounds like you have a pretty interesting and fun project over there! I bet everyone is excited to see and hear more - I sure am!

PRO
Synthiam
#12  

Also should add this link, which explains eZscript variables and methods: https://synthiam.com/Tutorials/UserTutorials/146/18

PRO
USA
#13  

DJ, Is this valid? It does not give me an error but it does not seem to work ether.


VariableManager.SetVariable("$Disp2[" + MyCount +"]", map[x1, y1]);

PRO
Synthiam
#14  

That will make a variable name that won't be referenced

Check the previously mentioned tutorial for creating arrays: https://synthiam.com/Tutorials/UserTutorials/146/18

PRO
USA
#15  

Got it!

Ended up with this:


VariableManager.CreateVariableArray("$Disp2",0,0);


                for (int x1 = 0; x1 < map.GetLength(0); x1++)
                {
                    for (int y1 = 0; y1 < map.GetLength(1); y1++)
                    {
                        disp = map[x1, y1].ToString();
                        
                        VariableManager.AppendToVariableArray("$Disp2", disp);
                    }
            
                }

PRO
USA
#16  

I have read thru the Tutorial more time then I can count. Digging thru the Object Browser and a lot of trial & even more error, I am getting close. I will have a write up on it soon. For now, you give the plugin a map of your home. $MyMap 255 = Wall 254 = The Robot 1 = The Goal 0 = Open Space Call the plugin and it will Return an Array named $MyRoute. With in the Array Starting from the Robots position a "-" indicates the next location to move towards the goal. So if you have an 80x80 map, $MyRoute[0 - 79] is column 0, [80 - 159] is column 1and so on. On my map North and West are 0,0 To move east on the map +1 to current position, to move south +80 to current position. - 80 for north, -1 west.

Now to add movement and object avoidance. My plan is.. if an object is detected, mark the position on the map and resubmit it to the plugin to get a new solution.

Thank you both for your help. Hope to have it public soon. RichardZ

PRO
Synthiam
#17  

You got it! That's the correct code as posted.

Or since you know the size of the array, you can do this...



VariableManager.CreateVariableArray("$Disp2",0, map.GetLength(0) * map.GetLength(1));

int index = 0;

                for (int x1 = 0; x1 < map.GetLength(0); x1++)
                {
                    for (int y1 = 0; y1 < map.GetLength(1); y1++)
                    {
                        disp = map[x1, y1].ToString();
                        
                        VariableManager.SetVariable("$Disp2", disp, index)

                      index++;
                    }
            
                }