blendercam/scripts/addons/fabex/post_processors/format.py

123 wiersze
3.4 KiB
Python

import math
class Format:
def __init__(
self,
number_of_decimal_places=3,
add_leading_zeros=1,
add_trailing_zeros=False,
dp_wanted=True,
add_plus=False,
no_minus=False,
round_down=False,
):
self.number_of_decimal_places = number_of_decimal_places
# fill the start of the number with zeros, so there are at least this number of digits before the decimal point
self.add_leading_zeros = add_leading_zeros
# fill the end of the number with zeros, as defined by "number_of_decimal_places"
self.add_trailing_zeros = add_trailing_zeros
self.dp_wanted = dp_wanted
self.add_plus = add_plus
self.no_minus = no_minus
self.round_down = round_down
def string(self, number):
if number == None:
return "None"
f = float(number) * math.pow(10, self.number_of_decimal_places)
s = format(f, "f")
if self.round_down == False:
if f < 0:
f = f - 0.5
else:
f = f + 0.5
s = format(float(number), "f")
if math.fabs(f) < 1.0:
s = "0"
minus = False
if s[0] == "-":
minus = True
if self.no_minus:
s = s[1:]
dot = s.find(".")
if dot == -1:
before_dp = s
after_dp = ""
else:
before_dp = s[0:dot]
after_dp = s[dot + 1 : dot + 1 + self.number_of_decimal_places]
before_dp = before_dp.zfill(self.add_leading_zeros)
if self.add_trailing_zeros:
for i in range(0, self.number_of_decimal_places - len(after_dp)):
after_dp += "0"
else:
after_dp = after_dp.rstrip("0")
s = ""
if minus == False:
if self.add_plus == True:
s += "+"
s += before_dp
if len(after_dp):
if self.dp_wanted:
s += "."
s += after_dp
return s
class Address:
def __init__(self, text, fmt=Format(), modal=True):
self.text = text
self.fmt = fmt
self.modal = modal
self.str = None
self.previous = None
def set(self, number):
self.str = self.text + self.fmt.string(number)
def write(self, writer):
if self.str == None:
return ""
if self.modal:
if self.str != self.previous:
writer.write(writer.SPACE() + self.str)
self.previous = self.str
else:
writer.write(writer.SPACE() + self.str)
self.str = None
class AddressPlusMinus(Address):
def __init__(self, text, fmt=Format(), modal=True):
Address.__init__(self, text, fmt, modal)
self.str2 = None
self.previous2 = None
def set(self, number, text_plus, text_minus):
Address.set(self, number)
if float(number) > 0.0:
self.str2 = text_plus
else:
self.str2 = text_minus
def write(self, writer):
Address.write(self, writer)
if self.str2 == None:
return ""
if self.modal:
if self.str2 != self.previous2:
writer.write(writer.SPACE() + self.str2)
self.previous2 = self.str2
else:
writer.write(writer.SPACE() + self.str2)
self.str2 = None