⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxf2xyz.bas

📁 Surfer是地学中常用的一个软件
💻 BAS
字号:
'==========================================================================
'DXF2XYZ.BAS
'
'This script extracts X,Y,Z information from a 3D DXF file
'
'	Original from USGS, Z capability added by Juan Carlos Colichon, Lima Peru
'	Port from QBASIC to Surfer 6 Scripter by TB 6/19/95
'
'												SKP 10/99 Surfer 7
'==========================================================================

Sub Main
	'Declare the variable that will reference the application
	'Dim SurferApp As Object

	'Creates an instance of the Surfer Application object 
	' and assigns it to the variable named "SurferApp"
	'Set SurferApp = CreateObject("Surfer.Application")

	'Makes Surfer visible
	'SurferApp.Visible = True
	
	BEGINNING:
	'(JCC changed BLN to DAT)
	Count = 0
	Debug.Print "---- Begin Program: ";Time;" ----------------------------"
	Debug.Print "     This program produces XYZ data from AutoCAD polylines"
	Debug.Print "             It expects the .DXF file for input"
	Debug.Print "             It produces the .DAT file as output"
	Debug.Print
	
	'Get Input and export file names
	FileIn$=InputBox$("Enter path, filename, and extension of the DXF file.")
	If FileIn$= "" Then End
	Open FileIn$ For Input As #1
	FileOut$=InputBox$("Enter path, filename, and extension of the DAT file.")
	If FileOut$="" Then End
	Open "x.Tmp" For Output As #2
	Open FileOut$ For Output As #3
	
	'Begin Section to Skip Header Data
	Polycount = 1
	
	BEGINPOLYLINE:'  LOOK FOR POLYLINE BEGINNING IN THE FILE
		If EOF(1) = -1 Then End
		Line Input #1, LI$
		'PRINTLINE	
		POLYLINE$=Mid$(LI$,1,8)	
		If POLYLINE$<>"POLYLINE" Then GoTo BEGINPOLYLINE ' LOOP UNTIL FIND A POLYLINE
		Debug.Print "WORKING ON POLYLINE NUMBER: ";POLYCOUNT
  	
  	LOOKFORLAYERFLAG:' LOOK FOR THE LAYER FLAG
  		Line Input #1, LI$ ' SKIP THIS LINE (SHOULD BE LAYERFLAG "8")
  		Line Input #1, LI$
  		LAYERNAME$=Left$(LI$,30)
  		Debug.Print "PROCESSING POLYLINE ON LAYER: ";LAYERNAME$
  		
  	BEGINVERTEX:' LOOK FOR BEGINNING VERTEX AFTER FINDING POLYLINE
  		Line Input #1,LI$
  		'PRINTLINE  
  		VERTEX$=Left$(LI$,6)
  		If VERTEX$<>"VERTEX" Then GoTo BEGINVERTEX
  		VERTEXCOUNT=0 	' START COUNTING VERTICES
  		
  	DOCOORDS:			' BEGINNING OF SECTION TO DO X,Y,Z COORDS
  		VERTEXCOUNT=VERTEXCOUNT+1
  		Debug.Print "PROCESSING VERTEX NUMBER: ";VERTEXCOUNT
  		
  	DOXCOORD:			' LOOK FOR X COORD FLAG
  		Line Input #1,LI$
  		'PRINTLINE  
  	LOOKFORXCOORDFLAG: 
  		XCOORDFLAG$=Mid$(LI$,1,3)
  		If XCOORDFLAG$<>" 10" Then GoTo DOXCOORD
  	GETXCOORD:
  		Line Input #1,LI$
  		'PRINTLINE  
  		X$=Mid$(LI$,1,25)
  		
  	DOYCOORD:			' LOOK FOR Y COORD FLAG
  		Line Input #1,LI$
  		'PRINTLINE 
  	LOOKFORYCOORDFLAG:
  		YCOORDFLAG$=Mid$(LI$,1,3)
  		If YCOORDFLAG$<>" 20" Then GoTo DOYCOORD
  	GETYCOORD:
  		Line Input #1,LI$
  		'PRINTLINE  
  		Y$=Mid$(LI$,1,25)
  		
  	DOZCOORD:			' LOOK FOR Z COORD FLAG    (JCC)
  		Line Input #1,LI$
  		'PRINTLINE
  	LOOKFORZCOORDFLAG:
  		ZCOORDFLAG$=Mid$(LI$,1,3)
  		If ZCOORDFLAG$<>" 30" Then GoTo DOZCOORD
  	GETZCOORD:
  		Line Input #1,LI$
  		'PRINTLINE
  		Z$=Mid$(LI$,1,25)
  		
  	WRITEXYCOORDS:                  '(JCC).  Round values - TB1099
  		Print #2, Round(Val(X$),14);", ";Round(Val(Y$),14);", ";Round(Val(Z$),14)
  		Debug.Print "  ";Round(Val(X$),14);", ";Round(Val(Y$),14);", ";Round(Val(Z$),14)

	CHECKFOREND: 'END OF X,Y,Z TRIPLET, GET NEXT OR NEW LINE OR END POLYLINE
  		Line Input #1, LI$
  		SEQEND$=Left$(LI$,6)
  		If SEQEND$="SEQEND" Then GoTo ENDPOLYLINE
  		If SEQEND$="VERTEX" Then GoTo DOCOORDS
  		GoTo CHECKFOREND
  		
  	ENDPOLYLINE: ' SECTION TO END THE POLYLINE INFO
  	'If VERTEXCOUNT=2 Then VERTEXCOUNT=3:Print #2, X$;",";Y$
  	'THE ABOVE FIXES A GLITCH IN SURFER...NO 2 POINT LINES ALLOWED
  	'CORRECTED BY DUPLICATING THE 2ND COORD. FOR THE 3RD COORD.
  	Close #2
  	Open "x.TMP" For Input As #2
  	While Not EOF(2)
  		Line Input #2,LI$
  		'PRINTLINE
  		Print #3, LI$
  	Wend
  	Close #2 ' CLOSE AFTER READING DATA
  	Open "x.TMP" For Output As #2    'OPEN TEMP FILE AGAIN FOR NEXT LINE
  	POLYCOUNT=POLYCOUNT+1
  	GoTo BEGINPOLYLINE			   ' GO BACK AND LOOK FOR NEXT POLYLINE
  	
  	
  	Rem ***             BEGIN ERROR ROUTINES
  	Beep()
  	Beep()
  	Debug.Print "AN ERROR HAS OCCURED TRYING TO OPEN THE FILE: "; FILEIN$;".  PLEASE CHECK THE NAME AND TRY AGAIN..."
  	Ans%=MsgBox("AN ERROR HAS OCCURED TRYING TO OPEN THE FILE.  PLEASE CHECK THE NAME AND TRY AGAIN. Exit the program?",4)
  	If ans%=1 Then 
  		End
  	Else
  		GoTo beginning  
  	End If
  	
  	
  	ENDFILE:' ***     BEGIN ERROR ROUTINE FOR END OF FILE
  	Debug.Print 
  	Debug.Print "END OF FILE HAS BEEN REACHED"
  	Debug.Print "CLOSING INPUT AND OUTPUT FILES"
  	Debug.Print "PROGRAM ENDING WAS NORMAL"
  	Close
End Sub
  
'==============================================================================
'***   BEGIN SUBROUTINES
Sub Printline
	'The next line can be commented out to not show the carets (>) in the Immediate Window
	Debug.Print ">";LI$;"                               "
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -