# dxfel - A tool for adding pseudo-elevation data to DXF files # generated by the autotrace vectorization tool, at # http://autotrace.sourceforge.net # # dxfel page: http://hobbiton.thisside.net/dxfel # # (C) 2004 Rupert Scammell # 2004-03-03: Version 1.0 # # dxfel is licensed under the GNU General Public License: """ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ # # Usage: dxfel.py simpl# e # Example: dxfel.py car.dxf car_3d.dxf 5.0 simple # import os, sys, string, fileinput, time # Debug output? debug = 1 # Input DXF file input_dxf = sys.argv[1] # Resulant DXF file output_dxf = sys.argv[2] # Elevation increment between layers increment = float(sys.argv[3]) # Elevation calculation method ecalc_method = string.strip(sys.argv[4]) # Dictionary that'll contain color value / elevation value matching data elevation_vdict = {} # Open file handles for IO input_handle = open(input_dxf, 'r') output_handle = open(output_dxf, 'w') # Status flags inside_layer_entity = 0 inside_le_group2 = 0 inside_polyline_entity = 0 inside_pe_group8 = 0 inside_pe_group20 = 0 outside_tablesec = 0 cur_increment = 0 def debug(debstr): print debstr # Iterate once through the file, and build a layer frequency-of-use table if smart elevation calculation has been specified. (this DOES NOT WORK YET) if (ecalc_method == "smart"): debug("Beginning distribution table calculation...") dist_table = {} for line in fileinput.input(input_dxf): lname = string.strip(line) if (outside_tablesec == 0): # Begin by building the color / elevation value correspondence dict. if (inside_layer_entity == 0): if (lname == "LAYER"): inside_layer_entity = 1 debug("Now inside LAYER entity.") continue if (inside_layer_entity == 1 and inside_le_group2 == 0): if (line == " 2\n"): inside_le_group2 = 1 debug("Now inside LAYER entity GROUP 2") continue if (inside_layer_entity == 1 and inside_le_group2 == 1): if (line[0] == "C"): print "Found LAYER ENTITY GROUP 2 C-style layer name %s . Adding to dist_table. " % (lname) dist_table[lname] = 0 inside_layer_entity = 0 inside_le_group2 = 0 if (lname == "ENDTAB"): print "End of TABLE section." outside_tablesec = 1 print dist_table.keys() if (outside_tablesec == 1): if (inside_polyline_entity == 0): if (lname == "POLYLINE"): inside_polyline_entity = 1 debug("Now inside POLYLINE entity.") continue if (inside_polyline_entity == 1 and line == " 8\n"): debug("Now inside POLYLINE entity GROUP 8") inside_pe_group8 = 1 continue # Grab layer name for polyline, which is the reference to the polyline's elevation in elevation_vdict if (inside_polyline_entity == 1 and inside_pe_group8 == 1): dist_table[lname] = dist_table[lname] + 1 print 'layer: ' + lname print 'count: ' + str(dist_table[lname]) inside_pe_group8 = 0 continue # Reset our variables at the end of a polyline vertex sequence. if (lname == "SEQEND"): inside_polyline_entity = 0 debug("End of POLYLINE entity sequence") if (lname == "EOF"): break outside_tablesec = 0 inside_polyline_entity = 0 inside_pe_group8 = 0 inside_le_group2 = 0 fileinput.close() # Main loop for line in fileinput.input(input_dxf): output_handle.write(line) lname = string.strip(line) if (ecalc_method == "simple"): if (outside_tablesec == 0): # Begin by building the color / elevation value correspondence dict. if (inside_layer_entity == 0): if (lname == "LAYER"): inside_layer_entity = 1 debug("Now inside LAYER entity.") continue if (inside_layer_entity == 1 and inside_le_group2 == 0): if (line == " 2\n"): inside_le_group2 = 1 debug("Now inside LAYER entity GROUP 2") continue if (inside_layer_entity == 1 and inside_le_group2 == 1): if (line[0] == "C"): print "Found LAYER ENTITY GROUP 2 C-style layer name %s " % (lname) elevation_vdict[lname] = cur_increment print "LAYER %s elevation is %f" % (lname, cur_increment) cur_increment = cur_increment + increment inside_layer_entity = 0 inside_le_group2 = 0 if (lname == "ENDTAB"): print "End of TABLE section." outside_tablesec = 1 else: debug("Sorting layer frequency list...") outside_tablesec = 1 dvals_values = dist_table.values() dvals_keys = dist_table.keys() min_count = -1 for (i in range(len(dvals_keys)): if (dist_table[dvals_keys[i]] > min_count): dvals_valsort = dvals_values.sort() # Populate polyline entries with elevation data from table, based on assigned polyline layer if (outside_tablesec == 1): if (inside_polyline_entity == 0): if (lname == "POLYLINE"): inside_polyline_entity = 1 debug("Now inside POLYLINE entity.") continue if (inside_polyline_entity == 1 and line == " 8\n"): debug("Now inside POLYLINE entity GROUP 8") inside_pe_group8 = 1 continue if (inside_polyline_entity == 1 and line == " 20\n"): inside_pe_group20 = 1 debug("Now inside POLYLINE entity GROUP 20") continue # Grab layer name for polyline, which is the reference to the polyline's elevation in elevation_vdict if (inside_polyline_entity == 1 and inside_pe_group8 == 1): polyline_elevation = float(elevation_vdict[lname]) if (debug == 1): print "Got polyline elevation for layer %s . Elevation is %f" % (lname, polyline_elevation) inside_pe_group8 = 0 continue if (inside_polyline_entity == 1 and inside_pe_group20 == 1): output_handle.write(" 30\n") output_handle.write(str(polyline_elevation) + "\n") if (debug == 1): print "Wrote POLYLINE GROUP 30 elevation value of %f to file." % (polyline_elevation) inside_pe_group20 = 0 continue # Reset our variables at the end of a polyline vertex sequence. if (lname == "SEQEND"): inside_polyline_entity = 0 debug("End of POLYLINE entity sequence") if (lname == "EOF"): break print 'All done.'