diff --git a/cadquery/__init__.py b/cadquery/__init__.py index 0d18affa2..b57485272 100644 --- a/cadquery/__init__.py +++ b/cadquery/__init__.py @@ -21,6 +21,7 @@ ) from .occ_impl import exporters from .occ_impl import importers +from .occ_impl import message # these items are the common implementation @@ -76,4 +77,5 @@ "Selector", "plugins", "Sketch", + "message", ] diff --git a/cadquery/occ_impl/importers/__init__.py b/cadquery/occ_impl/importers/__init__.py index 1ac48bc87..2d232bf40 100644 --- a/cadquery/occ_impl/importers/__init__.py +++ b/cadquery/occ_impl/importers/__init__.py @@ -7,6 +7,8 @@ from ... import cq from ..shapes import Shape from .dxf import _importDXF +from .. import message +from ...utils import cqmultimethod as multimethod RAD2DEG = 360.0 / (2 * pi) @@ -60,19 +62,40 @@ def importBrep(fileName: str) -> "cq.Workplane": return cq.Workplane("XY").newObject([shape]) -# Loads a STEP file into a CQ.Workplane object -def importStep(fileName: str) -> "cq.Workplane": +def readStep(fileName: str) -> STEPControl_Reader: """ - Accepts a file name and loads the STEP file into a cadquery Workplane + Read STEP file, return STEPControl_Reader - :param fileName: The path and name of the STEP file to be imported + :param fileName: The path and name of the STEP file """ - - # Now read and return the shape reader = STEPControl_Reader() readStatus = reader.ReadFile(fileName) if readStatus != OCP.IFSelect.IFSelect_RetDone: raise ValueError("STEP File could not be loaded") + return reader + + +@multimethod +def importStep(fileName: str) -> "cq.Workplane": + """ + Accepts a file name and loads the STEP file into a cadquery Workplane + + :param fileName: The path and name of the STEP file to be imported + """ + + return importStep(readStep(fileName)) + + +@importStep.register +def importStep(reader: STEPControl_Reader) -> "cq.Workplane": + """ + Import STEP given a STEPControl_Reader. + + :param reader: STEPControl_Reader with loaded file + """ + if reader.WS().LoadedFile() == "": + raise ValueError("STEP reader has no loaded file") + for i in range(reader.NbRootsForTransfer()): reader.TransferRoot(i + 1) diff --git a/cadquery/occ_impl/message.py b/cadquery/occ_impl/message.py new file mode 100644 index 000000000..392fa45c9 --- /dev/null +++ b/cadquery/occ_impl/message.py @@ -0,0 +1,53 @@ +from enum import Enum + +from OCP.Message import ( + Message_Gravity, + Message_Messenger, + Message_PrinterToReport, + Message_Report, +) +from OCP.Message import Message as OCPMessage + + +class Level(Enum): + trace = Message_Gravity.Message_Trace + info = Message_Gravity.Message_Info + warning = Message_Gravity.Message_Warning + alarm = Message_Gravity.Message_Alarm + fail = Message_Gravity.Message_Fail + + +class Message: + + messenger: Message_Messenger = OCPMessage.DefaultMessenger_s() + + @staticmethod + def add_report() -> Message_Report: + """ + Add a report + """ + printer = Message_PrinterToReport() + report = printer.Report() + Message.messenger.AddPrinter(printer) + return report + + @staticmethod + def add_log(fname): + pass + + @staticmethod + def set_trace_level(level=Level.info): + """ + Set trace level used for filtering OCCT messages. + + Changes the trace level of the default printer. + + :param level: trace level + """ + for printer in Message.messenger.Printers(): + printer.SetTraceLevel(level.value) + break + + +# change default OCCT logging level +Message.set_trace_level(Level.fail) diff --git a/cadquery/occ_impl/shapes.py b/cadquery/occ_impl/shapes.py index 9e312259b..1be5dad7a 100644 --- a/cadquery/occ_impl/shapes.py +++ b/cadquery/occ_impl/shapes.py @@ -29,12 +29,6 @@ from ..utils import cqmultimethod as multimethod -# change default OCCT logging level -from OCP.Message import Message, Message_Gravity - -for printer in Message.DefaultMessenger_s().Printers(): - printer.SetTraceLevel(Message_Gravity.Message_Fail) - import OCP.TopAbs as ta # Topology type enum import OCP.GeomAbs as ga # Geometry type enum