expertcad/SRC/SCSNormBase/U_PortsReIndex.pas
2025-05-12 10:07:51 +03:00

556 lines
15 KiB
ObjectPascal
Raw Blame History

unit U_PortsReIndex;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, siComp, siLngLnk, StdCtrls, ExtCtrls, Buttons, Spin, ComCtrls,
ToolWin, U_SCSComponent, U_BaseCommon;
type
TF_PortsReIndex = class(TForm)
Button1: TButton;
Button2: TButton;
siLangLinked1: TsiLangLinked;
RApplyFor: TRadioGroup;
RComponIndexType: TRadioGroup;
SheetsOrderList: TListBox;
SheetOrderLabel: TLabel;
RComplectIndexType: TRadioGroup;
CheckBox1: TCheckBox;
SpinEdit1: TSpinEdit;
CheckBox2: TCheckBox;
SpinEdit2: TSpinEdit;
CantReidexChildCompon: TCheckBox;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
RComponSortOrder: TRadioGroup;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure RApplyForClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
Function GetComponListFromTreeSelection: TSCSComponents;
destructor Destroy; override;
procedure CantReidexChildComponClick(Sender: TObject);
procedure RComponIndexTypeClick(Sender: TObject);
procedure RComplectIndexTypeClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Procedure StartReindex;
Procedure DisableSheetsOrder;
Procedure EnableSheetsOrder;
Procedure LoadProjLists;
Procedure GetSheetsList(aList: TList);
procedure ReindexComponsPorts(aList: TList);
Procedure RemoveChildsFromList(var aList: TSCSComponents);
end;
var
F_PortsReIndex: TF_PortsReIndex;
CanReindexComplects, ByCreationOrder: Boolean;
LastClickedCompon: TSCSComponent;
currComponPortIndex, currChildComponPortIndex: integer;
ComponType: TComponentType;
Tree_Selection: TSCSComponents;
implementation
uses USCS_Main, U_MAIN, U_ESCadClasess, U_SCSClasses,
U_SCSLists, U_LNG;
{$R *.dfm}
Procedure TF_PortsReIndex.RemoveChildsFromList(var aList: TSCSComponents);
var i: integer;
currCompon, ParentCompon: TSCSComponent;
ComponToRemoveList: TSCSComponents;
begin
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...)
ComponToRemoveList := TSCSComponents.Create(false); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for I := 0 to aList.Count - 1 do
begin
currCompon := aList[i];
if Assigned(currCompon.Parent) then
begin
if currCompon.Parent is TSCSComponent then
begin
ParentCompon := TSCSComponent(currCompon.Parent);
if aList.IndexOf(ParentCompon) <> -1 then
begin
ComponToRemoveList.Add(currCompon);
end;
end;
end;
end;
for i := 0 to ComponToRemoveList.Count - 1 do
aList.Remove(ComponToRemoveList[i]);
ComponToRemoveList.Free;
end;
Function TF_PortsReIndex.GetComponListFromTreeSelection: TSCSComponents;
var Node: TTreeNode;
i: integer;
currCompon: TSCSComponent;
begin
Result := TSCSComponents.Create(false);
for i := 0 to F_ProjMan.Tree_Catalog.SelectionCount - 1 do
begin
Node := F_ProjMan.Tree_Catalog.Selections[i];
if Node <> nil then
begin
if Node.Data <> nil then
begin
if PObjectData(Node.Data).ObjectID > -1 then
currCompon := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferencesList(PObjectData(Node.Data).ListID, PObjectData(Node.Data).ObjectID);
if currCompon <> nil then
begin
if currCompon.IsLine = biFalse then
Result.Add(currCompon);
end;
end;
end;
end;
if Result.Count > 1 then
RemoveChildsFromList(Result);
end;
destructor TF_PortsReIndex.Destroy;
begin
Tree_Selection.Free;
inherited;
end;
Procedure TF_PortsReIndex.GetSheetsList(aList: TList);
var i: integer;
ComponList: TSCSComponents;
CurrCompon: TSCSComponent;
CurrList: TSCSList;
begin
if RApplyFor.Enabled then
begin
case RApplyfor.ItemIndex of
0: begin
for i := 0 to Tree_Selection.Count - 1 do
begin
CurrList := F_ProjMan.GSCSBase.CurrProject.GetListByID(Tree_Selection[i].ListID);
if aList.IndexOf(CurrList) = -1 then
aList.Add(CurrList);
end;
end;
1: aList.Add(F_ProjMan.GSCSBase.CurrProject.CurrList);
2: begin
for i := 0 to SheetsOrderList.Count - 1 do
begin
aList.Add(SheetsOrderList.Items.Objects[i]);
end;
end;
end;
end
else
begin
for i := 0 to Tree_Selection.Count - 1 do
begin
CurrList := F_ProjMan.GSCSBase.CurrProject.GetListByID(Tree_Selection[i].ListID);
if aList.IndexOf(CurrList) = -1 then
aList.Add(CurrList);
end;
end;
end;
procedure TF_PortsReIndex.ReindexComponsPorts(aList: TList);
var i, j, k: integer;
ComponList: TSCSComponents;
CurrList: TSCSList;
ComponIdex, StartChildIndex: Integer;
CurrCompon: TSCSComponent;
Procedure ReindexPorts(aCompon: TSCSComponent; var aIndex: Integer; aIsChild: Boolean = False);
var i: integer;
StartIndex: integer;
begin
// ReindexPorts
for i := 0 to aCompon.Interfaces.Count - 1 do
begin
if aCompon.Interfaces[i].TypeI = itFunctional then
begin
if aCompon.Interfaces[i].IsPort = biTrue then
begin
aCompon.Interfaces[i].NppPort := aIndex;
inc(aIndex);
end;
end;
end;
// ReindexChildPorts
if CanReindexComplects then
begin
for i := 0 to aCompon.ChildComplects.Count - 1 do
begin
if RComplectIndexType.ItemIndex = 0 then
ReindexPorts(aCompon.ChildComplects[i], aIndex, True)
else
begin
StartIndex := 1;
if CheckBox2.Checked then
StartIndex := SpinEdit2.Value;
ReindexPorts(aCompon.ChildComplects[i], aIndex, True)
end;
end;
end;
end;
Procedure SortComponByUserOrder;
var i: integer;
CanSort: Boolean;
begin
if ComponList.Count > 0 then
begin
CanSort := True;
while CanSort do
begin
CanSort := False;
case RComponSortOrder.ItemIndex of
0: begin
for i := 0 to ComponList.Count - 2 do
begin
if ComponList[i].ID > ComponList[i + 1].ID then
begin
CanSort := True;
ComponList.Exchange(i, i + 1);
end;
end;
end;
1: begin
for i := 0 to ComponList.Count - 2 do
begin
if ComponList[i].SortID > ComponList[i + 1].SortID then
begin
CanSort := True;
ComponList.Exchange(i, i + 1);
end;
end;
end;
end;
end;
end;
end;
begin
ComponList := TSCSComponents.Create(false);
for i:= 0 to aList.Count - 1 do
begin
//currList := TSCSList(aList);
currList := TSCSList(aList[i]);
// Select Compons
if RApplyFor.Enabled then
begin
if RApplyFor.ItemIndex = 0 then // by selection
begin
ComponList.Assign(Tree_Selection);
if ComponList.Count > 1 then
begin
for j := ComponList.Count - 1 downto 0 do
begin
if ComponList[j].ListID <> CurrList.ListID then
ComponList.Remove(ComponList[j]);
end;
end;
end
else // by ComponentType
begin
ComponList.Assign(CurrList.ComponentReferences);
for j := ComponList.Count - 1 downto 0 do
begin
if ComponList[j].IsLine = biTrue then
ComponList.Remove(ComponList[j])
else
if ComponList[i].ComponentType.NamePlural <> ComponType.NamePlural then
ComponList.Remove(ComponList[j]);
end;
RemoveChildsFromList(ComponList);
end;
end
else
begin
ComponList.Assign(Tree_Selection);
if ComponList.Count > 1 then
begin
for j := ComponList.Count - 1 downto 0 do
begin
if ComponList[j].ListID <> CurrList.ListID then
ComponList.Remove(ComponList[j]);
end;
end;
end;
SortComponByUserOrder;
for j := 0 to ComponList.Count - 1 do
begin
CurrCompon := ComponList[i];
if RComponIndexType.ItemIndex = 0 then
begin
ReindexPorts(currCompon, currComponPortIndex);
if CanReindexComplects then
begin
for k := 0 to CurrCompon.ChildComplects.Count - 1 do
begin
if RComplectIndexType.ItemIndex = 0 then
begin
ReindexPorts(CurrCompon.ChildComplects[k], currComponPortIndex, True)
end
else
begin
if CheckBox2.Checked then
StartChildIndex := Spinedit2.value
else
StartChildIndex := 1;
ReindexPorts(CurrCompon.ChildComplects[k], StartChildIndex, True);
end;
end;
end;
end
else
begin
for k := 0 to CurrCompon.ChildComplects.Count - 1 do
begin
if RComplectIndexType.ItemIndex = 0 then
begin
ReindexPorts(CurrCompon.ChildComplects[k], currComponPortIndex, True)
end
else
begin
if CheckBox2.Checked then
StartChildIndex := Spinedit2.value
else
StartChildIndex := 1;
ReindexPorts(CurrCompon.ChildComplects[k], StartChildIndex, True);
end;
end;
end;
end;
//ReindexPortsByList
end;
end;
Procedure TF_PortsReIndex.StartReindex;
var i: integer;
SheetsList: TList; //
SCSCompon: TSCSComponent;
begin
CanReindexComplects := not CantReidexChildCompon.Checked; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ByCreationOrder := (RComplectIndexType.ItemIndex = 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SheetsList := TList.Create; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RemoveChildsFromList(Tree_Selection);
LastClickedCompon := F_ProjMan.GetActualSelectedComponent;
ComponType := LastClickedCompon.ComponentType;
currComponPortIndex := 1;
if CheckBox1.Checked then
currComponPortIndex := Spinedit1.Value;
if CanReindexComplects then
begin
currChildComponPortIndex := 1;
if CheckBox2.Checked then
currChildComponPortIndex := Spinedit1.Value;
end;
GetSheetsList(SheetsList);
ReindexComponsPorts(SheetsList);
//free memory
SheetsList.Free;
end;
procedure TF_PortsReIndex.ToolButton1Click(Sender: TObject);
var i, currIndex: integer;
begin
if SheetsOrderList.Count > 1 then
begin
currIndex := SheetsOrderList.ItemIndex;
if currIndex < SheetsOrderList.Items.Count then
begin
SheetsOrderList.Items.Exchange(currIndex, currIndex + 1);
end;
end;
end;
procedure TF_PortsReIndex.ToolButton2Click(Sender: TObject);
var i, currIndex: integer;
begin
if SheetsOrderList.Count > 1 then
begin
currIndex := SheetsOrderList.ItemIndex;
if currIndex > 0 then
begin
SheetsOrderList.Items.Exchange(currIndex, currIndex - 1);
end;
end;
end;
procedure TF_PortsReIndex.ToolButton3Click(Sender: TObject);
begin
LoadProjLists;
end;
Procedure TF_PortsReIndex.DisableSheetsOrder;
begin
SheetsOrderList.Enabled := False;
SheetOrderLabel.Enabled := False;
end;
Procedure TF_PortsReIndex.EnableSheetsOrder;
begin
SheetsOrderList.Enabled := True;
SheetOrderLabel.Enabled := True;
end;
procedure TF_PortsReIndex.Button1Click(Sender: TObject);
begin
ModalResult := mrOK;
StartReindex;
end;
procedure TF_PortsReIndex.Button2Click(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TF_PortsReIndex.CantReidexChildComponClick(Sender: TObject);
begin
if CantReidexChildCompon.checked then
begin
CheckBox2.Enabled := False;
SpinEdit2.Enabled := False;
RComplectIndexType.Enabled := False
end
else
begin
CheckBox2.Enabled := True;
SpinEdit2.Enabled := True;
RComplectIndexType.Enabled := True;
end;
end;
Procedure TF_PortsReIndex.LoadProjLists;
var i: integer;
prLists: TstringList;
begin
prLists := TStringList.Create;
for i := 0 to F_ProjMan.GSCSBase.CurrProject.ProjectLists.Count - 1 do
begin
if F_ProjMan.GSCSBase.CurrProject.ProjectLists[i].Setting.ListType = lt_Normal then
prLists.AddObject(F_ProjMan.GSCSBase.CurrProject.ProjectLists[i].GetNameForVisible, F_ProjMan.GSCSBase.CurrProject.ProjectLists[i]);
end;
SheetsOrderList.Items.Clear;
SheetsOrderList.Items.Assign(prLists);
prLists.Free;
end;
procedure TF_PortsReIndex.FormCreate(Sender: TObject);
begin
{ RComponIndexType.Buttons[1].Checked := True;
RComplectIndexType.Buttons[1].Checked := True;
RApplyFor.Buttons[1].Checked := true;}
RComponIndexType.ItemIndex := 0;
RComplectIndexType.ItemIndex := 0;
RApplyFor.ItemIndex := 0;
RComponSortOrder.ItemIndex := 1;
Tree_Selection := nil;
end;
procedure TF_PortsReIndex.FormShow(Sender: TObject);
var i: integer;
prLists: TStringList;
begin
ModalResult := mrNone;
if Tree_Selection <> nil then
FreeAndNil(Tree_Selection);
Tree_Selection := GetComponListFromTreeSelection; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
//RemoveChildsFromList(Tree_Selection);
if Tree_Selection.Count > 1 then
RApplyFor.Enabled := False
else
RApplyFor.Enabled := True;
LoadProjLists;
end;
procedure TF_PortsReIndex.RApplyForClick(Sender: TObject);
var i: integer;
begin
if RApplyFor.ItemIndex = 2 then
begin
EnableSheetsOrder;
end
else
DisableSheetsOrder;
end;
procedure TF_PortsReIndex.RComplectIndexTypeClick(Sender: TObject);
begin
if RComplectIndexType.ItemIndex = 0 then
begin
CheckBox2.Enabled := False;
SpinEdit2.Enabled := False;
end
else
begin
CheckBox2.Enabled := True;
SpinEdit2.Enabled := True;
end;
end;
Procedure TF_PortsReIndex.RComponIndexTypeClick(Sender: TObject);
begin
if RComponIndexType.ItemIndex = 0 then
begin
CantReidexChildCompon.Enabled := True;
if CantReidexChildCompon.checked then
begin
CheckBox2.Enabled := False;
SpinEdit2.Enabled := False;
RComplectIndexType.Enabled := False
end
else
begin
RComplectIndexType.Enabled := True;
if RComplectIndexType.ItemIndex = 0 then
begin
CheckBox2.Enabled := False;
SpinEdit2.Enabled := False;
end
else
begin
CheckBox2.Enabled := True;
SpinEdit2.Enabled := True;
end;
end;
end
else
begin
CantReidexChildCompon.Enabled := False;
CheckBox2.Enabled := True;
SpinEdit2.Enabled := True;
RComplectIndexType.Enabled := True;
end;
end;
end.