Skip to content

Commit

Permalink
Experiment adding python code to pybind11-based pyWinCalc.
Browse files Browse the repository at this point in the history
  • Loading branch information
danielmcquillen committed Apr 20, 2021
1 parent c82e828 commit 99bf5ed
Show file tree
Hide file tree
Showing 13 changed files with 4,367 additions and 4 deletions.
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ set(BUILD_WinCalc_tests OFF CACHE BOOL "")
include(CMakeLists-WinCalc.txt)
include(CMakeLists-pybind11.txt)

pybind11_add_module(${target_name} src/pywincalc.cpp)
# Set source directory
set(SOURCE_DIR "src/pywincalc")
# Tell CMake that headers are also in SOURCE_DIR
include_directories(${SOURCE_DIR})

pybind11_add_module(${target_name} src/_pywincalc.cpp)

target_compile_features(${target_name} PUBLIC cxx_std_17)
target_link_libraries( ${target_name} PRIVATE wincalc)
Expand Down
3 changes: 3 additions & 0 deletions pywincalc/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from _pywincalc import *


24 changes: 24 additions & 0 deletions pywincalc/integrated.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pywincalc.optical import IntegratedSpectralAveragesSummary
from pywincalc.product import Product
from pywincalc.standard import CalculationStandardName


def generate_integrated_spectral_averages_summary(product: Product,
standard: CalculationStandardName) \
-> IntegratedSpectralAveragesSummary:
"""
Generate integrated spectral averages summary for a given product and standard.
:param product:
:param standard:
:return:
"""

# TODO: Business logic that generates integrated spectral averages summary
# TODO: for the given product and calculation standard.

values: IntegratedSpectralAveragesSummary = IntegratedSpectralAveragesSummary(standard=standard)
values.standard = standard
values.tf_sol = 0.123

return values
35 changes: 35 additions & 0 deletions pywincalc/material.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from pydantic.dataclasses import dataclass
from enum import Enum


class MaterialType(Enum):
UNKNOWN = "Unknown"
NA = "Not applicable"
GLASS = "glass"
PVB = "PVB"
POLYCARBONATE = "polycarbonate"
ACRYLIC = "acrylic"
PET = "PET"


material_type_lookup = {
1: "UNKNOWN",
2: "NA",
3: "GLASS",
4: "PVB",
5: "POLYCARBONATE",
6: "ACRYLIC",
7: "PET"
}


@dataclass
class MaterialBulkProperties:
name: str
display_name: str
version: str
conductivity: float
youngs_modulus: float
poissons_ratio: float
elasticity: float
moisture_properties: dict
76 changes: 76 additions & 0 deletions pywincalc/optical.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
from pydantic.dataclasses import dataclass
from enum import Enum

from pywincalc.standard import CalculationStandardName


class OpticalDataType(Enum):
DISCRETE = "Discrete"
BAND = "Band"


class AngularResolutionType(Enum):
DIRECT = "Direct"
DIRECT_DIFFUSE = "Direct / Diffuse"
DIFFUSE_DIFFUSE = "Diffuse / Diffuse"
BSDF = "BSDF"


INCIDENCE_ANGULAR_RESOLUTION_TYPES = [
AngularResolutionType.DIRECT,
AngularResolutionType.BSDF
]

OUTGOING_ANGULAR_RESOLUTION_TYPES = [
AngularResolutionType.DIRECT,
AngularResolutionType.BSDF
]


@dataclass
class OpticalProperties:
optical_data_type: str = OpticalDataType.DISCRETE.name
incidence_angular_resolution_type: str = AngularResolutionType.DIRECT.name
outgoing_angular_resolution_type: str = AngularResolutionType.DIRECT.name
optical_data: dict = None


@dataclass
class IntegratedSpectralAveragesSummary:
standard: CalculationStandardName

tf_sol: float = 0
tb_sol: float = 0
rf_sol: float = 0
rb_sol: float = 0

tf_vis: float = 0
tb_vis: float = 0
rf_vis: float = 0
rb_vis: float = 0

tf_tdw: float = 0
tf_tuv: float = 0
tf_spf: float = 0
tf_tkr: float = 0

tf_ciex: float = 0
tf_ciey: float = 0
tf_ciez: float = 0
tf_r: float = 0
tf_g: float = 0
tf_b: float = 0

rf_ciex: float = 0
rf_ciey: float = 0
rf_ciez: float = 0
rf_r: float = 0
rf_g: float = 0
rf_b: float = 0

rb_ciex: float = 0
rb_ciey: float = 0
rb_ciez: float = 0
rb_r: float = 0
rb_g: float = 0
rb_b: float = 0
100 changes: 100 additions & 0 deletions pywincalc/product.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
from pydantic.dataclasses import dataclass
from enum import Enum
from typing import List, Dict
from decimal import *
from pydantic.dataclasses import dataclass

from pywincalc.material import MaterialBulkProperties
from pywincalc.optical import OpticalProperties, IntegratedSpectralAveragesSummary


class TokenType(Enum):
PUBLISHED = "PUBLISHED"
UNDEFINED = "UNDEFINED"
PROPOSED = "PROPOSED"
INTRAGROUP = "INTRAGROUP"


class ProductType(Enum):
GLAZING = "GLAZING"
SHADING = "SHADING"
MATERIAL = "MATERIAL"


class ProductSubtype(Enum):
# glazing types
MONOLITHIC = "MONOLITHIC"
LAMINATE = "LAMINATE"
INTERLAYER = "INTERLAYER"
EMBEDDED_COATING = "EMBEDDED_COATING"
COATED = "COATED"
COATING = "COATING"
APPLIED_FILM = "APPLIED_FILM"
FILM = "FILM"
FRITTED_GLASS = "FRITTED_GLASS"
CHROMOGENIC = "CHROMOGENIC"

# shading and material types
VENETIAN_BLIND = "VENETIAN_BLIND"
DIFFUSING_SHADE = "DIFFUSING_SHADE"
WOVEN_SHADE = "WOVEN_SHADE"
VERTICAL_LOUVER = "VERTICAL_LOUVER"
PERFORATED_SCREEN = "PERFORATED_SCREEN"
CELLULAR_SHADE = "CELLULAR_SHADE"

# other
OTHER = "OTHER"
UNKNOWN = "UNKNOWN"


@dataclass
class PhysicalProperties:
thickness: float = None
tir_front: float = None
tir_back: float = 0.0
emissivity_front: float = None
emissivity_back: float = None
permeability_factor: float = None
optical_openness: float = None
bulk_properties_override: dict = None
is_specular: bool = True
optical_properties: OpticalProperties = None


@dataclass
class Product:
type: ProductType
subtype: ProductSubtype
product_id: int = None
token: str = None
token_type: TokenType = None
data_file_name: str = None
data_file_type: str = None
# This product can be decomposed into parts
deconstructable: bool = False
# This product is a 'reference' product, meaning it's sole purpose is
# to get a child product into the IGSDB using reference substrates.
# This is method of submittal is only valid for APPLIED_FILM and LAMINATE products.
reference: bool = False
igsdb_version: str = None
coated_side: str = None
coating_name: str = None
owner: str = None
manufacturer: str = None
coating_id: int = None
product_description: Dict = None
igsdb_checksum: int = None
material: str = None
published_date: str = None
hidden: bool = None
active: bool = True
appearance: str = None
acceptance: str = None
nfrc_id: str = None
composition: list = None
material_bulk_properties: MaterialBulkProperties = None
integrated_spectral_averages_summaries: List[IntegratedSpectralAveragesSummary] = None
physical_properties: PhysicalProperties = None
extra_data: dict = None
created_at: str = None
updated_at: str = None
17 changes: 17 additions & 0 deletions pywincalc/standard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from pydantic.dataclasses import dataclass
from enum import Enum


class CalculationStandardName(Enum):
NFRC = "NFRC"
CES = "CES"


class CalculationStandardMethodTypes(Enum):
SOLAR = "Solar"
PHOTOPIC = "Photopic"
THERMAL_IR = "Thermal IR"
TUV = "TUV"
SPF = "SPF"
TDW = "TDW"
TKR = "TKR"
Binary file added pywincalc_idea.sdxml
Binary file not shown.
14 changes: 11 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import platform
import subprocess

from setuptools import setup, Extension
from setuptools import setup, Extension, find_packages
from setuptools.command.build_ext import build_ext
from distutils.version import LooseVersion

Expand Down Expand Up @@ -41,7 +41,7 @@ def build_extension(self, ext):

if platform.system() == "Windows":
cmake_args += ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format(cfg.upper(), extdir)]
if sys.maxsize > 2**32:
if sys.maxsize > 2 ** 32:
cmake_args += ['-A', 'x64']
build_args += ['--', '/m']
else:
Expand All @@ -56,10 +56,18 @@ def build_extension(self, ext):
subprocess.check_call(['cmake', ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env)
subprocess.check_call(['cmake', '--build', '.'] + build_args, cwd=self.build_temp)


setup(
name='pywincalc',
version='2.1.0',
ext_modules=[CMakeExtension('pywincalc')],
long_description='',
# tell setuptools to look for any packages under 'src'
packages=find_packages('src'),
# tell setuptools that all packages will be under the 'src' directory
# and nowhere else
package_dir={'': 'src'},
ext_modules=[CMakeExtension('pywincalc/pywincalc')],
extras_require={"test": "pytest"},
cmdclass=dict(build_ext=CMakeBuild),
zip_safe=False,
)
File renamed without changes.
3 changes: 3 additions & 0 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from _pywincalc import *


Loading

0 comments on commit 99bf5ed

Please sign in to comment.