forked from youen/assembly_handbook
rasterized image automatic alignment with TechDraw view (wip)
This commit is contained in:
parent
be9ff003e3
commit
14e8aee319
@ -121,7 +121,11 @@ class TechDrawExtensions:
|
|||||||
page.Views = new_views_list
|
page.Views = new_views_list
|
||||||
|
|
||||||
image_file_name = doc.FileName.replace('.FCStd', '') + '_raster/' + view.Name + '.png'
|
image_file_name = doc.FileName.replace('.FCStd', '') + '_raster/' + view.Name + '.png'
|
||||||
self.rasterizeView(view, image_file_name)
|
image_scale = self.rasterizeView(view, image_file_name)
|
||||||
|
image.ImageFile = ""
|
||||||
|
image.Scale = image_scale
|
||||||
|
image.X = view.X #- image_center[0]/10.0*image_scale
|
||||||
|
image.Y = view.Y #+ image_center[1]/10.0*image_scale
|
||||||
image.ImageFile = image_file_name # TODO: see if it's possible to set a relative path
|
image.ImageFile = image_file_name # TODO: see if it's possible to set a relative path
|
||||||
image.recompute()
|
image.recompute()
|
||||||
else:
|
else:
|
||||||
@ -230,6 +234,7 @@ class TechDrawExtensions:
|
|||||||
def rasterizeView(self, view, image_file_name):
|
def rasterizeView(self, view, image_file_name):
|
||||||
from pivy import coin
|
from pivy import coin
|
||||||
import os
|
import os
|
||||||
|
from PIL import Image, ImageDraw, ImageChops
|
||||||
|
|
||||||
print('Rasterizing ' + view.Label + " to " + image_file_name + "...")
|
print('Rasterizing ' + view.Label + " to " + image_file_name + "...")
|
||||||
|
|
||||||
@ -257,10 +262,56 @@ class TechDrawExtensions:
|
|||||||
|
|
||||||
docView.fitAll()
|
docView.fitAll()
|
||||||
|
|
||||||
|
viewVolume = cam.getViewVolume(0.0)
|
||||||
|
|
||||||
docView.saveImage(image_file_name, 4096, 4096, "#ffffff")
|
docView.saveImage(image_file_name, 4096, 4096, "#ffffff")
|
||||||
|
|
||||||
|
def project3dPointToViewport(p3d):
|
||||||
|
YDirection = view.Direction.cross(view.XDirection)
|
||||||
|
sb_offset = viewVolume.projectToScreen(coin.SbVec3f(0,0,0))
|
||||||
|
offset = App.Vector(sb_offset[0], sb_offset[1], 0)
|
||||||
|
#print('offset', offset)
|
||||||
|
p2d = App.Vector(view.XDirection.dot(p3d)/viewVolume.getWidth() + offset.x, YDirection.dot(p3d)/viewVolume.getHeight() + offset.y, 0)
|
||||||
|
return p2d
|
||||||
|
|
||||||
|
p2dA = project3dPointToViewport(App.Vector(0,0,0))
|
||||||
|
p2dB = project3dPointToViewport(view.XDirection)
|
||||||
|
# page_mm = (p2dB.x - p2dA.x) * resX / 100 * PNGscale = viewScale
|
||||||
|
imageScale = view.Scale / (p2dB.x - p2dA.x) / 4096.0 * 10
|
||||||
|
print('imageScale', imageScale)
|
||||||
|
|
||||||
|
with Image.open(image_file_name) as img:
|
||||||
|
original_size = img.size
|
||||||
|
|
||||||
|
bg = Image.new(img.mode, img.size, '#ffffff') # fills an image with the background color
|
||||||
|
diff = ImageChops.difference(img, bg) # diff between the actual image and the background color
|
||||||
|
bbox = diff.getbbox() # finds border size (non-black portion of the image)
|
||||||
|
print(bbox)
|
||||||
|
#image_center = (bbox[0] + (bbox[2] - bbox[0])/2 - img.size[0]/2, bbox[1] + (bbox[3] - bbox[1])/2 - img.size[1]/2)
|
||||||
|
#print(image_center)
|
||||||
|
img = img.crop(bbox)
|
||||||
|
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
|
def debugPoint(p3d):
|
||||||
|
p2d = project3dPointToViewport(p3d)
|
||||||
|
pp = App.Vector(p2d.x * original_size[0] - bbox[0], (1.0-p2d.y) * original_size[1] - bbox[1])
|
||||||
|
#print('pp', pp)
|
||||||
|
|
||||||
|
len = 100
|
||||||
|
draw.line([(pp.x, pp.y-len), (pp.x, pp.y+len)], fill=128, width = 7)
|
||||||
|
draw.line([(pp.x-len, pp.y), (pp.x+len, pp.y)], fill=128, width = 7)
|
||||||
|
|
||||||
|
#debugPoint(App.Vector(-12.5, 37.5, 25.0))
|
||||||
|
#debugPoint(App.Vector(-12.5, -1387.5, 25.0))
|
||||||
|
#debugPoint(App.Vector(131.23702882966705, -655.0000021095163, 145.21130178331268))
|
||||||
|
|
||||||
|
img.save(image_file_name)
|
||||||
|
|
||||||
App.closeDocument(doc.Name)
|
App.closeDocument(doc.Name)
|
||||||
|
|
||||||
|
return imageScale
|
||||||
|
|
||||||
def updateBalloonCursor(self, view):
|
def updateBalloonCursor(self, view):
|
||||||
selected_balloons = []
|
selected_balloons = []
|
||||||
for obj in Gui.Selection.getSelection():
|
for obj in Gui.Selection.getSelection():
|
||||||
@ -406,7 +457,7 @@ class TechDrawExtensions:
|
|||||||
view = balloon.SourceView
|
view = balloon.SourceView
|
||||||
obj = self.getBalloonSourcePart(balloon)
|
obj = self.getBalloonSourcePart(balloon)
|
||||||
|
|
||||||
partDisplayName = self.getPartDisplayName(obj)
|
partDisplayName = 'Inconnu' if obj is None else self.getPartDisplayName(obj)
|
||||||
|
|
||||||
objectCenterView = workbench.techDrawExtensions.computePartCenter(view, obj)
|
objectCenterView = workbench.techDrawExtensions.computePartCenter(view, obj)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user