efan2000 发表于 2004-4-2 20:23:00

[转帖]读写DXF文件的示例

<PRE class=prog_in_0>一‘读DXF文件</PRE><PRE class=prog_in_0>' ReadDXF extracts specified code/value pairs from a DXF file.</PRE><PRE class=prog_in_0>' This function requires four string parameters, a valid DXF</PRE><PRE class=prog_in_0>' file name, a DXF section name, the name of an object in that</PRE><PRE class=prog_in_0>' section, and a comma delimited list of codes.</PRE><PRE class=prog_in_0>'</PRE><PRE class=prog_in_0>Function ReadDXF( _</PRE><PRE class=prog_in_0>      ByVal dxfFile As String, ByVal strSection As String, _</PRE><PRE class=prog_in_0>      ByVal strObject As String, ByVal strCodeList As String)</PRE><PRE class=prog_in_0>    Dim tmpCode, lastObj As String</PRE><PRE class=prog_in_0>    Open dxfFile For Input As #1</PRE><PRE class=prog_in_0>    ' Get the first code/value pair</PRE><PRE class=prog_in_0>    codes = ReadCodes</PRE><PRE class=prog_in_0>    ' Loop through the whole file until the "EOF" line</PRE><PRE class=prog_in_0>    While codes(1) &lt;&gt; "EOF"</PRE><PRE class=prog_in_0>      ' If the group code is '0' and the value is 'SECTION' ..</PRE><PRE class=prog_in_0>      If codes(0) = "0" And codes(1) = "SECTION" Then</PRE><PRE class=prog_in_0>            ' This must be a new section, so get the next</PRE><PRE class=prog_in_0>            ' code/value pair.</PRE><PRE class=prog_in_0>            codes = ReadCodes()</PRE><PRE class=prog_in_0>            ' If this section is the right one ..</PRE><PRE class=prog_in_0>            If codes(1) = strSection Then</PRE><PRE class=prog_in_0>                ' Get the next code/value pair and ..</PRE><PRE class=prog_in_0>                codes = ReadCodes</PRE><PRE class=prog_in_0>                ' Loop through this section until the 'ENDSEC'</PRE><PRE class=prog_in_0>                While codes(1) &lt;&gt; "ENDSEC"</PRE><PRE class=prog_in_0>                  ' While in a section, all '0' codes indicate</PRE><PRE class=prog_in_0>                  ' an object. If you find a '0' store the</PRE><PRE class=prog_in_0>                  ' object name for future use.</PRE><PRE class=prog_in_0>                  If codes(0) = "0" Then lastObj = codes(1)</PRE><PRE class=prog_in_0>                  ' If this object is one you're interested in</PRE><PRE class=prog_in_0>                  If lastObj = strObject Then</PRE><PRE class=prog_in_0>                        ' Surround the code with commas</PRE><PRE class=prog_in_0>                        tmpCode = "," &amp; codes(0) &amp; ","</PRE><PRE class=prog_in_0>                        ' If this code is in the list of codes ..</PRE><PRE class=prog_in_0>                        If InStr(strCodeList, tmpCode) Then</PRE><PRE class=prog_in_0>                            ' Append the return value.</PRE><PRE class=prog_in_0>                            ReadDXF = ReadDXF &amp; _</PRE><PRE class=prog_in_0>                              codes(0) &amp; "=" &amp; codes(1) &amp; vbCrLf</PRE><PRE class=prog_in_0>                        End If</PRE><PRE class=prog_in_0>                  End If</PRE><PRE class=prog_in_0>                  ' Read another code/value pair</PRE><PRE class=prog_in_0>                  codes = ReadCodes</PRE><PRE class=prog_in_0>                Wend</PRE><PRE class=prog_in_0>            End If</PRE><PRE class=prog_in_0>      Else</PRE><PRE class=prog_in_0>            codes = ReadCodes</PRE><PRE class=prog_in_0>      End If</PRE><PRE class=prog_in_0>    Wend</PRE><PRE class=prog_in_0>    Close #1</PRE><PRE class=prog_in_0>End Function</PRE><PRE class=prog_in_0></PRE><PRE class=prog_in_0>' ReadCodes reads two lines from an open file and returns a two item</PRE><PRE class=prog_in_0>' array, a group code and its value. As long as a DXF file is read </PRE><PRE class=prog_in_0>' two lines at a time, all should be fine. However, to make your </PRE><PRE class=prog_in_0>' code more reliable, you should add some additional error and</PRE><PRE class=prog_in_0>' other checking.</PRE><PRE class=prog_in_0>'</PRE><PRE class=prog_in_0>Function ReadCodes() As Variant</PRE><PRE class=prog_in_0>    Dim codeStr, valStr As String</PRE><PRE class=prog_in_0>    Line Input #1, codeStr</PRE><PRE class=prog_in_0>    Line Input #1, valStr</PRE><PRE class=prog_in_0>    ' Trim the leading and trailing space from the code</PRE><PRE class=prog_in_0>    ReadCodes = Array(Trim(codeStr), valStr)</PRE><PRE class=prog_in_end_0>End Function</PRE><PRE class=prog_in_end_0>        </PRE><PRE class=prog_in_end_0>二、写DXF文件</PRE><PRE class=prog_in_end_0><PRE class=prog_in_0>' WriteDXFPolygon creates a minimal DXF file that only contains</PRE><PRE class=prog_in_0>' the ENTITIES section. This subroutine requires five parameters,</PRE><PRE class=prog_in_0>' the DXF file name, the number of sides for the polygon, the X</PRE><PRE class=prog_in_0>' and Y coordinates for the bottom end of the right-most side</PRE><PRE class=prog_in_0>' (it starts in a vertical direction), and the length for each</PRE><PRE class=prog_in_0>' side. Note that because this only requests 2D points, it does</PRE><PRE class=prog_in_0>' not include the Z coordinates (codes 30 and 31). The lines are</PRE><PRE class=prog_in_0>' placed on the layer "Polygon."</PRE><PRE class=prog_in_0>'</PRE><PRE class=prog_in_0>Sub WriteDXFPolygon( _</PRE><PRE class=prog_in_0>      dxfFile As String, iSides As Integer, _</PRE><PRE class=prog_in_0>      dblX As Double, dblY As Double, dblLen As Double)</PRE><PRE class=prog_in_0>    Dim i As Integer</PRE><PRE class=prog_in_0>    Dim dblA1, dblA, dblPI, dblNX, dblNY As Double</PRE><PRE class=prog_in_0>    Open dxfFile For Output As #1</PRE><PRE class=prog_in_0>    Print #1, 0</PRE><PRE class=prog_in_0>    Print #1, "SECTION"</PRE><PRE class=prog_in_0>    Print #1, 2</PRE><PRE class=prog_in_0>    Print #1, "ENTITIES"</PRE><PRE class=prog_in_0>    dblPI = Atn(1) * 4</PRE><PRE class=prog_in_0>    dblA1 = (2 * dblPI) / iSides</PRE><PRE class=prog_in_0>    dblA = dblPI / 2</PRE><PRE class=prog_in_0>    For i = 1 To iSides</PRE><PRE class=prog_in_0>      Print #1, 0</PRE><PRE class=prog_in_0>      Print #1, "LINE"</PRE><PRE class=prog_in_0>      Print #1, 8</PRE><PRE class=prog_in_0>      Print #1, "Polygon"</PRE><PRE class=prog_in_0>      Print #1, 10</PRE><PRE class=prog_in_0>      Print #1, dblX</PRE><PRE class=prog_in_0>      Print #1, 20</PRE><PRE class=prog_in_0>      Print #1, dblY</PRE><PRE class=prog_in_0>      dblNX = dblLen * Cos(dblA) + dblX</PRE><PRE class=prog_in_0>      dblNY = dblLen * Sin(dblA) + dblY</PRE><PRE class=prog_in_0>      Print #1, 11</PRE><PRE class=prog_in_0>      Print #1, dblNX</PRE><PRE class=prog_in_0>      Print #1, 21</PRE><PRE class=prog_in_0>      Print #1, dblNY</PRE><PRE class=prog_in_0>      dblX = dblNX</PRE><PRE class=prog_in_0>      dblY = dblNY</PRE><PRE class=prog_in_0>      dblA = dblA + dblA1</PRE><PRE class=prog_in_0>    Next i</PRE><PRE class=prog_in_0>    Print #1, 0</PRE><PRE class=prog_in_0>    Print #1, "ENDSEC"</PRE><PRE class=prog_in_0>    Print #1, 0</PRE><PRE class=prog_in_0>    Print #1, "EOF"</PRE><PRE class=prog_in_0>    Close #1</PRE><PRE class=prog_in_end_0>End Sub</PRE></PRE>

莫名 发表于 2004-4-2 21:38:00

不错!

myfreemind 发表于 2004-4-3 12:12:00

好帖~~

yeats 发表于 2004-4-4 15:56:00

请问楼主这程序读些什么数据?

rscenter 发表于 2004-4-10 17:14:00

不錯,值得學習!

jzlwl 发表于 2004-4-20 09:46:00

我在vc里写了一个dxf文件,为什么autocad加载了以后没有图形。


我把autocad自己的dxf文件只保留上述格式以后,同样没有反映。


所以我觉得只写dxf的实体段可能不行。


希望大家对我的观点发表一点观点!

Sonne 发表于 2004-6-26 12:01:00

如果能读取而没有图形,可能是显示区域的问题,试一试z回车,a回车,可能就显示出来的,我也遇到过类似的问题

nokie 发表于 2004-9-17 00:35:00

请教楼上各位老师,我上传DXF是同一个图,后二个文件是CAD画的图,我在任一软件里都没有打开,怎样转换才可以在AOTOCAD里打开这图形。

nokie 发表于 2004-9-17 02:06:00

dxf:


       0<BR>SECTION<BR>       2<BR>BLOCKS<BR>       0<BR>BLOCK<BR>       8<BR>1<BR>       2<BR>1<BR>        70<BR>64<BR>        10<BR>0.0<BR>        20<BR>0.0<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.000000<BR>        20<BR>0.000000<BR>        40<BR>0.4999999924907534<BR>       1<BR>PIECE NAME: 003P53508<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0<BR>        20<BR>0<BR>        40<BR>0<BR>       1<BR>SIZE: 42<BR>       7<BR>STANDARD<BR>       0<BR>POLYLINE<BR>       8<BR>1<BR>        66<BR>        1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>242.700012<BR>        20<BR>16.400001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>244.200012<BR>        20<BR>25.600001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>244.500012<BR>        20<BR>26.700001<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>245.100012<BR>        20<BR>27.700001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>270.000013<BR>        20<BR>30.900001<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>295.500014<BR>        20<BR>31.900002<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>342.300016<BR>        20<BR>30.600001<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>389.000018<BR>        20<BR>27.000001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>397.700019<BR>        20<BR>26.100001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>400.500019<BR>        20<BR>34.400002<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>403.300019<BR>        20<BR>39.900002<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>407.600019<BR>        20<BR>44.000002<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>415.200020<BR>        20<BR>47.700002<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>423.200020<BR>        20<BR>49.100002<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>522.200025<BR>        20<BR>43.200002<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>651.300031<BR>        20<BR>29.400001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>659.300031<BR>        20<BR>28.400001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>662.700031<BR>        20<BR>35.800002<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>672.100032<BR>        20<BR>56.500003<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>679.100032<BR>        20<BR>71.900003<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>662.200031<BR>        20<BR>72.100003<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>632.800030<BR>        20<BR>77.500004<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>604.900029<BR>        20<BR>94.000004<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>596.700028<BR>        20<BR>102.800005<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>589.600028<BR>        20<BR>112.600005<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>581.600028<BR>        20<BR>128.400006<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>577.800027<BR>        20<BR>139.400007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>575.800027<BR>        20<BR>148.000007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>567.000027<BR>        20<BR>148.000007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>386.000018<BR>        20<BR>148.000007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>41.000002<BR>        20<BR>148.000007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>35.400002<BR>        20<BR>147.900007<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>10.100000<BR>        20<BR>135.500006<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>0.100000<BR>        20<BR>109.900005<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>0.000000<BR>        20<BR>96.900005<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>0.000000<BR>        20<BR>96.600005<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>2.700000<BR>        20<BR>46.500002<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>6.900000<BR>        20<BR>10.200000<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>8.400000<BR>        20<BR>0.000000<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>18.800001<BR>        20<BR>0.900000<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>83.800004<BR>        20<BR>6.600000<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>162.300008<BR>        20<BR>13.200001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>189.100009<BR>        20<BR>15.100001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>212.700010<BR>        20<BR>16.100001<BR>        42<BR>0.00<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>233.400011<BR>        20<BR>16.400001<BR>       0<BR>VERTEX<BR>       8<BR>1<BR>        10<BR>242.700012<BR>        20<BR>16.400001<BR>       0<BR>SEQEND<BR>       8<BR>1<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>74.000004<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>359.500017<BR>        20<BR>74.000004<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>74.000004<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>54.000003<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>74.000004<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>359.500017<BR>        20<BR>74.000004<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>74.000004<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>339.500016<BR>        20<BR>54.000003<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>623.400030<BR>        20<BR>55.300003<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>628.400030<BR>        20<BR>55.300003<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>625.900030<BR>        20<BR>57.800003<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>625.900030<BR>        20<BR>52.800003<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>420.300020<BR>        20<BR>49.100002<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>425.300020<BR>        20<BR>49.100002<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>422.800020<BR>        20<BR>51.600002<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>422.800020<BR>        20<BR>46.600002<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>242.300012<BR>        20<BR>27.300001<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>247.300012<BR>        20<BR>27.300001<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>POLYLINE<BR>       8<BR>8<BR>        66<BR>1<BR>        70<BR>0<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>244.800012<BR>        20<BR>29.800001<BR>       0<BR>VERTEX<BR>       8<BR>8<BR>        10<BR>244.800012<BR>        20<BR>24.800001<BR>       0<BR>SEQEND<BR>       8<BR>8<BR>       0<BR>LINE<BR>       8<BR>1<BR>        10<BR>339.500016<BR>        20<BR>74.000004<BR>        11<BR>359.500017<BR>        21<BR>74.000004<BR>       0<BR>ENDBLK<BR>       0<BR>ENDSEC<BR>       0<BR>SECTION<BR>       2<BR>ENTITIES<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>STYLE NAME: 女装<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>CREATION DATE: 2003-5-3<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>CREATION TIME: 5-3-20<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>AUTHOR: ECHO SOFT CO. LTD<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>SAMPLE SIZE: 42<BR>       7<BR>STANDARD<BR>       0<BR>TEXT<BR>       8<BR>1<BR>        10<BR>0.0000<BR>        20<BR>0.0000<BR>        40<BR>10.0000<BR>       1<BR>UNITS: METRIC<BR>       7<BR>STANDARD<BR>       0<BR>ENDSEC<BR>       0<BR>EOF<BR>

tsindong 发表于 2004-10-7 16:57:00

不能处理所有类型的对象!
页: [1] 2
查看完整版本: [转帖]读写DXF文件的示例