How can i use the value in column 'lon' and 'lat' as the position of my uv_sphere? For example,read the values from line 4, (116.4559081, 39.9139083), and make these 2 numbers as my uv_sphere x and y position in blender? and gives different colors for different mode, for example i have 4 modes in the csv , i want to make the uv sphere that represents the bus mode to be red, and subway to be green , rail to be blue and tram to be yellow., and use the row ['from'] and ['to'] to connect the nodes with a cylinder with x scale 0.5 , y scale 0.5 and the z scale with the value in ['length'] value.
1$\begingroup$ Are the x and y positions going to be vertices or objects? $\endgroup$– Ray MairlotJan 16, 2017 at 12:08
$\begingroup$ @RayMairlot, hi...thank you for responding , i want to make a uv sphere at with those numbers . $\endgroup$– JeffFederickJan 16, 2017 at 12:34
2$\begingroup$ Also look into: github.com/domlysz/BlenderGIS and github.com/vvoovv/blender-osm You may find way to do a correct mapping of lat long to x y, otherwise it may appear stretched vertically or horizontally... and one or both of those links may let you link concordances to an actual map. Also you might find QGIS to be a better tool for what you're trying to do. $\endgroup$– James ThomasJan 16, 2017 at 14:19
1$\begingroup$ I have just seen that this is the second time you have asked this question (blender.stackexchange.com/questions/71458/…). You shouldn't have asked the same question again. If you needed to update the original question then you should have 'edited' it. $\endgroup$– Ray MairlotJan 16, 2017 at 14:45
$\begingroup$ @RayMairlot hi sir, can you help? $\endgroup$– JeffFederickFeb 22, 2017 at 12:20
You can use the csv library to read and parse CSVs.
If you have a basic bus object on a different layer (or a sphere called
bus), this script will duplicate it and then assign the longitude and latitude values from your CSV as the new object's x and y values, for each row in your CSV.
import bpy, csv fp = "C:/csvs/buses.csv" with open( fp ) as csvfile: rdr = csv.reader( csvfile ) for i, row in enumerate( rdr ): if i == 0: continue # Skip column titles lon, lat = row[3:5] # Generate UV sphere at x = lon and y = lat (and z = 0 ) bpy.ops.mesh.primitive_uv_sphere_add( location = ( float(lon), float(lat), 0 ) )
I used this CSV to test this code:
mode,country/city,ID,lon,lat bus,CN/Beijing,bus81254,65.98592786,51.75899959 bus,CN/Beijing,bus73859,92.83295925,87.98592343 bus,CN/Beijing,bus52924,88.43513405,88.79596166 bus,CN/Beijing,bus52141,92.68713387,15.49215037 bus,CN/Beijing,bus8170,36.0964094,42.77106261 bus,CN/Beijing,bus46545,84.46655319,43.23791824 bus,CN/Beijing,bus60033,66.14547792,61.71886078 bus,CN/Beijing,bus63664,35.46744528,4.412149752 bus,CN/Beijing,bus62759,89.04704861,93.61280167 bus,CN/Beijing,bus72522,25.00040058,9.672330218 bus,CN/Beijing,bus55786,96.79310251,73.2168682 bus,CN/Beijing,bus55381,44.75153181,23.6187773 bus,CN/Beijing,bus21913,39.26107112,98.37814343 bus,CN/Beijing,bus2981,35.8751682,23.26682901 bus,CN/Beijing,bus52068,56.09661959,97.26439994 bus,CN/Beijing,bus59329,54.47486082,87.98768438 bus,CN/Beijing,bus40450,6.994144595,29.2284396 bus,CN/Beijing,bus51603,95.90526567,26.46823662
$\begingroup$ hey thank you for responding :D, that looks awesome, but somehow when i try to copy your code, i have an error on line 7. the one that " for i, row in enumerate( rdr ): ", how should i change it to make it work? please help. and i want to make a uv_sphere with it $\endgroup$ Jan 16, 2017 at 12:36
$\begingroup$ Can you specify the error you're getting from the console? $\endgroup$– TLouskyJan 16, 2017 at 12:38
$\begingroup$ it just says " Python script fail, look in the console now . . . " import bpy, csv with open('C:\\Users\\Jeff\\Desktop\\Thesis\\nodes.csv') as csvfile: rdr = csv.reader( csvfile ) for i, row in enumerate( rdr ): if i == 0: continue # Skip column titles mode, ctry, id, lon, lat = row[:] # Duplicate basic bus object o = bpy.data.objects["uv_sphere"].copy() o.layers = [ i == 0 for i in range(20) ] bpy.context.scene.objects.link( o ) o.location.x = float( lon ) o.location.y = float( lat ) $\endgroup$ Jan 16, 2017 at 12:40
$\begingroup$ You can open a console window through the Window menu --> Toggle System Console. The console output should be more explicit. $\endgroup$– TLouskyJan 16, 2017 at 12:41
1$\begingroup$ @JeffFederick Is there a column "F" in your data. The code is only trying to unpack 5 vars, if there are more or less you need to adjust accordingly. $\endgroup$ Jan 16, 2017 at 15:35
If you have your data in a .txt file in Rows of points like x1,y1,z1 but also want to align the Object to an end point or a specific rotation you could try this approach. Here x1,y1,z1 is the start point of a cylinder, then x2,y2,z2 is the end point of the cylinder and the last value is the Diameter of that cylinder.
The code is for Blender 2.80:
import bpy import csv from mathutils import Vector with open('inputfile.txt', newline='') as inputfile: results = list(csv.reader(inputfile)) for numberCylinders in range(0,len(results)): myCylinderData=[0,0,0, 0,0,0, 0] for i in range(1,7): myCylinderData[i]=float(results[numberCylinders][i]) myStartLoc = Vector((myCylinderData,myCylinderData,myCylinderData)) myEndLoc = Vector((myCylinderData,myCylinderData,myCylinderData)) myLengthVec = (myEndLoc - myStartLoc) myLength = myLengthVec.length myDiameter = myCylinderData upVector = Vector((0,0,1)) myRotQuaternion=upVector.rotation_difference(myEndLoc) myRotEulerAngles=myRotQuaternion.to_euler() myRotEulerAnglesVec=((myRotEulerAngles.x,myRotEulerAngles.y,myRotEulerAngles.z)) bpy.ops.mesh.primitive_cylinder_add(vertices=32, radius=myDiameter/2,depth=myLength, end_fill_type='NGON', location=myStartLoc, rotation=myRotEulerAnglesVec) bpy.ops.object.mode_set(mode='EDIT') bpy.ops.transform.translate(value=(0, 0, myLength/2), orient_type='LOCAL') bpy.ops.object.mode_set(mode='OBJECT')