3
$\begingroup$

enter image description hereenter image description here

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.

$\endgroup$
9
  • 1
    $\begingroup$ Are the x and y positions going to be vertices or objects? $\endgroup$ Commented Jan 16, 2017 at 12:08
  • $\begingroup$ @RayMairlot, hi...thank you for responding , i want to make a uv sphere at with those numbers . $\endgroup$ Commented Jan 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$ Commented Jan 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$ Commented Jan 16, 2017 at 14:45
  • $\begingroup$ @RayMairlot hi sir, can you help? $\endgroup$ Commented Feb 22, 2017 at 12:20

2 Answers 2

6
$\begingroup$

enter image description here

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
$\endgroup$
27
  • $\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$ Commented Jan 16, 2017 at 12:36
  • $\begingroup$ Can you specify the error you're getting from the console? $\endgroup$
    – TLousky
    Commented Jan 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$ Commented 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$
    – TLousky
    Commented Jan 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$
    – batFINGER
    Commented Jan 16, 2017 at 15:35
0
$\begingroup$

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[0],myCylinderData[1],myCylinderData[2]))
    myEndLoc = Vector((myCylinderData[3],myCylinderData[4],myCylinderData[5]))
    myLengthVec = (myEndLoc - myStartLoc)
    myLength = myLengthVec.length
    myDiameter = myCylinderData[6]

    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')
$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .