1 (edited by moonflow123 2022-06-13 06:39:37)

Topic: Circle Points from DrawCircleAroundMarker.cs Atlas is null

Hi, I tried using one of your Atlas example for drawing circle and noticed that there's a kind of bug whenever I created the circle.
The bug is whenever I clicked on the poly circle, it will not display its points. It did display its poly.name though.

For the atlas example I'm using is the DrawCircleAroundMarker.cs.

Keep in mind that the only thing that I added in the DrawCircleAroundMarker.cs is the OnCircleClick function and also a bool so I can only create the marker and the circle when the bool is true;

Here's the code

 public class DrawCircleAroundMarker : MonoBehaviour
    {
        /// <summary>
        /// Radius of the circle
        /// </summary>
        public float radiusKM = 0.1f;

        /// <summary>
        /// Number of segments
        /// </summary>
        public int segments = 64;
        public Vector2[] circlePoint;
        public bool drawCircle;

        /// <summary>
        /// This method is called when a user clicks on a map
        /// </summary>
        private void DrawCircle()
        {
            if(Input.GetMouseButtonDown(0))
            {
                // Get the coordinates under cursor
                double lng, lat;
                OnlineMapsControlBase.instance.GetCoords(out lng, out lat);

                // Create a new marker under cursor
                OnlineMapsMarkerManager.CreateItem(lng, lat, "Marker " + OnlineMapsMarkerManager.CountItems);

                OnlineMaps map = OnlineMaps.instance;

                // Get the coordinate at the desired distance
                double nlng, nlat;
                OnlineMapsUtils.GetCoordinateInDistance(lng, lat, radiusKM, 90, out nlng, out nlat);

                double tx1, ty1, tx2, ty2;

                // Convert the coordinate under cursor to tile position
                map.projection.CoordinatesToTile(lng, lat, 20, out tx1, out ty1);

                // Convert remote coordinate to tile position
                map.projection.CoordinatesToTile(nlng, nlat, 20, out tx2, out ty2);

                // Calculate radius in tiles
                double r = tx2 - tx1;

                // Create a new array for points
                OnlineMapsVector2d[] points = new OnlineMapsVector2d[segments];

                // Calculate a step
                double step = 360d / segments;

                // Calculate each point of circle
                for (int i = 0; i < segments; i++)
                {
                    double px = tx1 + Math.Cos(step * i * OnlineMapsUtils.Deg2Rad) * r;
                    double py = ty1 + Math.Sin(step * i * OnlineMapsUtils.Deg2Rad) * r;
                    map.projection.TileToCoordinates(px, py, 20, out lng, out lat);
                    points[i] = new OnlineMapsVector2d(lng, lat);
                }

                // Create a new polygon to draw a circle
                OnlineMapsDrawingElement poly = OnlineMapsDrawingElementManager.AddItem
                (new OnlineMapsDrawingPoly(points, Color.red, 3, Color.red));
                poly.OnClick += OnCircleClick;
            }
        }

        /// <summary>
        /// This method is called when the script starts
        /// </summary>
        private void Start()
        {
            // Subscribe to click on map event
        }

        private void Update()
        {
            if(drawCircle)
            DrawCircle();
        }

        private void OnCircleClick(OnlineMapsDrawingElement element)
        {
            OnlineMapsDrawingPoly poly = element as OnlineMapsDrawingPoly;

            circlePoint = poly.points as Vector2[];
            Debug.Log(poly.name);

            if(circlePoint == null || circlePoint.Length == 0)
            Debug.LogError("Cannot See The Circle Points!!!");
        }
    }
Post's attachments

Attachment icon Circle Point Empty.PNG 36.73 kb, 44 downloads since 2022-06-13 

Re: Circle Points from DrawCircleAroundMarker.cs Atlas is null

Hello.

The problem is that in DrawCircle method you are creating OnlineMapsVector2d[], and in OnCircleClick method you are trying to cast it to Vector2[].
In OnCircleClick method, you also need to use OnlineMapsVector2d[].

Kind Regards,
Infinity Code Team.

Boost your productivity a lot and immediately using Ultimate Editor Enhancer. Trial and non-commerce versions available.

Re: Circle Points from DrawCircleAroundMarker.cs Atlas is null

Ah that's why, thank you for that. Let me test it.

Re: Circle Points from DrawCircleAroundMarker.cs Atlas is null

Alex Vertax wrote:

Hello.

The problem is that in DrawCircle method you are creating OnlineMapsVector2d[], and in OnCircleClick method you are trying to cast it to Vector2[].
In OnCircleClick method, you also need to use OnlineMapsVector2d[].

Hi, sorry again I wanted to ask about element.instance

Why can't I immediately get the instance of the drawing each time it is created?

Script Example

         if(Input.GetMouseButtonUp(0))
        {
            if(poly != null && poly.name == "Rect")
            {
                Vector2[] vertices2D = new Vector2[]{pointRect[0], pointRect[1], pointRect[2], pointRect[3]};

                poly.Dispose();

                if(warna.value == 0)
                polygon = new OnlineMapsDrawingPoly(vertices2D, Color.blue, 1, Color.blue);
                else
                polygon = new OnlineMapsDrawingPoly(vertices2D, Color.red, 1, Color.red);

                poly = OnlineMapsDrawingElementManager.AddItem(polygon);
                poly.name = "Rect";

                if(poly != null)
                OnlineMaps.instance.Redraw();
                
                poly.OnClick += OnElementClick;
                poly.OnPress += OnElementPress;
                poly.OnRelease += OnElementRelease;

                Debug.Log(poly.instance.name);

                poly = null;
                onlineMaps.blockAllInteractions = false;
                isDragging = false;
                isDrawingSquare = false;
                n = 0;
            }
        }

In the script above, whenever I try to immediately check the instance of the drawing (In this case the instance.name), it always showed an error in which the object I referenced is not there.

NullReferenceException: Object reference not set to an instance of an object
DrawArrow.DrawKotak () (at Assets/Scripts/DrawArrow.cs:404)
DrawArrow.IsDrawing () (at Assets/Scripts/DrawArrow.cs:278)
DrawArrow.Update () (at Assets/Scripts/DrawArrow.cs:82)

Re: Circle Points from DrawCircleAroundMarker.cs Atlas is null

The map is not immediately redrawn and an instance will be created on the next redraw.

If you really need an instance right away, call drawingElement.DrawOnTileset method.
This will cause the element to be drawn and create an instance.

Kind Regards,
Infinity Code Team.

Boost your productivity a lot and immediately using Ultimate Editor Enhancer. Trial and non-commerce versions available.