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); } }
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); } }