Пример #1
0
        //-------------------------------------//
        private byte[] readByte(int lenght, int offset = -1)
        {
            if (lenght < 0)
            {
                lenght = 0;
            }
            setOffset(offset);

            byte[] dataArray = null;


            if (m_offset < m_blocklen)
            {
                if ((m_offset + lenght) > m_blocklen)
                {
                    m_eof  = true;
                    lenght = m_blocklen - m_offset;
                }

                dataArray = new byte[lenght];


                try
                {
                    lenght = m_reader.Read(dataArray, 0, lenght);
                }
                catch
                {
                    lenght = 0;
                    m_eof  = true;
                }

                if (lenght != dataArray.Length)
                {
                    System.Array.Resize(ref dataArray, lenght);
                }
            }
            else
            {
                if (lenght > 0)
                {
                    m_error.addWarning("ReadStr:EOF!");
                    lenght = 0;
                }

                m_eof = true;
            }


            if (lenght > 0)
            {
                m_offset = m_offset + lenght;
            }

            return(dataArray);
        }
Пример #2
0
        //------------------------------------------//
        public clSliceData getSliceData(int ObjectIndex, int LayerIndex, float jobLayerThickness)
        {
            clSliceData sd = new clSliceData();
            int         n  = 0;

            if (ObjectIndex != 0)
            {
                return(sd);
            }


            float scaleFactor = m_FileHead.scaleFactor;

            //m_error.addInfo(System.IO.Path.GetFileName( m_filename)  +" : factor: " + scaleFactor + "; ");


            int convertedLayerindex = LayerIndex - (int)(m_IndexTable[0].layerPos / jobLayerThickness);     // Min z



            if ((convertedLayerindex >= 0) && (convertedLayerindex < m_IndexTable_count))
            {
                setOffset(m_IndexTable[convertedLayerindex].FileOffset);

                int OType = 0;
                while (OType != 2)
                {
                    //- Befehl/Operator Byte
                    OType = readIntBE(1);

                    switch (OType)
                    {
                    case 1:
                        //- ersten 2 Byte sind ca. die Höhe??!!!
                        readByte(11);     //- Header überspringen
                        //- Header... lesen???!!!
                        break;

                    case 2:
                        //- Ende
                        break;

                    case 3:
                        //Command : start polyline
                        //Syntax : $$POLYLINE/id,dir,n,p1x,p1y,...pnx,pny
                        //Parameters:
                        //
                        //	id		: INTEGER
                        //	dir,n		: INTEGER
                        //	p1x..pny	: REAL
                        //
                        //
                        //id : identifier to allow more than one model information in one file.
                        //id refers to the parameter id of command $$LABEL (HEADER-section).
                        //dir : Orientation of the line when viewing in the negative z-direction
                        //0 : clockwise (internal)
                        //1 : counter-clockwise (external)
                        //2 : open line (no solid)
                        //n : number of points
                        //p1x..pny : coordinates of the points 1..n

                        if (readIntBE(1) != 0)     //- vielleicht "dir"?
                        {
                            m_error.addWarning("unbekanntes Byte [dir?] @ " + m_offset);
                        }

                        n = readIntBE(2);


                        if (n > 0)
                        {
                            //int n2 = n*2; //- x+y
                            float[,] points = new float[n, 2];

                            //- Punkte lesen
                            for (int i = 0; i < n; i++)
                            {
                                //- Punkt lesen und mit internem Faktor skalieren
                                points[i, 0] = scaleFactor * readIntBE(2);
                                points[i, 1] = scaleFactor * readIntBE(2);
                            }

                            sd.addPolygon(points, n);
                        }

                        break;

                    case 4:
                        //- support
                        //m_error.addWarning("Support is not supported!");

                        //Command : start hatches
                        //Syntax : $$HATCHES/id,n,p1sx,p1sy,p1ex,p1ey,...pnex,pney
                        //Parameters:
                        //
                        //	id		: INTEGER
                        //	n		: INTEGER
                        //	p1sx..pney	: REAL
                        //
                        //id : identifier to allow more than one model information in one file.
                        //id refers to the parameter id of command $$LABEL (HEADER-section).
                        //n : number of hatches (n*4 =number of coordinates)
                        //p1sx..pney : coordinates of the hatches 1..n
                        //4 parameters for every hatch (startx,starty,endx,endy)


                        //- Keine Ahnung
                        if (readIntBE(1) != 0)
                        {
                            m_error.addWarning("unbekanntes Byte @ " + m_offset);
                        }

                        n = readIntBE(2);

                        if (n > 0)
                        {
                            //- hier gibt es 2 Punkt pro Linie
                            int m = n * 2;

                            float[,] points = new float[m, 2];

                            //- Punkte lesen: es werden 2*n Punkte eingelesen da jede Linie einen Start und ein Ende-Punkt hat
                            for (int i = 0; i < m; i++)
                            {
                                points[i, 0] = scaleFactor * readIntBE(2);    //- start/ende-x
                                points[i, 1] = scaleFactor * readIntBE(2);    //- start/ende-y
                            }

                            sd.addHatch(points, m);
                        }

                        break;

                    default:
                        m_error.addWarning("Data-Stream-Error??? Unknow Data Type: " + OType + " @ " + m_offset);
                        break;
                    }
                }
            }

            return(sd);
        }