Files
PVPlant/lib/postprocessor.py
2025-01-28 00:04:13 +01:00

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()