public void SetGcodeRenderBeans(List <GcodeRenderBean> gcodeRenderBeanList)
    {
        if (gcodeRenderBeanList == null || gcodeRenderBeanList.Count == 0)
        {
            Debug.LogWarning("gcodeRenderBeanList is empty" + "\n");
            return;
        }

        _gcodeRenderBeanList = gcodeRenderBeanList;

        //1.release
        VectorLine.Destroy(_vectorLineList_types.ToArray());
        VectorLine.Destroy(_vectorLineList_topLayer.ToArray());

        //types
        _drawItemList_types.Clear();
        _vectorLineList_types.Clear();
        _colorsDic_types = null;

        //top layer
        _colors_topLayer = GcodeTypeColor.Top_Layer;
        _active_topLayer = false;
        _drawItemList_topLayer.Clear();
        _vectorLineList_topLayer.Clear();

        _vectorsList_layer.Clear();

        //2.separate gcodeRenderPoints by 16383
        //per vectorLine is assigned 16383 Vector3
        for (int i = 0; i < Mathf.CeilToInt(_gcodeRenderBeanList.Count / (float)_pointCountLimit); i++)
        {
            List <GcodeRenderBean> gcodeRenderPointBuffer_line = null;

            List <Vector3> vectorsItem_line = new List <Vector3> ();

            if (_gcodeRenderBeanList.Count >= i * _pointCountLimit + _pointCountLimit)
            {
                gcodeRenderPointBuffer_line = _gcodeRenderBeanList.GetRange(i * _pointCountLimit, _pointCountLimit);
            }
            else
            {
                gcodeRenderPointBuffer_line = _gcodeRenderBeanList.GetRange(i * _pointCountLimit, _gcodeRenderBeanList.Count - i * _pointCountLimit);
            }

            foreach (GcodeRenderBean gcodePoint in gcodeRenderPointBuffer_line)
            {
                //Attention : switch y <====> z
                Vector3 vec3 = new Vector3(gcodePoint.vector3.x, gcodePoint.vector3.z, gcodePoint.vector3.y);
                vectorsItem_line.Add(vec3);
            }

            VectorLine vectorLine = new VectorLine("line_" + i, vectorsItem_line, null, _lineWidth, LineType.Continuous, Joins.None);
            vectorLine.active = true;

            DrawItem drawItem = new DrawItem();
            drawItem.vectorLine           = vectorLine;
            drawItem.gcodeRenderPointList = gcodeRenderPointBuffer_line;
            _drawItemList_types.Add(drawItem);
        }

        foreach (DrawItem item in _drawItemList_types)
        {
            _vectorLineList_types.Add(item.vectorLine);
        }

        //3.separate all Vector3 by layer index
        //if the point count of 1 layer is less than 16383, draw them by 1 vectorLine instance
        //else draw them by more than 1 vectorLine instance
        List <GcodeRenderBean> gcodeRenderPointBuffer_layer = new List <GcodeRenderBean> ();

        gcodeRenderPointBuffer_layer.Add(_gcodeRenderBeanList [0]);
        List <Vector3> vectorsItem_layer = new List <Vector3> ();

        for (int i = 1; i < _gcodeRenderBeanList.Count; i++)
        {
            GcodeRenderBean pointNew  = _gcodeRenderBeanList [i];
            GcodeRenderBean pointLast = gcodeRenderPointBuffer_layer [gcodeRenderPointBuffer_layer.Count - 1];

            if (pointNew.layerIndex == pointLast.layerIndex)
            {
                gcodeRenderPointBuffer_layer.Add(pointNew);
            }
            else
            {
                foreach (GcodeRenderBean temp in gcodeRenderPointBuffer_layer)
                {
                    //Attention : switch y <====> z
                    Vector3 vec3 = new Vector3(temp.vector3.x, temp.vector3.z, temp.vector3.y);
                    vectorsItem_layer.Add(vec3);
                }

                //vectorsItem_layer will clear, so need deep copy
                _vectorsList_layer.Add(new List <Vector3> (vectorsItem_layer));
                vectorsItem_layer.Clear();
                gcodeRenderPointBuffer_layer.Clear();
                gcodeRenderPointBuffer_layer.Add(pointNew);
            }
        }

        //attention : there still are points in buff
        foreach (GcodeRenderBean gcodePoint in gcodeRenderPointBuffer_layer)
        {
            //Attention : switch y <====> z
            Vector3 vec3 = new Vector3(gcodePoint.vector3.x, gcodePoint.vector3.z, gcodePoint.vector3.y);
            vectorsItem_layer.Add(vec3);
        }

        //vectorsItem_layer will clear, so need deep copy
        _vectorsList_layer.Add(new List <Vector3> (vectorsItem_layer));
        vectorsItem_layer.Clear();
        gcodeRenderPointBuffer_layer.Clear();

        int pointCountMax_layer = 0;

        foreach (List <Vector3> list in _vectorsList_layer)
        {
            pointCountMax_layer = list.Count > pointCountMax_layer ? list.Count : pointCountMax_layer;
        }

        for (int i = 0; i < Mathf.CeilToInt(pointCountMax_layer / (float)_pointCountLimit); i++)
        {
            VectorLine vectorLine = new VectorLine("line_top_" + i, new List <Vector3>(), null, _lineWidth, LineType.Continuous, Joins.None);
            vectorLine.active = true;
            _vectorLineList_topLayer.Add(vectorLine);
        }
    }
예제 #2
0
    private void parseG0G1(char[] charArray)
    {
        //data is useless until _curLayerIndex != int.MinValue
        if (_curLayerIndex == int.MinValue)
        {
            return;
        }

        Vector3 tempPos = _curPosition;

        _type_parseG0G1 = ' ';
        float valueE = 0;

        //gcode for example: G1 X64.633 Y60.314 E635.56884
        //PS : float.Parse("1") == float.Parse("1 ")
        //switch case is little slower than if-else
        for (int i = 3; i < charArray.Length; i++)
        {
            if (charArray[i] == 'X' ||
                charArray[i] == 'Y' ||
                charArray[i] == 'Z' ||
                charArray[i] == 'E' ||
                charArray[i] == 'F')
            {
                _type_parseG0G1 = charArray[i];
            }
            else if (charArray[i] == ' ')
            {
                _buffer_parseG0G1[_endIndex_parseG0G1] = '\0';
                _endIndex_parseG0G1 = 0;
                if (_type_parseG0G1 == 'X')
                {
                    _curPosition.x = float.Parse(new string(_buffer_parseG0G1));
                }
                else if (_type_parseG0G1 == 'Y')
                {
                    _curPosition.y = float.Parse(new string(_buffer_parseG0G1));
                }
                else if (_type_parseG0G1 == 'Z')
                {
                    _curPosition.z = float.Parse(new string(_buffer_parseG0G1));
                }
                else if (_type_parseG0G1 == 'E')
                {
                    valueE = float.Parse(new string(_buffer_parseG0G1));
                }
            }
            else
            {
                _buffer_parseG0G1[_endIndex_parseG0G1++] = charArray[i];
            }
        }

        if (_endIndex_parseG0G1 > 0)
        {
            _buffer_parseG0G1[_endIndex_parseG0G1] = '\0';
            _endIndex_parseG0G1 = 0;
            if (_type_parseG0G1 == 'X')
            {
                _curPosition.x = float.Parse(new string(_buffer_parseG0G1));
            }
            else if (_type_parseG0G1 == 'Y')
            {
                _curPosition.y = float.Parse(new string(_buffer_parseG0G1));
            }
            else if (_type_parseG0G1 == 'Z')
            {
                _curPosition.z = float.Parse(new string(_buffer_parseG0G1));
            }
            else if (_type_parseG0G1 == 'E')
            {
                valueE = float.Parse(new string(_buffer_parseG0G1));
            }
        }

        if (tempPos != _curPosition)
        {
            GcodeRenderBean bean = new GcodeRenderBean(_curPosition, valueE, _curType, _curLayerIndex);
            _gcodeRenderPointList.Add(bean);
        }
    }
    public void SetColor_types(Dictionary <GcodeType, Color32> colorsDic)
    {
        if (colorsDic.Count == 0)
        {
            return;
        }
        _colorsDic_types = colorsDic;
        //change colors
        Color32 color_WALL_INNER = colorsDic [GcodeType.WALL_INNER];
        Color32 color_WALL_OUTER = colorsDic [GcodeType.WALL_OUTER];
        Color32 color_SKIN       = colorsDic [GcodeType.SKIN];
        Color32 color_SKIRT      = colorsDic [GcodeType.SKIRT];
        Color32 color_SUPPORT    = colorsDic [GcodeType.SUPPORT];
        Color32 color_FILL       = colorsDic [GcodeType.FILL];
        Color32 color_UNKNOWN    = colorsDic [GcodeType.UNKNOWN];
        Color32 color_Travel     = colorsDic [GcodeType.Travel];

        for (int i = 0; i < _drawItemList_types.Count; i++)
        {
            DrawItem item = _drawItemList_types [i];
            item.colorList.Clear();

            for (int k = 0; k < item.gcodeRenderPointList.Count; k++)
            {
                GcodeRenderBean point = item.gcodeRenderPointList [k];

                Color32 color32 = GcodeTypeColor.UNKNOWN;
                switch (point.type)
                {
                case GcodeType.WALL_INNER:
                    color32 = color_WALL_INNER;
                    break;

                case GcodeType.WALL_OUTER:
                    color32 = color_WALL_OUTER;
                    break;

                case GcodeType.SKIN:
                    color32 = color_SKIN;
                    break;

                case GcodeType.SKIRT:
                    color32 = color_SKIRT;
                    break;

                case GcodeType.SUPPORT:
                    color32 = color_SUPPORT;
                    break;

                case GcodeType.FILL:
                    color32 = color_FILL;
                    break;

                case GcodeType.UNKNOWN:
                    color32 = color_UNKNOWN;
                    break;

                case GcodeType.Travel:
                    color32 = color_Travel;
                    break;
                }

                item.colorList.Add(color32);
            }

            item.colorList.RemoveAt(0);
            item.vectorLine.SetColors(item.colorList);
        }
    }