1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import dxfgrabber
- import cv2
- import numpy as np
- import sys
- #https://gist.github.com/msjamali52/91a96176a1be3313af5d3309cbbf4b06
- """
- def absdiff(num1, num2):
- if num1 <= num2:
- return num2 - num1
- else:
- return num1 - num2
- """
- def getMinXY(shapes):
- minX, minY = 99999, 99999
- for shape in shapes:
- if shape.dxftype == 'LINE':
- minX = min(minX, shape.start[0], shape.end[0])
- minY = min(minY, shape.start[1], shape.end[1])
- elif shape.dxftype == 'ARC':
- minX = min(minX, shape.center[0])
- minY = min(minY, shape.center[1])
- return minX, minY
- def getMaxXY(shapes):
- maxX, maxY = -99999, -99999
- for shape in shapes:
- if shape.dxftype == 'LINE':
- maxX = max(maxX, shape.start[0], shape.end[0])
- maxY = max(maxY, shape.start[1], shape.end[1])
- elif shape.dxftype == 'ARC':
- maxX = max(maxX, shape.center[0])
- maxY = max(maxY, shape.center[1])
- return maxX, maxY
- #Translate x,y values as per fourth quadrant i.e positive x and negative y. Update y value to positive, to be used by opencv axes.
- # shift origin of image by 100 pixels for better clarity of output image
- def getXY(point):
- x, y = point[0], point[1]
- return int(x-minX+100), int(abs(y-maxY)+100)
- dxf = dxfgrabber.readfile("GV_12.DXF")
- shapes = dxf.entities.get_entities()
- minX, minY = getMinXY(shapes)
- maxX, maxY = getMaxXY(shapes)
- #baseX, baseY = absdiff(minX, 0), absdiff(minY, 0)
- #absMaxX, absMaxY = absdiff(maxX, 0), absdiff(maxY, 0)
- print(maxX, maxY)
- print(minX, minY)
- #print(absMaxX, absMaxY)
- #print(baseX, baseY)
- canvas = np.zeros((512,512,3), np.uint8)
- for shape in shapes:
- if shape.dxftype == 'LINE':
- x1, y1 = getXY(shape.start)
- x2, y2 = getXY(shape.end)
- canvas = cv2.line(canvas, (x1,y1), (x2,y2), (255, 0, 255), 1)
- elif shape.dxftype == 'ARC':
- centerX, centerY = getXY(shape.center)
- if (shape.start_angle > 180) and (shape.end_angle < shape.start_angle):
- canvas = cv2.ellipse(canvas, (centerX, centerY), (int(shape.radius), int(shape.radius)), 180, int(shape.start_angle) - 180, 180 + int(shape.end_angle), (0, 0, 255), 1)
- else:
- canvas = cv2.ellipse(canvas, (centerX, centerY), (int(shape.radius), int(shape.radius)), 0, int(360 - shape.start_angle), int(360 - shape.end_angle), (0, 0, 255), 1)
- cv2.imshow('test', canvas)
- cv2.waitKey(50)
- # To save canvas use cv2.imwrite()
- #cv2.imwrite('res.png', canvas)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
|