Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f7ae62ade2 | |||
| 38ffbc27b7 | |||
| 8cebccf250 | |||
| 17aac0b552 | |||
| c281a329a4 | |||
| ca472716db |
@@ -252,6 +252,9 @@ class Base(_RegisteringBase):
|
||||
if t is None:
|
||||
return value
|
||||
|
||||
if value is None:
|
||||
return None
|
||||
|
||||
if t.__module__ == "typing":
|
||||
origin = getattr(t, "__origin__")
|
||||
t = (
|
||||
@@ -310,7 +313,9 @@ class Base(_RegisteringBase):
|
||||
|
||||
@units.setter
|
||||
def units(self, value: str):
|
||||
self._units = get_units_from_string(value)
|
||||
units = get_units_from_string(value)
|
||||
if units:
|
||||
self._units = units
|
||||
|
||||
def get_member_names(self) -> List[str]:
|
||||
"""Get all of the property names on this object, dynamic or not"""
|
||||
|
||||
@@ -391,15 +391,6 @@ class Mesh(
|
||||
area: float = None
|
||||
volume: float = None
|
||||
|
||||
def transform_to(self, transform: "Transform") -> "Mesh":
|
||||
mesh = Mesh(vertices=transform.apply_to_points_values(self.vertices))
|
||||
for attr in set(self.get_serializable_attributes()) - {"vertices"}:
|
||||
orig_val = getattr(self, attr, None)
|
||||
if orig_val:
|
||||
setattr(mesh, attr, orig_val)
|
||||
|
||||
return mesh
|
||||
|
||||
|
||||
class Surface(Base, speckle_type=GEOMETRY + "Surface"):
|
||||
degreeU: int = None
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from specklepy.logging.exceptions import SpeckleException
|
||||
from warnings import warn
|
||||
from specklepy.logging.exceptions import SpeckleException, SpeckleWarning
|
||||
|
||||
UNITS = ["mm", "cm", "m", "in", "ft", "yd", "mi"]
|
||||
|
||||
@@ -28,6 +29,12 @@ UNITS_ENCODINGS = {
|
||||
|
||||
|
||||
def get_units_from_string(unit: str):
|
||||
if not isinstance(unit, str):
|
||||
warn(
|
||||
f"Invalid units: expected type str but received {type(unit)} ({unit}). Skipping - no units will be set.",
|
||||
SpeckleWarning,
|
||||
)
|
||||
return
|
||||
unit = str.lower(unit)
|
||||
for name, alternates in UNITS_STRINGS.items():
|
||||
if unit in alternates:
|
||||
|
||||
@@ -60,14 +60,19 @@ class BaseObjectSerializer:
|
||||
chunkable = False
|
||||
detach = False
|
||||
|
||||
# skip nulls or props marked to be ignored with "__" or "_"
|
||||
if value is None or prop.startswith(("__", "_")):
|
||||
# skip props marked to be ignored with "__" or "_"
|
||||
if prop.startswith(("__", "_")):
|
||||
continue
|
||||
|
||||
# don't prepopulate id as this will mess up hashing
|
||||
if prop == "id":
|
||||
continue
|
||||
|
||||
# allow serialisation of nulls
|
||||
if value is None:
|
||||
object_builder[prop] = value
|
||||
continue
|
||||
|
||||
# only bother with chunking and detaching if there is a write transport
|
||||
if self.write_transports:
|
||||
dynamic_chunk_match = prop.startswith("@") and re.match(
|
||||
|
||||
@@ -77,6 +77,18 @@ def test_speckle_type_cannot_be_set(base: Base) -> None:
|
||||
assert base.speckle_type == "Base"
|
||||
|
||||
|
||||
def test_setting_units():
|
||||
b = Base(units="foot")
|
||||
assert b.units == "ft"
|
||||
|
||||
with pytest.raises(SpeckleException):
|
||||
b.units = "big"
|
||||
|
||||
b.units = None # invalid args are skipped
|
||||
b.units = 7
|
||||
assert b.units == "ft"
|
||||
|
||||
|
||||
def test_base_of_custom_speckle_type() -> None:
|
||||
b1 = Base.of_type("BirdHouse", name="Tweety's Crib")
|
||||
assert b1.speckle_type == "BirdHouse"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from typing import List
|
||||
import pytest
|
||||
from specklepy.api import operations
|
||||
from specklepy.objects.geometry import Mesh, Point, Vector
|
||||
from specklepy.objects.geometry import Point, Vector
|
||||
from specklepy.objects.other import (
|
||||
Transform,
|
||||
BlockInstance,
|
||||
@@ -43,15 +43,6 @@ def vector_value():
|
||||
return [1, 1, 2]
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def mesh():
|
||||
return Mesh(
|
||||
vertices=[-7, 5, 1, -8, 4, 0, -7, 3, 0, -6, 4, 0],
|
||||
faces=[1, 1, 2, 3, 0],
|
||||
units="feet",
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def transform():
|
||||
"""Translates to [1, 2, 0] and scales z by 0.5"""
|
||||
@@ -138,14 +129,4 @@ def test_transform_serialisation(transform: Transform):
|
||||
serialized = operations.serialize(transform)
|
||||
deserialized = operations.deserialize(serialized)
|
||||
|
||||
assert transform.get_id() == deserialized.get_id()
|
||||
|
||||
|
||||
def test_mesh_transform(mesh: Mesh, transform: Transform):
|
||||
new_mesh = mesh.transform_to(transform)
|
||||
|
||||
assert mesh.vertices != new_mesh.vertices
|
||||
|
||||
new_mesh.vertices = mesh.vertices
|
||||
|
||||
assert mesh.get_id() == new_mesh.get_id()
|
||||
assert transform.get_id() == deserialized.get_id()
|
||||
Reference in New Issue
Block a user