Punto de restauración.

This commit is contained in:
2025-07-16 08:58:35 +02:00
parent d009cb7695
commit e1e1441892
9 changed files with 599 additions and 579 deletions

View File

@@ -26,6 +26,7 @@ import Part
if FreeCAD.GuiUp:
import FreeCADGui, os
from PySide import QtCore, QtGui
from PySide.QtGui import QListWidgetItem
from PySide.QtCore import QT_TRANSLATE_NOOP
else:
# \cond
@@ -62,7 +63,8 @@ class _PVPlantPlacementTaskPanel:
'''The editmode TaskPanel for Schedules'''
def __init__(self, obj=None):
self.Terrain = PVPlantSite.get().Terrain
self.site = PVPlantSite.get()
self.Terrain = self.site.Terrain
self.FrameSetups = None
self.PVArea = None
self.Area = None
@@ -77,8 +79,10 @@ class _PVPlantPlacementTaskPanel:
self.form.setWindowIcon(QtGui.QIcon(os.path.join(PVPlantResources.DirIcons, "way.svg")))
self.form.buttonPVArea.clicked.connect(self.addPVArea)
self.form.buttonAddFrame.clicked.connect(self.addFrame)
self.form.buttonRemoveFrame.clicked.connect(self.removeFrame)
#self.form.buttonAddFrame.clicked.connect(self.addFrames)
#self.form.buttonRemoveFrame.clicked.connect(self.removeFrame)
self.addFrames()
def addPVArea(self):
sel = FreeCADGui.Selection.getSelection()
@@ -86,21 +90,10 @@ class _PVPlantPlacementTaskPanel:
self.PVArea = sel[0]
self.form.editPVArea.setText(self.PVArea.Label)
def addFrame(self):
from Mechanical.Frame import PVPlantFrame
selection = FreeCADGui.Selection.getSelection()
self.FrameSetup = selectionFilter(selection, PVPlantFrame.TrackerSetup)
if len(selection) > 0:
items = []
for x in range(self.form.listFrameSetups.count()):
items.append(self.form.listFrameSetups.item(x).text())
if not (selection[0].Name in items):
self.form.listFrameSetups.addItem(selection[0].Name)
def removeFrame(self):
''' remove select item from list '''
self.form.listFrameSetups.takeItem(self.form.listFrameSetups.currentRow())
def addFrames(self):
for frame_setup in self.site.Frames:
list_item = QListWidgetItem(frame_setup.Name, self.form.listFrameSetups)
list_item.setCheckState(QtCore.Qt.Checked)
def createFrameFromPoints(self, dataframe):
from Mechanical.Frame import PVPlantFrame
@@ -111,6 +104,12 @@ class _PVPlantPlacementTaskPanel:
MechanicalGroup.Label = "Frames"
FreeCAD.ActiveDocument.MechanicalGroup.addObject(MechanicalGroup)
if self.form.cbSubfolders.checked:
group = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroup", self.PVArea.Label)
group.Label = self.PVArea.Label
MechanicalGroup.addObject(group)
MechanicalGroup = group
placements = dataframe["placement"].tolist()
types = dataframe["type"].tolist()
frames = []
@@ -121,33 +120,30 @@ class _PVPlantPlacementTaskPanel:
newrack.Placement = placements[idx]
MechanicalGroup.addObject(newrack)
frames.append(newrack)
if self.PVArea.Name.startswith("FrameArea"):
self.PVArea.Frames = frames
# TODO: else
def getProjected(self, shape):
""" returns projected edges from a shape and a direction """
if shape.BoundBox.ZLength == 0:
edges = shape.Edges
return Part.Face(Part.Wire(edges))
else:
from Utils import PVPlantUtils as utils
wire = utils.simplifyWire(utils.getProjected(shape))
if wire.isClosed():
wire = wire.removeSplitter()
return Part.Face(wire)
return Part.Face(Part.Wire(shape.Edges))
from Utils import PVPlantUtils as utils
wire = utils.simplifyWire(utils.getProjected(shape))
return Part.Face(wire.removeSplitter()) if wire.isClosed() else Part.Face(wire)
def calculateWorkingArea(self):
self.Area = self.getProjected(self.PVArea.Shape)
tmp = FreeCAD.ActiveDocument.findObjects(Name="ExclusionArea")
if len(tmp):
ProhibitedAreas = list()
for obj in tmp:
exclusion_areas = FreeCAD.ActiveDocument.findObjects(Name="ExclusionArea")
if exclusion_areas:
prohibited_faces = []
for obj in exclusion_areas:
face = self.getProjected(obj.Base.Shape)
if face.isValid():
ProhibitedAreas.append(face)
self.Area = self.Area.cut(ProhibitedAreas)
prohibited_faces.append(face)
self.Area = self.Area.cut(prohibited_faces)
def getAligments(self):
# TODO: revisar todo esto: -----------------------------------------------------------------
@@ -280,104 +276,6 @@ class _PVPlantPlacementTaskPanel:
placeRegion(df)
return df
"""def placeonregion_old(frames): # old
for colnum, col in enumerate(frames):
groups = list()
groups.append([col[0]])
for i in range(1, len(col)):
group = groups[-1]
long = (col[i].sub(group[-1])).Length
long -= width
if long <= dist:
group.append(col[i])
else:
groups.append([col[i]])
for group in groups:
points = list()
points.append(group[0].sub(vec1))
for ind in range(0, len(group) - 1):
points.append((group[ind].sub(vec1) + group[ind + 1].add(vec1)) / 2)
points.append(group[-1].add(vec1))
points3D = list()
'''
# v0
for ind in range(len(points) - 1):
line = Part.LineSegment(points[ind], points[ind + 1])
tmp = terrain.makeParallelProjection(line.toShape(), FreeCAD.Vector(0, 0, 1))
if len(tmp.Vertexes) > 0:
if ind == 0:
points3D.append(tmp.Vertexes[0].Point)
points3D.append(tmp.Vertexes[-1].Point)
'''
# V1
if type == 0: # Mesh:
import MeshPart as mp
for point in points:
point3D = mp.projectPointsOnMesh([point, ], terrain, FreeCAD.Vector(0, 0, 1))
if len(point3D) > 0:
points3D.append(point3D[0])
else: # Shape:
line = Part.LineSegment(points[0], points[-1])
tmp = terrain.makeParallelProjection(line.toShape(), FreeCAD.Vector(0, 0, 1))
if len(tmp.Vertexes) > 0:
tmppoints = [ver.Point for ver in tmp.Vertexes]
if mode == 1: # mode = normal
for point in points:
'''# OPTION 1:
line = Part.Line(point, point + FreeCAD.Vector(0, 0, 10))
for i in range(len(tmppoints) - 1):
seg = Part.LineSegment(tmppoints[i], tmppoints[i + 1])
inter = line.intersect(seg)
print(inter)
if len(inter) > 0:
points3D.append(FreeCAD.Vector(inter[0].X, inter[0].Y, inter[0].Z))
'''
# OPTION 2:
plane = Part.Plane(point, self.Dir)
for i in range(len(tmppoints) - 1):
seg = Part.LineSegment(tmppoints[i], tmppoints[i + 1])
inter = plane.intersect(seg)
if len(inter) > 0:
if len(inter[0]):
inter = inter[0]
points3D.append(FreeCAD.Vector(inter[0].X, inter[0].Y, inter[0].Z))
break
else: # TODO: mode = Trend
# TODO: check:
from scipy import stats
xx = list()
yy = list()
zz = list()
for pts in tmppoints:
xx.append(pts.x)
yy.append(pts.y)
zz.append(pts.z)
slope, intercept, r, p, std_err = stats.linregress(yy, zz)
def myfunc(x):
return slope * x + intercept
x = list()
x.append(yy[0])
x.append(yy[-1])
newzz = list(map(myfunc, x))
points3D.append(FreeCAD.Vector(xx[0], yy[0], newzz[0]))
points3D.append(FreeCAD.Vector(xx[-1], yy[-1], newzz[1]))
for ind in range(0, len(points3D) - 1):
pl = FreeCAD.Placement()
vec = points3D[ind] - points3D[ind + 1]
pl.Base = FreeCAD.Vector(group[ind])
p = (points3D[ind] + points3D[ind + 1]) / 2
pl.Base.z = p.z
rot = FreeCAD.Rotation(FreeCAD.Vector(-1, 0, 0), vec)
pl.Rotation = FreeCAD.Rotation(rot.toEuler()[0], rot.toEuler()[1], 0)
placements.append(pl)
return placements"""
def isInside(self, frame, point):
if self.Area.isInside(point, 10, True):
frame.Placement.Base = point
@@ -542,23 +440,32 @@ class _PVPlantPlacementTaskPanel:
params.SetBool("AutoSaveEnabled", False)
FreeCAD.ActiveDocument.RecomputesFrozen = True
items = []
for x in range(self.form.listFrameSetups.count()):
items.append(FreeCAD.ActiveDocument.getObject(self.form.listFrameSetups.item(x).text()))
tmpframes = list()
items = [
FreeCAD.ActiveDocument.getObject(item.text())
for i in range(self.form.listFrameSetups.count())
if (item := self.form.listFrameSetups.item(i)).checkState() == QtCore.Qt.Checked
]
"""seen_lengths = set()
tmpframes = []
for frame in sorted(items, key=lambda rack: rack.Length, reverse=True):
found = False
if frame.Length not in seen_lengths:
seen_lengths.add(frame.Length)
tmpframes.append(frame)
'''found = False
for tmp in tmpframes:
if tmp.Length == frame.Length:
found = True
break
if not found:
tmpframes.append(frame)
self.FrameSetups = tmpframes.copy()
longerFrame = self.FrameSetups[0]
tmpframes.append(frame)'''
self.FrameSetups = tmpframes.copy()"""
unique_frames = {frame.Length.Value: frame for frame in items}
self.FrameSetups = sorted(list(unique_frames.values()), key=lambda rack: rack.Length, reverse=True)
self.gap_col = FreeCAD.Units.Quantity(self.form.editGapCols.text()).Value
self.gap_row = FreeCAD.Units.Quantity(self.form.editGapRows.text()).Value + longerFrame.Length.Value
self.gap_row = FreeCAD.Units.Quantity(self.form.editGapRows.text()).Value + self.FrameSetups[0].Length.Value
self.offsetX = FreeCAD.Units.Quantity(self.form.editOffsetHorizontal.text()).Value
self.offsetY = FreeCAD.Units.Quantity(self.form.editOffsetVertical.text()).Value
@@ -581,8 +488,6 @@ class _PVPlantPlacementTaskPanel:
print(" -- Tiempo tardado:", total_time)
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
#return True
# ----------------------------------------------------------------------------------------------------------------------
# function AdjustToTerrain