146 lines
2.8 KiB
Python
146 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
#-------------------------------------------------
|
|
#-- textures on nurbs use cases heights and sun intensity
|
|
#--
|
|
#-- microelly 2016 v 0.3
|
|
#--
|
|
#-- GNU Lesser General Public License (LGPL)
|
|
#-------------------------------------------------
|
|
|
|
|
|
import cv2
|
|
import geodat
|
|
import matplotlib
|
|
import numpy as np
|
|
|
|
|
|
def getHeights(nsf,size=16):
|
|
|
|
kzs=np.zeros((size+1,size+1),np.float)
|
|
for ux in range(size+1):
|
|
for vx in range(size+1):
|
|
u=float(ux)/size
|
|
v=float(vx)/size
|
|
p=nsf.value(u,v)
|
|
kzs[ux,vx]=p[2]
|
|
|
|
kzs *= 0.001
|
|
|
|
# normalize
|
|
kzs -= kzs.min()
|
|
kzs /= kzs.max()
|
|
return kzs
|
|
|
|
|
|
def getNormals(nsf,size=16,direction=FreeCAD.Vector(0,0,1)):
|
|
|
|
direction.normalize()
|
|
kzs=np.zeros((size+1,size+1),np.float)
|
|
for ux in range(size+1):
|
|
for vx in range(size+1):
|
|
u=float(ux)/size
|
|
v=float(vx)/size
|
|
(t1,t2)=nsf.tangent(u,v)
|
|
# calculate the normale vector and how it differs from the given direction
|
|
n=t1.cross(t2)
|
|
kzs[ux,vx]=n*direction
|
|
|
|
return kzs
|
|
|
|
|
|
|
|
|
|
def createColor(kzs,size,mode):
|
|
|
|
img= np.zeros((size+1,size+1,3), np.uint8)
|
|
|
|
#cmap = matplotlib.cm.get_cmap('jet')
|
|
cmap = matplotlib.cm.get_cmap('hsv')
|
|
|
|
for ux in range(size+1):
|
|
for vx in range(size+1):
|
|
t=kzs[ux,vx]
|
|
if mode == 1: (r,g,b,a)=cmap(1-t)
|
|
if mode == 2: (r,g,b,a)=cmap(t)
|
|
img[size-vx,size-ux]=(255*r,255*g,255*b)
|
|
|
|
# cv2.applyColorMap(img, cv2.COLORMAP_JET)
|
|
|
|
#cv2.imshow('image2',img)
|
|
fn='/tmp/image_'+str(size)+'.png'
|
|
cv2.imwrite(fn,img)
|
|
return fn
|
|
|
|
#
|
|
#
|
|
# use cases
|
|
#
|
|
|
|
|
|
nurbs=App.ActiveDocument.QuadNurbs
|
|
|
|
|
|
|
|
'''
|
|
#
|
|
# Height map
|
|
#
|
|
|
|
s=64
|
|
|
|
kzs=getHeights(nurbs.Shape.Surface,s)
|
|
fn=createColor(kzs,s,1)
|
|
geodat.geodat_lib.addImageTexture(nurbs,fn,scale=(1,1))
|
|
Gui.updateGui()
|
|
App.ActiveDocument.Text.LabelText=["Height Map","colormap HSV",str(s**2) + " color pixel"]
|
|
|
|
'''
|
|
|
|
'''
|
|
#
|
|
# Height map animation with different solutions
|
|
#
|
|
|
|
for s in 4,8,16,32:
|
|
kzs=getHeights(nurbs.Shape.Surface,s)
|
|
fn=createColor(kzs,s,1)
|
|
geodat.geodat_lib.addImageTexture(nurbs,fn,scale=(1,1))
|
|
Gui.updateGui()
|
|
time.sleep(0.4)
|
|
'''
|
|
|
|
'''
|
|
#
|
|
# How planar is the surface - normals
|
|
#
|
|
|
|
for s in 4,8,16,32,64,256:
|
|
kzs=getNormals(nurbs.Shape.Surface,s)
|
|
fn=createColor(kzs,s,1)
|
|
geodat.geodat_lib.addImageTexture(nurbs,fn,scale=(1,1))
|
|
Gui.updateGui()
|
|
time.sleep(0.4)
|
|
'''
|
|
|
|
|
|
#
|
|
# flow of the sun from 6:00 a.m. until 6:00 p.m. in 60 steps
|
|
#
|
|
|
|
for h in range(61):
|
|
s=100
|
|
|
|
App.ActiveDocument.Text.LabelText=["Simulation Sun, Day time",str(6.0+ 12.0*h/60),str(s**2) + " color pixel"]
|
|
|
|
kzs=getNormals(nurbs.Shape.Surface,s,FreeCAD.Vector(np.cos(np.pi*h/60),-np.sin(np.pi*h/60),np.sin(np.pi*h/60)))
|
|
|
|
# evening sun
|
|
# kzs=getNormals(nurbs.Shape.Surface,s,FreeCAD.Vector(-1,-1,2-0.05*h))
|
|
|
|
# from axo view
|
|
# kzs=getNormals(nurbs.Shape.Surface,s,FreeCAD.Vector(1,-1,2-0.05*h))
|
|
|
|
fn=createColor(kzs,s,2)
|
|
geodat.geodat_lib.addImageTexture(nurbs,fn,scale=(1,1))
|
|
Gui.updateGui()
|