diff --git a/POWERCAD30/UNITS/form3d.pas b/POWERCAD30/UNITS/form3d.pas index 08872d9..b1429c0 100644 --- a/POWERCAD30/UNITS/form3d.pas +++ b/POWERCAD30/UNITS/form3d.pas @@ -22243,10 +22243,15 @@ var begin if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject <> nil then begin - if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + //Tolik 13/06/2025 -- + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FListID = TF_CAD(TPowerCad(RelatedSCSLine.Owner).Owner).FCADListID then begin - RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); - break; + // + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + begin + RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); + break; + end; end; end; end; @@ -22279,10 +22284,15 @@ var begin if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject <> nil then begin - if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + //Tolik 13/06/2025 -- + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FListID = TF_CAD(TPowerCad(RelatedSCSLine.Owner).Owner).FCADListID then begin - RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); - break; + // + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + begin + RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); + break; + end; end; end; end; @@ -22304,10 +22314,15 @@ var begin if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject <> nil then begin - if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + //13/06/2025 -- Tolik Здесь тоже проверяем на совпадение листа + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FListID = TF_CAD(TPowerCad(RelatedSCSLine.Owner).Owner).FCADListID then begin - RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); - break; + // + if T3DLine(TTreeNode(SCSModelTree.Items[i]).Data).FSCSObject.ID = RelatedSCSLine.ID then + begin + RelatedLine := T3DLine(TTreeNode(SCSModelTree.Items[i]).Data); + break; + end; end; end; end; @@ -22372,12 +22387,17 @@ var begin if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FSCSObject <> nil then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FSCSObject.ID = SCSConn.ID then + //Tolik 13/06/2025 -- проверяем на совпадение листов + if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FListID = TF_CAD(TPowerCad(SCSConn.Owner).Owner).FCADListID then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FisPipeElement then + // + if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FSCSObject.ID = SCSConn.ID then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data) <> xConn then - RelatedPipeConns.Add(T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data)); + if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data).FisPipeElement then + begin + if T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data) <> xConn then + RelatedPipeConns.Add(T3DConnector(TTreeNode(SCSModelTree.Items[j]).Data)); + end; end; end; end; @@ -22987,12 +23007,14 @@ var currCad: TF_CAD; FloorHeight, MinFloorHeight, MaxFloorHeight : Double; ListParams: TListParams; - ParentConnector: T3DConnector; + ParentConnector, RelatedConn: T3DConnector; i: integer; CorrectConn: T3DConnector; ConnNode, ParentNode: TTreeNode; CanGetParent: Boolean; - + NextConnList: TList; + dist: Double; + PointMoveTo: TDoublePoint; begin //Result := True; Result := False; @@ -23059,10 +23081,48 @@ var end; Result := True; + //Предполагаемая точка, куда попадем в результате сдвига + PointMoveTo.x := CorrectConn.FGLPoint.x + dp.x; + PointMoveTo.y := CorrectConn.FGLPoint.y + dp.y; + PointMoveTo.z := CorrectConn.FGLPoint.z + dp.z; + + //Вылет за пределы Када или этажа по высоте + if ((CompareValue(PointMoveTo.y, MinFloorHeight) = -1) or + (CompareValue(PointMoveTo.y, MaxFloorHeight) = 1)) then + begin + Result := False; + exit; + end; + // + //Если элемент трубы проверяем высоты и "наезды" if CorrectConn.FisPipeElement then begin + NextConnList := TList.create; + //если есть присоединенные трассы - проверяем наезды на "соседние коннекторы" + for i := 0 to CorrectConn.FJoinedLinesList.Count - 1 do + begin + if T3dLine(CorrectConn.FJoinedLinesList[i]).FJoinConnector1.FSCSComponID = CorrectConn.FSCSComponID then + NextConnList.Add(T3dLine(CorrectConn.FJoinedLinesList[i]).FJoinConnector2) + else + NextConnList.Add(T3dLine(CorrectConn.FJoinedLinesList[i]).FJoinConnector1); + end; + //проверяем сдвиг относительно всех противоположных коннекторов присоединенных трасс + for i := 0 to NextConnList.Count - 1 do + begin + RelatedConn := T3DConnector(NextConnList[i]); + //Если длина трассы в результате сдвига будет слишком мала - ДВИГАТЬ НИЗЗЯ... + dist := sqrt(sqr(RelatedConn.FGLPoint.x -PointMoveTo.x) + sqr(RelatedConn.FGLPoint.y -PointMoveTo.y) + sqr(RelatedConn.FGLPoint.z -PointMoveTo.z)); + if comparevalue(dist, 0.2) <> 1 then + begin + Result := False; + break; + end; + end; + NextConnList.Free; + if not Result then + exit; end; { @@ -23281,13 +23341,20 @@ begin begin if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FSCSObject <> nil then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FSCSObject.ID = xConn.FSCSObject.ID then + //Tolik 13/06/2025 -- нужно проверять и лист, на котором находится объект, т.к. ID-ки формируются на каждом листе(для фигур) + // для каждого листа, начиная с 1000000...может получиться при модели проекта, что будет насколько коннекторов или трасс + // с одинаковыми айдишниками и получится херня типа мультиселекта тогда, когда он не нужен + if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FListID = xConn.FListID then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FGLObject <> nil then + // + if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FSCSObject.ID = xConn.FSCSObject.ID then begin - if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FGLObject is TGLPipe then + if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FGLObject <> nil then begin - RelatedPipeConns.Add(T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data)); + if T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data).FGLObject is TGLPipe then + begin + RelatedPipeConns.Add(T3DConnector(TTreeNode(SCSModelTree.Items[k]).Data)); + end; end; end; end; @@ -23300,13 +23367,20 @@ begin begin if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FSCSObject <> nil then begin - if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FSCSObject.ID = xConn.FSCSObject.ID then + //Tolik 13/06/2025 -- нужно проверять и лист, на котором находится объект, т.к. ID-ки формируются на каждом листе(для фигур) + // для каждого листа, начиная с 1000000...может получиться при модели проекта, что будет насколько коннекторов или трасс + // с одинаковыми айдишниками и получится херня типа мультиселекта тогда, когда он не нужен + if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FListID = xConn.FListID then begin - if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FGLObject <> nil then + // + if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FSCSObject.ID = xConn.FSCSObject.ID then begin - if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FGLObject is TGLPipe then + if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FGLObject <> nil then begin - RelatedPipeConns.Add(T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data)); + if T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data).FGLObject is TGLPipe then + begin + RelatedPipeConns.Add(T3DConnector(TTreeNode(DuplicateNodeTree.Items[k]).Data)); + end; end; end; end; @@ -23407,7 +23481,10 @@ begin if TglPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes.Count = 2 then begin T3DConnector(RelatedPipeConns[i]).FGLPoint.x := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[0].X; - T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[0].Y - xConn.FZOrder; + //Tolik 13/06/2025 -- + //T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[0].Y - xConn.FZOrder; + T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[0].Y; + // T3DConnector(RelatedPipeConns[i]).FGLPoint.z := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[0].Z; end else @@ -23415,7 +23492,10 @@ begin if TglPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes.Count = 3 then begin T3DConnector(RelatedPipeConns[i]).FGLPoint.x := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[1].X; - T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[1].Y - xConn.FZOrder; + //Tolik 13/06/2025 -- + //T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[1].Y - xConn.FZOrder; + T3DConnector(RelatedPipeConns[i]).FGLPoint.y := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[1].Y; + // T3DConnector(RelatedPipeConns[i]).FGLPoint.z := TGLPipe(T3DConnector(RelatedPipeConns[i]).FGLObject).Nodes[1].Z; end; end; diff --git a/SRC/ARCH/U_Arch3DNew.pas b/SRC/ARCH/U_Arch3DNew.pas index 8e8a8ec..5025e61 100644 --- a/SRC/ARCH/U_Arch3DNew.pas +++ b/SRC/ARCH/U_Arch3DNew.pas @@ -4471,21 +4471,29 @@ var var i, j, TubeCount: Integer; LineCatalog: TSCSCatalog; LineSCSComponent: TSCSComponent; + //Tolik 13/06/2025 -- если будет модель проекта, нужно получать лист каждого объекта отдельно + SCSList: TSCSList; + begin Result := False; TubeCount := 0; - for i := 0 to AConn.JoinedOrtholinesList.Count - 1 do + SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(aConn.Owner).Owner).FCADListID); + if SCSList <> nil then begin - LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLinesList[i]).ID); - if LineCatalog <> nil then + for i := 0 to AConn.JoinedOrtholinesList.Count - 1 do begin - for j := 0 to LineCatalog.ComponentReferences.Count - 1 do + //LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLinesList[i]).ID); + LineCatalog := SCSList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLinesList[i]).ID); + if LineCatalog <> nil then begin - LineSCSComponent := LineCatalog.ComponentReferences[j]; - if LineSCSComponent.ComponentType.SysName = ctsnTube then + for j := 0 to LineCatalog.ComponentReferences.Count - 1 do begin - inc(TubeCount); - break; + LineSCSComponent := LineCatalog.ComponentReferences[j]; + if LineSCSComponent.ComponentType.SysName = ctsnTube then + begin + inc(TubeCount); + break; + end; end; end; end; @@ -4508,6 +4516,7 @@ var CableOffset: Double; ConnSide: integer; exVals: Boolean; + SCSList: TSCSList; //13/06/2025 -- Tolik - текущий лист(если будет модель проекта, чтоб не было "потеряшек" //Tolik 12/11/2021 -- проверка на наличие в точечном объекте элемента трубного соединения function CheckisPipeElement(aConnector: TConnectorObject): Boolean; @@ -4555,27 +4564,35 @@ var begin for i := 0 to aConn.JoinedOrthoLineslist.Count - 1 do begin - LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLineslist[i]).ID); - if LineCatalog <> nil then - if PassedLineList.IndexOf(LineCatalog) = -1 then + //Tolik 13/06/2025 -- + SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(aConn.Owner).Owner).FCADListID); + if SCSList <> nil then + begin + LineCatalog := SCSList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLineslist[i]).ID); + //LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLineslist[i]).ID); + if LineCatalog <> nil then begin - for j := 0 to LineCatalog.ComponentReferences.Count - 1 do + if PassedLineList.IndexOf(LineCatalog) = -1 then begin - LineComponent := LineCatalog.ComponentReferences[j]; - if LineComponent.ComponentType.SysName = ctsnTube then + for j := 0 to LineCatalog.ComponentReferences.Count - 1 do begin - LineList.Add(TOrthoLine(aConn.JoinedOrthoLineslist[i])); - TubeList.Add(LineComponent); - // if isCableComponent(LineComponent) then + LineComponent := LineCatalog.ComponentReferences[j]; + if LineComponent.ComponentType.SysName = ctsnTube then + begin + LineList.Add(TOrthoLine(aConn.JoinedOrthoLineslist[i])); + TubeList.Add(LineComponent); + // if isCableComponent(LineComponent) then + if CableList.IndexOf(LineComponent) = - 1 then + CableList.Add(LineComponent); + break; + end; + if isCableComponent(LineComponent) then if CableList.IndexOf(LineComponent) = - 1 then CableList.Add(LineComponent); - break; end; - if isCableComponent(LineComponent) then - if CableList.IndexOf(LineComponent) = - 1 then - CableList.Add(LineComponent); end; end; + end; end; end; end @@ -4586,28 +4603,37 @@ var Joinedconn := TconnectorObject(aConn.JoinedconnectorsList[j]); for i := 0 to Joinedconn.JoinedOrthoLinesList.Count - 1 do begin - LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(Joinedconn.JoinedOrthoLineslist[i]).ID); - if LineCatalog <> nil then - if PassedLineList.IndexOf(LineCatalog) = -1 then - begin - for k := 0 to LineCatalog.ComponentReferences.Count - 1 do - begin - LineComponent := LineCatalog.ComponentReferences[k]; + //Tolik 13/06/2025 -- + SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(aConn.Owner).Owner).FCADListID); + if SCSList <> nil then + begin + LineCatalog := SCSList.GetCatalogFromReferencesBySCSID(TOrthoLine(aConn.JoinedOrthoLineslist[i]).ID); - if LineComponent.ComponentType.SysName = ctsnTube then + //LineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TOrthoLine(Joinedconn.JoinedOrthoLineslist[i]).ID); + if LineCatalog <> nil then + begin + if PassedLineList.IndexOf(LineCatalog) = -1 then + begin + for k := 0 to LineCatalog.ComponentReferences.Count - 1 do begin - LineList.Add(TOrthoLine(JoinedConn.JoinedOrthoLineslist[i])); - TubeList.Add(LineComponent); - break; - end - else - begin - if isCableComponent(LineComponent) then - if CableList.IndexOf(LineComponent) = - 1 then - CableList.Add(LineComponent); + LineComponent := LineCatalog.ComponentReferences[k]; + + if LineComponent.ComponentType.SysName = ctsnTube then + begin + LineList.Add(TOrthoLine(JoinedConn.JoinedOrthoLineslist[i])); + TubeList.Add(LineComponent); + break; + end + else + begin + if isCableComponent(LineComponent) then + if CableList.IndexOf(LineComponent) = - 1 then + CableList.Add(LineComponent); + end; end; end; end; + end; end; end; end;