Source code for pycalculix.environment
"""This module sets the dpi and the paths to gmsh, ccx, and cgx.
Attributes:
DPI (None or float): if high dpi windows 8 monitor value is set, otherwise
value is None.
CCX (str): path to Calculix ccx, the sovler.
CGX (str): path to Calculix cgx, the preprocessor/postprocessor/mesher.
GMSH (str): path to the Gmsh mesher.
"""
import sys # needed to check if 32 or 64 bit interpreter
import os # used to delete files written by cgx
import platform # need this to check for win and do the below dpi fix
import ctypes # needed to see if it's 32-bit and to get correct win version
# http://stackoverflow.com/questions/19128219/detect-windows-8-1-in-python/22325767#22325767
[docs]class OSVERSIONINFOEXW(ctypes.Structure):
"""Returns object w/ attributes that will identify window os version"""
_fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
('dwMajorVersion', ctypes.c_ulong),
('dwMinorVersion', ctypes.c_ulong),
('dwBuildNumber', ctypes.c_ulong),
('dwPlatformId', ctypes.c_ulong),
('szCSDVersion', ctypes.c_wchar*128),
('wServicePackMajor', ctypes.c_ushort),
('wServicePackMinor', ctypes.c_ushort),
('wSuiteMask', ctypes.c_ushort),
('wProductType', ctypes.c_byte),
('wReserved', ctypes.c_byte)]
[docs]def get_version():
"""Get's the OS version. Returns a float of OS_MAJOR.OS_MINOR
"""
os_version = OSVERSIONINFOEXW()
os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
if retcode != 0:
print("Failed to get OS version")
return -1.0
major = str(os_version.dwMajorVersion)
minor = str(os_version.dwMinorVersion)
return float(major+'.'+minor)
[docs]def get_dpi():
"""Returns an int of current DPI for windows or None."""
if platform.system() == 'Windows':
version = get_version()
if version >= 6.2:
# Windows 8.0 is 6.2.9200
# Only run on windows 8 or higher to check high dpi monitors
user32 = ctypes.windll.user32
w_curr = user32.GetSystemMetrics(0)
user32.SetProcessDPIAware()
w_phys = user32.GetSystemMetrics(0)
curr_dpi = round(w_phys*96/w_curr, 0)
from pylab import rcParams
rcParams['figure.dpi'] = curr_dpi
return curr_dpi
else:
return None
[docs]def get_paths():
"""Returns a list of paths to: [ccx, cgx, gmsh]."""
ccx = 'ccx'
cgx = 'cgx'
gmsh = 'gmsh'
return [ccx, cgx, gmsh]
DPI = get_dpi()
CCX, CGX, GMSH = get_paths()