def setObjectText(self, strng): """ TOWRITE :param `strng`: TOWRITE :type `strng`: QString """ self.objText = strng textPath = QPainterPath() font = QFont() font.setFamily(self.objTextFont) font.setPointSizeF(self.objTextSize) font.setBold(self.objTextBold) font.setItalic(self.objTextItalic) font.setUnderline(self.objTextUnderline) font.setStrikeOut(self.objTextStrikeOut) font.setOverline(self.objTextOverline) textPath.addText(0., 0., font, strng) # Translate the path based on the justification. jRect = textPath.boundingRect() # QRectF if self.objTextJustify == "Left": textPath.translate(-jRect.left(), 0) elif self.objTextJustify == "Center": textPath.translate(-jRect.center().x(), 0) elif self.objTextJustify == "Right": textPath.translate(-jRect.right(), 0) elif self.objTextJustify == "Aligned": pass # TODO: TextSingleObject Aligned Justification elif self.objTextJustify == "Middle": textPath.translate(-jRect.center()) elif self.objTextJustify == "Fit": pass # TODO: TextSingleObject Fit Justification elif self.objTextJustify == "Top Left": textPath.translate(-jRect.topLeft()) elif self.objTextJustify == "Top Center": textPath.translate(-jRect.center().x(), -jRect.top()) elif self.objTextJustify == "Top Right": textPath.translate(-jRect.topRight()) elif self.objTextJustify == "Middle Left": textPath.translate(-jRect.left(), -jRect.top()/2.0) elif self.objTextJustify == "Middle Center": textPath.translate(-jRect.center().x(), -jRect.top()/2.0) elif self.objTextJustify == "Middle Right": textPath.translate(-jRect.right(), -jRect.top()/2.0) elif self.objTextJustify == "Bottom Left": textPath.translate(-jRect.bottomLeft()) elif self.objTextJustify == "Bottom Center": textPath.translate(-jRect.center().x(), -jRect.bottom()) elif self.objTextJustify == "Bottom Right": textPath.translate(-jRect.bottomRight()) # Backward or Upside Down. if self.objTextBackward or self.objTextUpsideDown: horiz = 1.0 # qreal vert = 1.0 # qreal if self.objTextBackward: horiz = -1.0 if self.objTextUpsideDown: vert = -1.0 flippedPath = QPainterPath() element = QPainterPath.Element P2 = QPainterPath.Element P3 = QPainterPath.Element P4 = QPainterPath.Element for i in range(0, textPath.elementCount()): # for(int i = 0; i < textPath.elementCount(); ++i) element = textPath.elementAt(i) if element.isMoveTo(): flippedPath.moveTo(horiz * element.x, vert * element.y) elif element.isLineTo(): flippedPath.lineTo(horiz * element.x, vert * element.y) elif element.isCurveTo(): # start point P1 is not needed P2 = textPath.elementAt(i) # control point P3 = textPath.elementAt(i + 1) # control point P4 = textPath.elementAt(i + 2) # end point flippedPath.cubicTo(horiz * P2.x, vert * P2.y, horiz * P3.x, vert * P3.y, horiz * P4.x, vert * P4.y) objTextPath = flippedPath else: objTextPath = textPath # Add the grip point to the shape path. gripPath = objTextPath # QPainterPath gripPath.connectPath(objTextPath) gripPath.addRect(-0.00000001, -0.00000001, 0.00000002, 0.00000002) self.setObjectPath(gripPath)
def setObjectText(self, strng): """ TOWRITE :param `strng`: TOWRITE :type `strng`: QString """ self.objText = strng textPath = QPainterPath() font = QFont() font.setFamily(self.objTextFont) font.setPointSizeF(self.objTextSize) font.setBold(self.objTextBold) font.setItalic(self.objTextItalic) font.setUnderline(self.objTextUnderline) font.setStrikeOut(self.objTextStrikeOut) font.setOverline(self.objTextOverline) textPath.addText(0., 0., font, strng) # Translate the path based on the justification. jRect = textPath.boundingRect() # QRectF if self.objTextJustify == "Left": textPath.translate(-jRect.left(), 0) elif self.objTextJustify == "Center": textPath.translate(-jRect.center().x(), 0) elif self.objTextJustify == "Right": textPath.translate(-jRect.right(), 0) elif self.objTextJustify == "Aligned": pass # TODO: TextSingleObject Aligned Justification elif self.objTextJustify == "Middle": textPath.translate(-jRect.center()) elif self.objTextJustify == "Fit": pass # TODO: TextSingleObject Fit Justification elif self.objTextJustify == "Top Left": textPath.translate(-jRect.topLeft()) elif self.objTextJustify == "Top Center": textPath.translate(-jRect.center().x(), -jRect.top()) elif self.objTextJustify == "Top Right": textPath.translate(-jRect.topRight()) elif self.objTextJustify == "Middle Left": textPath.translate(-jRect.left(), -jRect.top() / 2.0) elif self.objTextJustify == "Middle Center": textPath.translate(-jRect.center().x(), -jRect.top() / 2.0) elif self.objTextJustify == "Middle Right": textPath.translate(-jRect.right(), -jRect.top() / 2.0) elif self.objTextJustify == "Bottom Left": textPath.translate(-jRect.bottomLeft()) elif self.objTextJustify == "Bottom Center": textPath.translate(-jRect.center().x(), -jRect.bottom()) elif self.objTextJustify == "Bottom Right": textPath.translate(-jRect.bottomRight()) # Backward or Upside Down. if self.objTextBackward or self.objTextUpsideDown: horiz = 1.0 # qreal vert = 1.0 # qreal if self.objTextBackward: horiz = -1.0 if self.objTextUpsideDown: vert = -1.0 flippedPath = QPainterPath() element = QPainterPath.Element P2 = QPainterPath.Element P3 = QPainterPath.Element P4 = QPainterPath.Element for i in range(0, textPath.elementCount( )): # for(int i = 0; i < textPath.elementCount(); ++i) element = textPath.elementAt(i) if element.isMoveTo(): flippedPath.moveTo(horiz * element.x, vert * element.y) elif element.isLineTo(): flippedPath.lineTo(horiz * element.x, vert * element.y) elif element.isCurveTo(): # start point P1 is not needed P2 = textPath.elementAt(i) # control point P3 = textPath.elementAt(i + 1) # control point P4 = textPath.elementAt(i + 2) # end point flippedPath.cubicTo(horiz * P2.x, vert * P2.y, horiz * P3.x, vert * P3.y, horiz * P4.x, vert * P4.y) objTextPath = flippedPath else: objTextPath = textPath # Add the grip point to the shape path. gripPath = objTextPath # QPainterPath gripPath.connectPath(objTextPath) gripPath.addRect(-0.00000001, -0.00000001, 0.00000002, 0.00000002) self.setObjectPath(gripPath)
def loadFile(self, fileName): """ TOWRITE :param `fileName`: TOWRITE :type `fileName`: QString :rtype: bool """ qDebug("MdiWindow loadFile()") tmpColor = self.getCurrentColor() # QRgb file = QFile(fileName) if not file.open(QFile.ReadOnly | QFile.Text): QMessageBox.warning( self, self.tr("Error reading file"), self.tr("Cannot read file %s:\n%s." % (fileName, file.errorString())) ) return False QApplication.setOverrideCursor(Qt.WaitCursor) ext = self.fileExtension(fileName) # QString qDebug("ext: %s" % qPrintable(ext)) # Read p = embPattern_create() # EmbPattern* if not p: print("Could not allocate memory for embroidery pattern\n") exit(1) readSuccessful = 0 # int ## QString readError reader = embReaderWriter_getByFileName(qPrintable(fileName)) # EmbReaderWriter* if not reader: readSuccessful = 0 readError = "Unsupported read file type: " + fileName qDebug("Unsupported read file type: %s\n" % qPrintable(fileName)) else: readSuccessful = reader.reader(p, qPrintable(fileName)) if not readSuccessful: readError = "Reading file was unsuccessful: " + fileName qDebug("Reading file was unsuccessful: %s\n" % qPrintable(fileName)) ## free(reader) #TODO/REMOVE# not needed in python if not readSuccessful: QMessageBox.warning(self, self.tr("Error reading pattern"), self.tr(qPrintable(readError))) if readSuccessful: embPattern_moveStitchListToPolylines(p) # TODO: Test more stitchCount = embStitchList_count(p.stitchList) # int path = QPainterPath() if p.circleObjList: curCircleObj = p.circleObjList # EmbCircleObjectList* while curCircleObj: c = curCircleObj.circleObj.circle # EmbCircle thisColor = curCircleObj.circleObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) # NOTE: With natives, the Y+ is up and libembroidery Y+ is up, so inverting the Y is NOT needed. self.mainWin.nativeAddCircle(embCircle_centerX(c), embCircle_centerY(c), embCircle_radius(c), False, OBJ_RUBBER_OFF) # TODO: fill curCircleObj = curCircleObj.next if p.ellipseObjList: curEllipseObj = p.ellipseObjList # EmbEllipseObjectList* while curEllipseObj: e = curEllipseObj.ellipseObj.ellipse # EmbEllipse thisColor = curEllipseObj.ellipseObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) # NOTE: With natives, the Y+ is up and libembroidery Y+ is up, so inverting the Y is NOT needed. self.mainWin.nativeAddEllipse(embEllipse_centerX(e), embEllipse_centerY(e), embEllipse_width(e), embEllipse_height(e), 0, False, OBJ_RUBBER_OFF) # TODO: rotation and fill curEllipseObj = curEllipseObj.next if p.lineObjList: curLineObj = p.lineObjList # EmbLineObjectList* while curLineObj: li = curLineObj.lineObj.line # EmbLine thisColor = curLineObj.lineObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) # NOTE: With natives, the Y+ is up and libembroidery Y+ is up, so inverting the Y is NOT needed. self.mainWin.nativeAddLine(embLine_x1(li), embLine_y1(li), embLine_x2(li), embLine_y2(li), 0, OBJ_RUBBER_OFF) # TODO: rotation curLineObj = curLineObj.next if p.pathObjList: # TODO: This is unfinished. It needs more work curPathObjList = p.pathObjList # EmbPathObjectList* while curPathObjList: pathPath = QPainterPath() curPointList = curPathObjList.pathObj.pointList # EmbPointList* thisColor = curPathObjList.pathObj.color # EmbColor if curPointList: pp = curPointList.point # EmbPoint pathPath.moveTo(embPoint_x(pp), -embPoint_y(pp)) # NOTE: Qt Y+ is down and libembroidery Y+ is up, so inverting the Y is needed. curPointList = curPointList.next while curPointList: pp = curPointList.point # EmbPoint pathPath.lineTo(embPoint_x(pp), -embPoint_y(pp)) # NOTE: Qt Y+ is down and libembroidery Y+ is up, so inverting the Y is needed. curPointList = curPointList.next loadPen = QPen(qRgb(thisColor.r, thisColor.g, thisColor.b)) loadPen.setWidthF(0.35) loadPen.setCapStyle(Qt.RoundCap) loadPen.setJoinStyle(Qt.RoundJoin) obj = PathObject(0, 0, pathPath, loadPen.color().rgb()) # PathObject* obj.setObjectRubberMode(OBJ_RUBBER_OFF) self.gscene.addItem(obj) curPathObjList = curPathObjList.next if p.pointObjList: curPointObj = p.pointObjList # EmbPointObjectList* while curPointObj: po = curPointObj.pointObj.point # EmbPoint thisColor = curPointObj.pointObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) # NOTE: With natives, the Y+ is up and libembroidery Y+ is up, so inverting the Y is NOT needed. self.mainWin.nativeAddPoint(embPoint_x(po), embPoint_y(po)) curPointObj = curPointObj.next if p.polygonObjList: curPolygonObjList = p.polygonObjList # EmbPolygonObjectList* while curPolygonObjList: polygonPath = QPainterPath() firstPoint = False # bool startX = 0; startY = 0 # qreal x = 0; y = 0 # qreal curPointList = curPolygonObjList.polygonObj.pointList # EmbPointList* thisColor = curPolygonObjList.polygonObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) while curPointList: pp = curPointList.point # EmbPoint x = embPoint_x(pp) y = -embPoint_y(pp) # NOTE: Qt Y+ is down and libembroidery Y+ is up, so inverting the Y is needed. if firstPoint: polygonPath.lineTo(x,y) else: polygonPath.moveTo(x,y) firstPoint = True startX = x startY = y curPointList = curPointList.next polygonPath.translate(-startX, -startY) self.mainWin.nativeAddPolygon(startX, startY, polygonPath, OBJ_RUBBER_OFF) curPolygonObjList = curPolygonObjList.next # NOTE: Polylines should only contain NORMAL stitches. if p.polylineObjList: curPolylineObjList = p.polylineObjList # EmbPolylineObjectList* while curPolylineObjList: polylinePath = QPainterPath() firstPoint = False # bool startX = 0; startY = 0 # qreal x = 0; y = 0 # qreal curPointList = curPolylineObjList.polylineObj.pointList # EmbPointList* thisColor = curPolylineObjList.polylineObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) while curPointList: pp = curPointList.point # EmbPoint x = embPoint_x(pp) y = -embPoint_y(pp) # NOTE: Qt Y+ is down and libembroidery Y+ is up, so inverting the Y is needed. if firstPoint: polylinePath.lineTo(x,y) else: polylinePath.moveTo(x,y) firstPoint = True startX = x startY = y curPointList = curPointList.next polylinePath.translate(-startX, -startY) self.mainWin.nativeAddPolyline(startX, startY, polylinePath, OBJ_RUBBER_OFF) curPolylineObjList = curPolylineObjList.next if p.rectObjList: curRectObj = p.rectObjList # EmbRectObjectList* while curRectObj: r = curRectObj.rectObj.rect # EmbRect thisColor = curRectObj.rectObj.color # EmbColor self.setCurrentColor(qRgb(thisColor.r, thisColor.g, thisColor.b)) # NOTE: With natives, the Y+ is up and libembroidery Y+ is up, so inverting the Y is NOT needed. self.mainWin.nativeAddRectangle(embRect_x(r), embRect_y(r), embRect_width(r), embRect_height(r), 0, False, OBJ_RUBBER_OFF) # TODO: rotation and fill curRectObj = curRectObj.next self.setCurrentFile(fileName) self.mainWin.statusbar.showMessage("File loaded.") stitches = str(stitchCount) # QString: stitches.setNum(stitchCount) if self.mainWin.getSettingsGridLoadFromFile(): # TODO: Josh, provide me a hoop size and/or grid spacing from the pattern. pass QApplication.restoreOverrideCursor() else: #TODO/PORT# warning shown twice?! redundant ?! QApplication.restoreOverrideCursor() QMessageBox.warning(self, self.tr("Error reading pattern"), self.tr("Cannot read pattern")) ## embPattern_free(p) #TODO/REMOVE# not needed in python # Clear the undo stack so it is not possible to undo past this point. self.gview.getUndoStack().clear() self.setCurrentColor(tmpColor) fileWasLoaded = True self.mainWin.setUndoCleanIcon(fileWasLoaded) return fileWasLoaded