예제 #1
0
 def isValidShape(self):
     if self._coefficient < 0:
         _err(
             translate('Rocket',
                       "For %s transitions the coefficient must be >= 0") %
             self._type)
         return False
     return super().isValidShape()
예제 #2
0
 def isValidShape(self):
     if self._coefficient <= 0 or self._coefficient > 1:
         _err(
             translate(
                 'Rocket',
                 "For %s transitions the coefficient must be in the range (0 < coefficient <= 1)"
             ) % self._type)
         return False
     return super().isValidShape()
예제 #3
0
 def handleEndTag(self, tag, content):
     _tag = tag.lower().strip()
     if _tag == "version":
         if content.strip() not in self._supportedVersions:
             _err("unsupported version '%s'" % content)
             # throw exception
         return
     else:
         super().handleEndTag(tag, content)
예제 #4
0
    def _zInVertex(self, z, vertexes, tolerance):
        if len(vertexes) != 2:
            _err(
                translate('Rocket',
                          "Unable to handle shapes other than lines"))
            return False

        return self._pointOnLine(z, vertexes[0].Point.z - tolerance, vertexes[1].Point.z + tolerance) or \
                self._pointOnLine(z, vertexes[1].Point.z - tolerance, vertexes[0].Point.z + tolerance)
예제 #5
0
 def _sweepLengthFromAngle(self, value):
     theta = _toFloat(value)
     if theta <= -90.0 or theta >= 90.0:
         _err("Sweep angle must be greater than -90 and less than +90")
         return
     theta = math.radians(-1.0 * (theta + 90.0))
     length = self._finForm.heightInput.property(
         "quantity").Value / math.tan(theta)
     self._finForm.sweepLengthInput.setText("%f" % length)
     self._obj.SweepLength = length
예제 #6
0
    def draw(self):
        if not self.isValidShape():
            return

        try:
            self._obj.Shape = self._drawGuide()
            self._obj.Placement = self._placement
        except (ZeroDivisionError, Part.OCCError):
            _err(
                translate('Rocket',
                          "Rail Guide parameters produce an invalid shape"))
            return
예제 #7
0
    def draw(self):
        if not self.isValidShape():
            return

        try:
            if self._railButtonType == RAIL_BUTTON_AIRFOIL:
                self._obj.Shape = self._drawAirfoil()
            else:
                self._obj.Shape = self._drawButton()
            self._obj.Placement = self._placement
        except (ZeroDivisionError, Part.OCCError):
            _err(
                translate('Rocket',
                          "Rail button parameters produce an invalid shape"))
            return
예제 #8
0
    def end(self):
        if self._tag.lower() == "bodytube":
            obj = BodyTube()
        elif self._tag.lower() == "tubecoupler":
            obj = Coupler()
        elif self._tag.lower() == "engineblock":
            obj = EngineBlock()
        elif self._tag.lower() == "launchlug":
            obj = LaunchLug()
        elif self._tag.lower() == "centeringring":
            obj = CenteringRing()
        else:
            _err("Unable to close body tube object for %s" % self._tag)
            return super().end()

        self.setValues(obj)
        self.validate(obj)
        self.persist(obj, self._connection)

        return super().end()
예제 #9
0
    def validate(self):
        super().validate()

        if self._noseType not in [
                TYPE_CONE.lower(),
                TYPE_ELLIPTICAL.lower(),
                TYPE_HAACK.lower(),
                TYPE_OGIVE.lower(),
                TYPE_VON_KARMAN.lower(),
                TYPE_PARABOLA.lower(),
                TYPE_PARABOLIC.lower(),
                TYPE_POWER.lower()
        ]:
            _err("NoseCone: Shape is invalid '%s'" % self._noseType)
            return False

        self.validatePositive(self._outsideDiameter[0],
                              "Outside Diameter invalid")
        self.validateNonNegative(self._shoulderDiameter[0],
                                 "Shoulder Diameter invalid")
        self.validateNonNegative(self._shoulderLength[0],
                                 "Shoulder Length invalid")
        self.validatePositive(self._length[0], "Length invalid")
        if not self._filled:
            self.validatePositive(self._thickness[0], "Thickness invalid")

        self.validateNonEmptyString(
            self._outsideDiameter[1],
            "Outside Diameter Units invalid '%s" % self._outsideDiameter[1])
        self.validateNonEmptyString(
            self._shoulderDiameter[1],
            "Shoulder Diameter Units invalid '%s" % self._shoulderDiameter[1])
        self.validateNonEmptyString(
            self._shoulderLength[1],
            "Shoulder Length Units invalid '%s" % self._shoulderLength[1])
        self.validateNonEmptyString(
            self._length[1], "Length Units invalid '%s" % self._length[1])
        if not self._filled:
            self.validateNonEmptyString(
                self._thickness[1],
                "Thickness Units invalid '%s" % self._thickness[1])
예제 #10
0
    def draw(self):
        if not self.isValidShape():
            return

        edges = None

        try:
            edges = self._drawTubeEdges()
        except (ZeroDivisionError, Part.OCCError):
            _err(
                translate('Rocket',
                          "Body tube parameters produce an invalid shape"))
            return

        if edges is not None:
            try:
                wire = Part.Wire(edges)
                face = Part.Face(wire)
                self._obj.Shape = face.revolve(FreeCAD.Vector(0, 0, 0),
                                               FreeCAD.Vector(1, 0, 0), 360)
                self._obj.Placement = self._placement
            except Part.OCCError:
                _err(
                    translate('Rocket',
                              "Body tube parameters produce an invalid shape"))
                return
        else:
            _err(
                translate('Rocket',
                          "Body tube parameters produce an invalid shape"))
예제 #11
0
    def draw(self):

        if not self.isValidShape():
            return

        self._debugShape = False
        edges = None
        try:
            if self._style == STYLE_SOLID:
                if self._shoulder:
                    edges = self._drawSolidShoulder()
                else:
                    edges = self._drawSolid()
            elif self._style == STYLE_SOLID_CORE:
                if self._shoulder:
                    edges = self._drawSolidShoulderCore()
                else:
                    edges = self._drawSolidCore()
            elif self._style == STYLE_HOLLOW:
                if self._shoulder:
                    edges = self._drawHollowShoulder()
                else:
                    edges = self._drawHollow()
            else:
                if self._shoulder:
                    edges = self._drawCappedShoulder()
                else:
                    edges = self._drawCapped()
        except (ValueError, ZeroDivisionError, Part.OCCError) as ex:
            if self._debugShape:
                raise ex
            _err(
                translate('Rocket',
                          "Transition parameters produce an invalid shape"))
            return

        if edges is not None:
            try:
                if self._debugShape:
                    for edge in edges:
                        Part.show(edge)
                wire = Part.Wire(edges)
                face = Part.Face(wire)
                self._obj.Shape = face.revolve(FreeCAD.Vector(0, 0, 0),
                                               FreeCAD.Vector(1, 0, 0), 360)
                self._obj.Placement = self._placement
            except Part.OCCError as ex:
                if self._debugShape:
                    raise ex
                _err(
                    translate(
                        'Rocket',
                        "Transition parameters produce an invalid shape"))
                return
        else:
            _err(
                translate('Rocket',
                          "Transition parameters produce an invalid shape"))
예제 #12
0
    def draw(self):

        if not self.isValidShape():
            return

        try:
            profiles = self._makeProfiles()
            if profiles is not None and len(profiles) > 0:
                if isinstance(profiles[0], list):
                    # Using a compound instead of a fuse makes drawing much faster, but also leads to
                    # a number of 'BOPAlgo SelfIntersect' errors. Se we stick with the fuse

                    loft = None
                    for profile in profiles:
                        if loft is None:
                            loft = Part.makeLoft(profile, True)
                        else:
                            loft = loft.fuse(Part.makeLoft(profile, True))
                else:
                    loft = Part.makeLoft(profiles, True)

                if loft is not None:
                    mask = self._makeCommon()
                    if mask is not None:
                        loft = loft.common(mask)

                    if self._obj.Ttw:
                        ttw = self._makeTtw()
                        if ttw:
                            loft = loft.fuse(ttw)

                    self._obj.Shape = loft
            self._obj.Placement = self._placement
        except (ZeroDivisionError, Part.OCCError):
            _err(translate('Rocket',
                           "Fin parameters produce an invalid shape"))
            return
예제 #13
0
 def isValidShape(self):
     # Add error checking here
     if self._obj.Ttw:
         if self._obj.TtwOffset >= self._obj.RootChord:
             _err(
                 translate('Rocket',
                           "Ttw offset must be less than the root chord"))
             return False
         if self._obj.TtwLength <= 0:
             _err(translate('Rocket', "Ttw length must be greater than 0"))
             return False
         if self._obj.TtwHeight <= 0:
             _err(translate('Rocket', "Ttw height must be greater than 0"))
             return False
         if self._obj.TtwThickness <= 0:
             _err(
                 translate('Rocket',
                           "Ttw thickness must be greater than 0"))
             return False
     return True
예제 #14
0
    def verifyShape(self, shape):
        if shape is None:
            _err(translate('Rocket', "shape is empty"))
            return False

        if issubclass(type(shape), Part.Compound):
            _err(translate('Rocket', "Compound objects not supported"))
            return False

        # Verify the shape creates a closed face
        face = Part.Face(shape.Wires)
        if not face.isValid():
            _err(translate('Rocket', "Sketch must create a valid face"))
            return False
        return True
예제 #15
0
    def draw(self):
        if not self.isValidShape():
            return

        edges = None

        try:
            if self._style == STYLE_SOLID:
                if self._shoulder:
                    edges = self.drawSolidShoulder()
                else:
                    edges = self.drawSolid()
            elif self._style == STYLE_HOLLOW:
                if self._shoulder:
                    edges = self.drawHollowShoulder()
                else:
                    edges = self.drawHollow()
            else:
                if self._shoulder:
                    edges = self.drawCappedShoulder()
                else:
                    edges = self.drawCapped()
        except (ZeroDivisionError, Part.OCCError):
            _err(
                translate('Rocket',
                          "Nose cone parameters produce an invalid shape"))
            return

        if edges is not None:
            try:
                wire = Part.Wire(edges)
                face = Part.Face(wire)
                self._obj.Shape = face.revolve(FreeCAD.Vector(0, 0, 0),
                                               FreeCAD.Vector(1, 0, 0), 360)
                self._obj.Placement = self._placement
            except Part.OCCError:
                _err(
                    translate('Rocket',
                              "Nose cone parameters produce an invalid shape"))
                return
        else:
            _err(
                translate('Rocket',
                          "Nose cone parameters produce an invalid shape"))
예제 #16
0
    def isValidShape(self):

        # Perform some general validations
        if self._ID < 0:
            _err(
                translate(
                    'Rocket',
                    "Body tube inner diameter must be greater than zero"))
            return False
        if self._OD <= self._ID:
            _err(
                translate(
                    'Rocket',
                    "Body tube outer diameter must be greater than the inner"))
            return False
        if self._length < 0:
            _err(
                translate('Rocket',
                          "Body tube length must be greater than zero"))
            return False

        return True
예제 #17
0
    def isValidShape(self):
        # Perform some general validations
        if self._middleWidth <= 0:
            _err(translate('Rocket', "Middle width must be greater than zero"))
            return False

        if self._topWidth <= self._middleWidth:
            _err(
                translate('Rocket',
                          "Top width must be greater than the middle width"))
            return False

        if self._baseWidth <= self._middleWidth:
            _err(
                translate('Rocket',
                          "Base width must be greater than the middle width"))
            return False

        if self._topThickness <= 0:
            _err(translate('Rocket',
                           "Top thickness must be greater than zero"))
            return False

        if self._baseThickness <= 0:
            _err(
                translate('Rocket',
                          "Base thickness must be greater than zero"))
            return False

        if self._thickness <= (self._topThickness + self._baseThickness):
            _err(
                translate(
                    'Rocket',
                    "Total thickness must be greater than the sum of top and base thickness"
                ))
            return False

        if self._length <= 0:
            _err(translate('Rocket', "Length must be greater than zero"))
            return False

        if self._forwardSweep:
            if (self._forwardSweepAngle <= 0.0) or (self._forwardSweepAngle >=
                                                    90.0):
                _err(
                    translate(
                        'Rocket',
                        "Forward sweep angle must be greater than 0 degrees and less than 90 degrees"
                    ))
                return False

        if self._aftSweep:
            if (self._aftSweepAngle <= 0.0) or (self._aftSweepAngle >= 90.0):
                _err(
                    translate(
                        'Rocket',
                        "Aft sweep angle must be greater than 0 degrees and less than 90 degrees"
                    ))
                return False

        if self._notch:
            if self._notchWidth <= 0:
                _err(
                    translate('Rocket',
                              "Notch width must be greater than zero"))
                return False

            if self._notchWidth >= self._middleWidth:
                _err(
                    translate('Rocket',
                              "Notch width can not exceed the middle width"))
                return False

            if self._notchDepth <= 0:
                _err(
                    translate('Rocket',
                              "Notch depth must be greater than zero"))
                return False

            if self._notchDepth >= self._thickness:
                _err(
                    translate(
                        'Rocket',
                        "Notch depth can not exceed the total thickness"))
                return False

        return True
예제 #18
0
    def isValidShape(self):
        if not super().isValidShape():
            return

        # Perform some general validations
        if self._centerDiameter <= 0:
            _err(
                translate(
                    'Rocket',
                    "Centering ring center diameter must be greater than zero")
            )
            return False

        if self._centerDiameter >= self._diameter:
            _err(
                translate(
                    'Rocket',
                    "Centering ring center diameter must be less than the outer diameter"
                ))
            return False

        if self._step:
            if self._centerDiameter >= self._stepDiameter:
                _err(
                    translate(
                        'Rocket',
                        "Centering ring center diameter must be less than the step diameter"
                    ))
                return False

        if self._notched:
            if self._notchWidth > self._centerDiameter:
                _err(
                    translate(
                        'Rocket',
                        "The notch width must be less than or equal to the center diameter"
                    ))
                return False
            if self._notchWidth <= 0:
                _err(
                    translate('Rocket',
                              "The notch width must be greater than zero"))
                return False
            if self._notchHeight <= 0:
                _err(
                    translate('Rocket',
                              "The notch height must be greater than zero"))
                return False

        if self._holes:
            if self._holeCenter - (self._holeDiameter / 2.0) <= (
                    self._centerDiameter / 2.0):
                _err(
                    translate('Rocket',
                              "Hole extends inside the center diameter"))
                return False

        return True
예제 #19
0
    def isValidShape(self):
        # Perform some general validations
        if self._diameter <= 0:
            _err(
                translate('Rocket',
                          "Outer diameter must be greater than zero"))
            return False

        if self._step:
            if self._stepDiameter <= 0:
                _err(
                    translate('Rocket',
                              "Step diameter must be greater than zero"))
                return False
            if self._stepDiameter >= self._diameter:
                _err(
                    translate(
                        'Rocket',
                        "Step diameter must less than the outer diameter"))
                return False

        if self._holes:
            if self._holeDiameter <= 0:
                _err(
                    translate('Rocket',
                              "Hole diameter must be greater than zero"))
                return False
            if self._holeCenter + (self._holeDiameter / 2.0) >= (
                    self._diameter / 2.0):
                _err(
                    translate('Rocket',
                              "Hole extends outside the outer diameter"))
                return False
            if self._step:
                if self._holeCenter + (self._holeDiameter / 2.0) >= (
                        self._stepDiameter / 2.0):
                    _err(
                        translate('Rocket',
                                  "Hole extends outside the step diameter"))
                    return False

        return True
예제 #20
0
    def isValidShape(self):
        # Perform some general validations
        if self._outerDiameter <= 0:
            _err(
                translate('Rocket',
                          "Outer diameter must be greater than zero"))
            return False
        if self._innerDiameter <= 0:
            _err(
                translate('Rocket',
                          "Inner diameter must be greater than zero"))
            return False
        if self._outerDiameter <= self._innerDiameter:
            _err(
                translate(
                    'Rocket',
                    "Outer diameter must be greater than the inner diameter"))
            return False
        if self._topThickness <= 0:
            _err(translate('Rocket',
                           "Top thickness must be greater than zero"))
            return False
        if self._baseThickness <= 0:
            _err(
                translate('Rocket',
                          "Base thickness must be greater than zero"))
            return False
        if self._thickness <= 0:
            _err(translate('Rocket', "Thickness must be greater than zero"))
            return False
        if self._thickness <= (self._topThickness + self._baseThickness):
            _err(
                translate(
                    'Rocket',
                    "Top and base thickness can not excedd the total thickness"
                ))
            return False

        if self._railButtonType == RAIL_BUTTON_AIRFOIL:
            if self._length <= 0:
                _err(
                    translate(
                        'Rocket',
                        "Length must be greater than zero for airfoil rail buttons"
                    ))
                return False

            if self._length <= self._outerDiameter:
                _err(
                    translate(
                        'Rocket',
                        "Length must be greater than the outer diameter for airfoil rail buttons"
                    ))
                return False

        return True
예제 #21
0
    def isValidShape(self):
        # Perform some general validations
        if self._style in [STYLE_HOLLOW, STYLE_CAPPED]:
            if self._thickness <= 0:
                _err(
                    translate('Rocket',
                              "For %s nose cones thickness must be > 0") %
                    self._style)
                return False
            if self._thickness >= self._radius:
                _err(
                    translate(
                        'Rocket',
                        "Nose cones thickness must be less than the nose cone radius"
                    ))
                return False
        if self._shoulder:
            if self._shoulderLength <= 0:
                _err(translate('Rocket', "Shoulder length must be > 0"))
                return False
            if self._shoulderRadius <= 0:
                _err(translate('Rocket', "Shoulder diameter must be > 0"))
                return False
            if self._shoulderRadius > self._radius:
                _err(
                    translate(
                        'Rocket',
                        "Shoulder diameter can not exceed the nose cone diameter"
                    ))
                return False
            if self._style in [STYLE_HOLLOW, STYLE_CAPPED]:
                if self._shoulderThickness <= 0:
                    _err(
                        translate(
                            'Rocket',
                            "For %s nose cones with a shoulder, shoulder thickness must be > 0"
                        ) % self._style)
                    return False
                if self._shoulderThickness >= self._shoulderRadius:
                    _err(
                        translate(
                            'Rocket',
                            "Shoulder thickness must be less than the shoulder radius"
                        ))
                    return False

        return True
예제 #22
0
 def execute(self, obj):
     _err("No execute method defined for %s" % (self.__class__.__name__))
예제 #23
0
    def isValidShape(self):

        #Perform some general validations
        if self._style in [STYLE_HOLLOW, STYLE_CAPPED]:
            if self._thickness <= 0:
                _err(
                    translate('Rocket',
                              "For %s transitions thickness must be > 0") %
                    self._style)
                return False
            if self._thickness >= self._foreRadius or self._thickness >= self._aftRadius:
                _err(
                    translate(
                        'Rocket',
                        "Transition thickness must be less than the front or back radius"
                    ))
                return False

        elif self._style == STYLE_SOLID_CORE:
            if self._coreRadius >= self._foreRadius or self._coreRadius >= self._aftRadius:
                _err(
                    translate(
                        'Rocket',
                        "Transition core must be less than the front or back diameter"
                    ))
                return False
            if self._foreShoulder:
                if self._coreRadius >= self._foreShoulderRadius:
                    _err(
                        translate(
                            'Rocket',
                            "Transition core must be less than the shoulder diameter"
                        ))
                    return False
            if self._aftShoulder:
                if self._coreRadius >= self._aftShoulderRadius:
                    _err(
                        translate(
                            'Rocket',
                            "Transition core must be less than the shoulder diameter"
                        ))
                    return False

        if self._foreShoulder:
            if self._foreShoulderLength <= 0:
                _err(translate('Rocket',
                               "Forward shoulder length must be > 0"))
                return False
            if self._foreShoulderRadius <= 0:
                _err(
                    translate('Rocket',
                              "Forward shoulder diameter must be > 0"))
                return False
            if self._foreShoulderRadius > self._foreRadius:
                _err(
                    translate(
                        'Rocket',
                        "Forward shoulder diameter can not exceed the transition diameter at the shoulder"
                    ))
                return False
            if self._style in [STYLE_HOLLOW, STYLE_CAPPED]:
                if self._foreShoulderThickness <= 0:
                    _err(
                        translate(
                            'Rocket',
                            "For %s transitions with a shoulder, shoulder thickness must be > 0"
                        ) % self._style)
                    return False
                if self._foreShoulderThickness >= self._foreShoulderRadius:
                    _err(
                        translate(
                            'Rocket',
                            "Shoulder thickness must be less than the shoulder radius"
                        ))
                    return False

        if self._aftShoulder:
            if self._aftShoulderLength <= 0:
                _err(translate('Rocket', "Aft shoulder length must be > 0"))
                return False
            if self._aftShoulderRadius <= 0:
                _err(translate('Rocket', "Aft shoulder diameter must be > 0"))
                return False
            if self._aftShoulderRadius > self._aftRadius:
                _err(
                    translate(
                        'Rocket',
                        "Aft shoulder diameter can not exceed the transition diameter at the shoulder"
                    ))
                return False
            if self._style in [STYLE_HOLLOW, STYLE_CAPPED]:
                if self._aftShoulderThickness <= 0:
                    _err(
                        translate(
                            'Rocket',
                            "For %s transitions with a shoulder, shoulder thickness must be > 0"
                        ) % self._style)
                    return False
                if self._aftShoulderThickness >= self._aftShoulderRadius:
                    _err(
                        translate(
                            'Rocket',
                            "Shoulder thickness must be less than the shoulder radius"
                        ))
                    return False

        return True