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

26998 lines
2.3 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit U_ResourceReport;
interface
uses
Windows, U_LNG, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ToolWin, Contnrs, Printers, Math,
U_BaseCommon, U_BaseConstants, U_Constants, U_SCSComponent, U_SCSLists, U_SCSInterfPath, U_frOLEExl, {U_PreviewReport, }ImgList, cxLookAndFeelPainters, cxButtons, XPMenu,
U_BaseSettings,
DB, kbmMemTable, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, cxDBData, cxSpinEdit, cxCheckBox, cxCurrencyEdit,
cxColorComboBox, cxGridCustomTableView, cxGridTableView,
cxGridDBTableView, cxGridLevel, cxClasses, cxControls, cxGridCustomView,
cxGrid, ExtCtrls, RzPanel, RzLabel, FR_Class, FR_DSet, FR_DBSet, FR_View,
U_Common_Classes, FR_Desgn, FR_PrDlg, FR_Prntr, ActnList, RzButton, RzRadChk, siComp, siLngLnk, exgrid,
RapTree, FlytreePro, Treecoll, IsPlugEdit, ispinedit, Menus, RzEdit, Mask, RzSpnEdt, ShellApi,
pFIBQuery,
RzTabs, IniFiles, U_ProtectionCommon, FR_ChBox, DrawObjects, RzRadGrp,//, HTTPGet;
//Tolik
kbmMemBinaryStreamFormat, RzTreeVw, frxClass;
// kbmMWStreamFormat, kbmMWBinaryStreamFormat, kbmMWClientDataSet;
//
const
// Template Column Type
ttSimple = 1;
ttStamp = 2;
ttA3 = 3;
// TargetColumnIndex
tciCAD = 0;
tciReport = 1;
tciName = 2;
//Report Column Index
rciIsOn = 0;
rciName = 1;
rciSimple = 2;
rciStamp = 3;
// Section
seRepTemplate = 'RepTemplate';
// Idents
idtRepType = 'RepType';
idtReportUseKind = 'ReportUseKind';
idtTemplateType = 'TemplateType';
idtName = 'Name';
idtTemplate = 'Template';
// GroupMode
gmComponType = 0;
gmGroupName = 1;
type
TReportSortInfo = class;
TReportItemParams = class;
// Tolik -- 04/09/2016 --
// TCableWayCompon = Class;
// added by Tolik
// нужно для расчета расхода кабеля из катушек
// кабель
TCables = record
Length : double; // длина
Selected : boolean; // отобран
end;
// катушка
TCableReels = record
CableIDs : TIntList; // идентификаторы кабелей
Rest : double; // остаток
Length : double; // изначальная длина
Cables : array of double; // куски кабеля
CanCut : boolean; // флаг (можни ли еще отрезать от данной катушки)
end;
// тип кабеля или поставки
TCableTypes = record
Name: string; // наименование, артикул
Length: double; // длина (размер) поставки
TypeName: string; // артикул (если есть) или обозначение поставки
ReelName: string; // название поставки (катушка, моток и пр.)
Izm: string; // единицы измерения
Cables: array of TCables; // кабели
Reels: array of TCableReels; // катушки
CableIDs: TIntList; // айдишники кабелей
CableCypher: string; // идентификатор
end;
// Для отчета "Путь кабеля"
// путь кабеля
{ TCabPath = record
ID: Integer;
Name: string;
NameFrom: TStringList;
NppFrom: Integer;
NameTo: TStringList;
NppTo: Integer;
end;
}
TCabPath = record
ID: Integer;
Name: string;
NameFrom: TSCSComponent;
NppFrom: Integer;
NameTo: TSCSComponent;
NppTo: Integer;
Passed: boolean;
Kolvo: integer;
FromTo: string;
BeginPorts: TIntList;
EndPorts: TIntList;
BeginPortName: string;
EndPortName: string;
InterFacePositions: TIntList;
end;
// детализация пути кабеля
TCabPathInfo = record
ID: Integer;
ParentID: Integer;
Description: String;
InterfCount: Integer;
NameFrom: Integer;
NameTo: Integer;
Margin: Integer;
end;
TCabPaths = array of TCabPath;
TCabPathInfos = array of TCabPathInfo;
// описание типа порта
PortDescription = record
PortName: String;
Ports: TIntList;
end;
PortInform = array of PortDescription;
//список компонент
PconnCompon = ^connCompon;
connCompon = record
Component: TSCSComponent;
Passed: Boolean;
Components: array of PconnCompon;
end;
CList = array of connCompon;
{my_SCSObject = class(TMyObject)
public
Figure: TFigure;
ChildList: TList;
isLine: Boolean;
Length: Double;
HeightOfPlacing: Double;
end;}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tolik -- 04/09/20106 --
{ TCableWayCompon = class(TMyObject)
Public
FirstCompon: TSCSComponent;
LastCompon: TSCSComponent;
WayList: TList;
Npp: Integer;
Passed: Boolean;
CanSeekSide1: Boolean;
CanSeekSide2: Boolean;
CableInterfName: String;
CableInterface: TSCSInterface;
Side1ConnectedInterface: TSCSInterface;
Side2ConnectedInterface: TSCSInterface;
//GroupedNpp: string;
GroupedNpp: TIntList;
Side1InterfList: TList;
Side2InterfList: TList;
Constructor Create;
Destructor Destroy;
end;}
//
TReportShablons = class(TMyObject)
private
FRepShablons: TStringList;
FActiveShablonID: Integer;
FMessgShablonNoExists: String;
procedure AddShablonToList(AID: Integer; AName: String; AIsActive: Boolean);
procedure DefineActiveShablonIfNoDefined;
procedure ClearRepShablons;
constructor Create;
destructor Destroy; override;
function GetActiveShablonName: string;
function GetShablonNameByID(AID: Integer): string;
procedure RemoveShablonNameByID(AID: Integer);
end;
TSortFieldLists = class(TMyObject)
private
FOwner: TReportSortInfo;
FFieldNames: TStringList;
FFieldCaptCodes: TStringList;
constructor Create(AOwner: TReportSortInfo);
destructor Destroy; override;
end;
TReportSortInfo = class(TMyObject)
private
FOwner: TReportItemParams;
//FAllFieldList: TSortFieldLists;
FAllFieldNames: TStringList;
FAllFieldCaptions: TStringList;
FUsedFieldNames: TStringList;
FID: Integer;
FRepKind: ShortInt;
FCaseSensitive: ShortInt;
FDescending: ShortInt;
public
property AllFieldNames: TStringList read FAllFieldNames;
property AllFieldCaptions: TStringList read FAllFieldCaptions;
property CaseSensitive: ShortInt read FCaseSensitive write FCaseSensitive;
property Descending: ShortInt read FDescending write FDescending;
property ID: Integer read FID write FID;
property Owner: TReportItemParams read FOwner write FOwner;
property RepKind: ShortInt read FRepKind write FRepKind;
property UsedFieldNames: TStringList read FUsedFieldNames write FUsedFieldNames;
procedure AddFieldInfo(const AFieldName, ACaption: String);
procedure Assign(AReportSortInfo: TReportSortInfo);
constructor Create(AOwner: TReportItemParams);
destructor Destroy; override;
function GetFieldCaption(const AFName: String): String;
//Tolik -- 10/08/21017 --
procedure ClearFields;
end;
TReportItemParams = class(TMyObject)
private
FSimpleShablons: TReportShablons;
FStampShablons: TReportShablons;
FReportSortInfo: TReportSortInfo;
public
Mode: TResourceReportFormMode; // тип отчета
ReportUseKind: TReportUseKind; // Использование отчета в опр. условиях
ReportUseByProjType: TSCSTypes; // Использование отчета в опр. проектах (напр только для внутренней СКС).
// Пустое знач "[]" - означает что проект используется для всех проэктов
RepType: Integer; // тип отчета
CanHaveActiveComponents: Integer; // учитывть действующие компоненты
CanHaveZeroPriceComponents: Integer; // отображать компоненты с нелевой ценой
CanHaveFormMode: Integer; // можно ли вывести отчет на форме
CanHavePageSize: Integer; // можно ли выбирать размер страници
CanHaveDismountAccount: Integer; // Учитывать демонтаж
CanHaveTemplate: Integer; // Можно ли создавать шаблоны
CanHaveStamp: Integer; // Отчет со штампом
FullPathInCableJournal: Integer;
CanHaveSupplyValue: Integer; // Учитывать поставочные величины
CanRoundValue: Integer; // Округлять значения
CanAsPlacingInProj: Integer; // Отображать в парядке размещения
CanGroupByCompType: Integer; //Группировать по типу компонента
CanFloorNppWithRoom: Integer; // Отображать номер этажа с телекомуникационной комнатой TS
CanInTwoCopies: Integer;
CanCabinetParams: Integer;
CanResources: Integer;
CanPricePrecision: Integer;
CanKolvoPrecision: Integer;
//Added by Tolik for ExplicationComponent Report
CanShowKabinet: Integer; // Отображать покабинетную экспликацию компонентов
CanShowObjHierarchy : Integer; // Отображать иерархию объектов
CanGroupByName : Integer; // Группировать компоненты по назваиню
//ShowHeightOfPlacing: Integer; // Отображать высоту размещения объектов 06/03/2018 --
GroupByHeightOfPlacing: Integer; // группировать по высоте размещения 06/03/2018 --
////Added by Tolik для счета-фактуры
CanShowResources: Integer;
CanShowWorks: Integer;
// Added by Tolik for GOSTCableJournal (галочку будем выключать)
CanShowCablePaths : Integer;
//Added by Tolik for CablePaths
PageToShow: integer;
//Added by Tolik for GostCableJournal
CanShowOldReportForm: Integer;
///////////////
GroupMode: Integer;
constructor Create(AMode: TResourceReportFormMode; ARepType: Integer; AReportUseKind: TReportUseKind);
destructor Destroy; override;
function GetShablonsByTemplateType(ATemplateType: Integer): TReportShablons;
end;
//PReportItemParams = ^TReportItemParams;
TF_ResourceReport = class(TForm)
ImageList1: TImageList;
PrintDialog: TPrintDialog;
SaveDialog: TSaveDialog;
XPMenu: TXPMenu;
MemTable_RCable: TkbmMemTable;
MemTable_RResources: TkbmMemTable;
DataSource_MT_RCable: TDataSource;
DataSource_MT_RResources: TDataSource;
MemTable_RCableJournal: TkbmMemTable;
MemTable_RDisparityCompColor: TkbmMemTable;
DataSource_MT_RDisparityCompColor: TDataSource;
Report: TfrReport;
frDBDataSet_Master: TfrDBDataSet;
RepDesigner: TfrDesigner;
DataSource_MT_RCableJournal: TDataSource;
frDBDataSet_Detail: TfrDBDataSet;
MemTable_RTypeComponents: TkbmMemTable;
MemTable_RTypeComponentsDetail: TkbmMemTable;
DataSource_MT_RTypeComponents: TDataSource;
DataSource_MT_RTypeComponentsDetail: TDataSource;
MemTable_RSpecification: TkbmMemTable;
DataSource_MT_RSpecification: TDataSource;
MemTable_RSpecifTypeCompon: TkbmMemTable;
DataSource_MT_RSpecifTypeCompon: TDataSource;
frDBDataSet_SubDetail: TfrDBDataSet;
ActionList1: TActionList;
Act_ShowReport: TAction;
MemTable_RCableJournalExt: TkbmMemTable;
DataSource_MT_RCableJournalExt: TDataSource;
MemTable_RNorms: TkbmMemTable;
DataSource_MT_RNorms: TDataSource;
gbViewClose: TRzGroupBox;
gbTarget: TRzGroupBox;
RzGroupBox4: TRzGroupBox;
btClose: TRzBitBtn;
splitTarget: TSplitter;
btShowReport: TRzBitBtn;
Act_ShowWizardReport: TAction;
MemTable_RCableGroup: TkbmMemTable;
DataSource_MT_RCableGroup: TDataSource;
mtExplanatoryProj: TkbmMemTable;
dsrcExplanatoryProj: TDataSource;
mtExplanatoryList: TkbmMemTable;
dsrcExplanatoryList: TDataSource;
mtRCableJournalInterfaces: TkbmMemTable;
dsrcRCableJournalInterfaces: TDataSource;
mtRLegendObjectIcons: TkbmMemTable;
dsrcRLegendObjectIcons: TDataSource;
pnParamsAndModes: TRzPanel;
lng_Forms: TsiLangLinked;
tvReports: TFlyTreeViewPro;
ToolBar1: TToolBar;
btNewTemplate: TToolButton;
btEditTemplate: TToolButton;
btDelTemplate: TToolButton;
Act_NewSimpleTemplateFromStandart: TAction;
Act_NewStampTemplateFromStandart: TAction;
Act_NewSimpleTemplateFromUser: TAction;
Act_NewStampTemplateFromUser: TAction;
pmDropDownNewTemplate: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Act_EditTemplate: TAction;
Act_NewTemplate: TAction;
Act_DeleteTemplate: TAction;
Act_DropAll: TAction;
Act_EditSimpleTemplate: TAction;
Act_EditStampTemplate: TAction;
Act_DeleteSimpleTemplate: TAction;
Act_DeleteStampTemplate: TAction;
pmDropDownEditTemplate: TPopupMenu;
N6: TMenuItem;
N7: TMenuItem;
pmDropDownDelTemplate: TPopupMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
pmReports: TPopupMenu;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
RzPanel1: TRzPanel;
pmnuiNewTemplate: TMenuItem;
pmnuiEdit: TMenuItem;
pmnuiDel: TMenuItem;
RzGroupBox1: TRzGroupBox;
rbModeView: TRzRadioButton;
rbModePrint: TRzRadioButton;
rbModePacketPrint: TRzRadioButton;
tvReportTarget: TFlyTreeViewPro;
Timer_DefineReportNodeControls: TTimer;
rbModePacketPrintToExcel: TRzRadioButton;
mtReport: TkbmMemTable;
dsrcReport: TDataSource;
frDBDataSet_MasterFirst: TfrDBDataSet;
mtReportFirst: TkbmMemTable;
dsrcReportFirst: TDataSource;
RzBitBtn1: TRzBitBtn;
Act_NewMarkPage: TAction;
Act_NewMarkPageFromUser: TAction;
N12: TMenuItem;
N15: TMenuItem;
N18: TMenuItem;
N22: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
pnOtherProperties: TRzPanel;
lbOtherProperties: TRzLabel;
gbParams: TRzGroupBox;
pcRepParams: TRzPageControl;
tsProjRepParams: TRzTabSheet;
gbValues: TRzGroupBox;
cbCanRoundValue: TRzCheckBox;
cbCanHaveSupplyValue: TRzCheckBox;
gbPageSize: TRzGroupBox;
rbPageSizeA4: TRzRadioButton;
rbPageSizeA3: TRzRadioButton;
gbReportMode: TRzGroupBox;
rbRepModeDocument: TRzRadioButton;
rbRepModeForm: TRzRadioButton;
tsMarkPagesParams: TRzTabSheet;
cbFloorNppWithRoom: TRzCheckBox;
cbInTwoCopies: TRzCheckBox;
cbCanHaveActiveComponents: TRzCheckBox;
cbCanHaveZeroPriceComponents: TRzCheckBox;
cbCanHaveDismountAccount: TRzCheckBox;
cbReportWithStamp: TRzCheckBox;
cbFullPathInCableJournal: TRzCheckBox;
cbCanHaveActiveComponentsMarkPages: TRzCheckBox;
cbCanHaveDismountAccountMarkPages: TRzCheckBox;
gbNoCabinetNameShort: TRzGroupBox;
rbShowRoomName: TRzRadioButton;
rbShowString: TRzRadioButton;
edNoCabinetNameShort: TRzEdit;
lbNoCabinet: TLabel;
edNoCabinet: TRzEdit;
mtReportDetail: TkbmMemTable;
dsrcReportDetail: TDataSource;
mtReportSubDetail: TkbmMemTable;
dsrcReportSubDetail: TDataSource;
cbGroupByCompType: TRzCheckBox;
cbAsPlacingInProj: TRzCheckBox;
ToolButton1: TToolButton;
btExportTemplateToFile: TToolButton;
Act_ImportTemplateFromFile: TAction;
Act_ExportTemplateToFile: TAction;
pmDropDownExportTemplate: TPopupMenu;
Act_ExportSimpleTemplateToFile: TAction;
Act_ExportStampTemplateToFile: TAction;
ActExportSimpleTemplateToFile1: TMenuItem;
ActExportSimpleTemplateToFile2: TMenuItem;
pmnuiImportTemplate: TMenuItem;
pmnuiExportTemplates: TMenuItem;
N25: TMenuItem;
N26: TMenuItem;
pmnuiExportTemplate: TMenuItem;
ToolButton2: TToolButton;
N19: TMenuItem;
Act_EditReportSortInfo: TAction;
N23: TMenuItem;
ToolButton3: TToolButton;
cbCanResources: TRzCheckBox;
pnPacketExportType: TPanel;
rbPackExportExcel: TRzRadioButton;
rbPackExportPdf: TRzRadioButton;
frCheckBoxObject1: TfrCheckBoxObject;
Timer_ShowReport: TTimer;
Act_ExportToBc3: TAction;
bc31: TMenuItem;
tsCablePathParams: TRzTabSheet;
cbCablePathShowEndObjName: TRzCheckBox;
cbCablePathShowObjName: TRzCheckBox;
cbCablePathShowConnInSeparatePaths: TRzCheckBox;
cbCablePathShowCableCanals: TRzCheckBox;
gbGroupType: TRzGroupBox;
rbGroupByComponType: TRzRadioButton;
rbGroupByGroupName: TRzRadioButton;
Label1: TLabel;
Label2: TLabel;
nePricePrecision: TRzNumericEdit;
Label3: TLabel;
Label4: TLabel;
neKolvoPrecision: TRzNumericEdit;
Timer_TimeOutExec: TTimer;
RzGroupBox2: TRzGroupBox;
cbCanShowKabinet: TRzCheckBox;
frReport1: TfrReport;
frDBDataSet1: TfrDBDataSet;
frDBDataSet2: TfrDBDataSet;
frDBDataSet3: TfrDBDataSet;
cbCanShowObjHierarchy: TRzCheckBox;
cbCanGroupByName: TRzCheckBox;
gbResources: TRzGroupBox;
cbCanShowResources: TRzCheckBox;
cbCanShowWorks: TRzCheckBox;
RzGroupBox3: TRzGroupBox;
cbShowCablePath: TRzCheckBox;
rgCableRate: TRzRadioGroup;
cbNone: TRzRadioButton;
cbMaxScrapRate: TRzRadioButton;
cbMaxEfficiency: TRzRadioButton;
MemTable_WACoordinates: TkbmMemTable;
DataSource_MT_WACoordinates: TDataSource;
cbOldReportForm: TRzCheckBox;
NetTypeTree: TRzCheckTree;
RzLabel1: TRzLabel;
CheckAllReports: TRzCheckBox;
Label5: TLabel;
cbGroupByHeightOfPlacing: TRzCheckBox;
rbPackExportExcel2007: TRzRadioButton;
rbPackExportWord2007: TRzRadioButton;
RzPanel2: TRzPanel;
PortsReportPanel: TRzGroupBox;
cbGroupBusyPorts: TRzCheckBox;
cbGroupFreePorts: TRzCheckBox;
cbFullPortPath: TRzCheckBox;
cbFreePortsDetail: TRzCheckBox;
SortPanel: TRzGroupBox;
cbSortOn: TRzCheckBox;
procedure FormCreate(Sender: TObject);
procedure ToolButton_PrintClick(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure GT_RCableMaxLengthGetDisplayText(
Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
var AText: String);
procedure ReportGetValue(const ParName: String; var ParValue: Variant);
procedure ReportUserFunction(const Name: String; p1, p2, p3: Variant; var Val: Variant);
procedure FormDestroy(Sender: TObject);
procedure _tvReportTargetGetSelectedIndex(Sender: TObject;
Node: TTreeNode);
procedure Act_ShowWizardReportExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure gbViewCloseResize(Sender: TObject);
procedure cbCanHaveActiveComponentsClick(Sender: TObject);
procedure cbCanHaveZeroPriceComponentsClick(Sender: TObject);
procedure ReportBeginPage(pgNo: Integer);
procedure lbOtherPropertiesClick(Sender: TObject);
procedure lbOtherPropertiesMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
procedure lbOtherPropertiesMouseLeave(Sender: TObject);
procedure tvReportsCloseUp(Sender: TISPlugInplaceEdit;
Section: TISPlugSection; DropDown: TISDropDown; var Accept: Boolean);
procedure tvReportsSelectedChanged(OldNode, NewNode: TFlyNode);
procedure tvReportsDblClick(Sender: TObject);
procedure tvReportsDrawCell(Sender: TObject; aCanvas: TCanvas; ACol,
ARow: Integer; Rect: TRect; State: TExGridDrawState);
procedure Act_NewSimpleTemplateFromStandartExecute(Sender: TObject);
procedure Act_NewStampTemplateFromStandartExecute(Sender: TObject);
procedure Act_NewSimpleTemplateFromUserExecute(Sender: TObject);
procedure Act_NewStampTemplateFromUserExecute(Sender: TObject);
procedure Act_EditSimpleTemplateExecute(Sender: TObject);
procedure Act_EditStampTemplateExecute(Sender: TObject);
procedure Act_DeleteSimpleTemplateExecute(Sender: TObject);
procedure Act_DeleteStampTemplateExecute(Sender: TObject);
procedure Act_DropAllExecute(Sender: TObject);
procedure RepDesignerShow(Sender: TObject);
procedure RepDesignerSaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
procedure tvReportsPrepareDropDown(Sender: TISPlugInplaceEdit;
Section: TISPlugSection; Dropdown: TISDropDown);
procedure btTemplateClick(Sender: TObject);
procedure rbModeViewClick(Sender: TObject);
procedure tvReportTargetEdited(Sender: TObject; Node: TFlyNode;
var S: String);
procedure tvReportsEdited(Sender: TObject; Node: TFlyNode;
var S: String);
procedure Timer_DefineReportNodeControlsTimer(Sender: TObject);
procedure rbRepModeDocumentClick(Sender: TObject);
procedure RzBitBtn1Click(Sender: TObject);
procedure Act_NewMarkPageExecute(Sender: TObject);
procedure Act_NewMarkPageFromUserExecute(Sender: TObject);
procedure btEditTemplateClick(Sender: TObject);
procedure btDelTemplateClick(Sender: TObject);
procedure Act_EditTemplateExecute(Sender: TObject);
procedure Act_DeleteTemplateExecute(Sender: TObject);
procedure Act_ImportTemplateFromFileExecute(Sender: TObject);
procedure Act_ExportTemplateToFileExecute(Sender: TObject);
procedure Act_ExportSimpleTemplateToFileExecute(Sender: TObject);
procedure Act_ExportStampTemplateToFileExecute(Sender: TObject);
procedure btExportTemplateToFileClick(Sender: TObject);
procedure Act_EditReportSortInfoExecute(Sender: TObject);
procedure tvReportTargetCollapsing(Sender: TObject; Node: TFlyNode;
var AllowCollapse: Boolean);
procedure Timer_ShowReportTimer(Sender: TObject);
procedure Act_ExportToBc3Execute(Sender: TObject);
procedure nePricePrecisionChange(Sender: TObject);
procedure neKolvoPrecisionChange(Sender: TObject);
procedure Timer_TimeOutExecTimer(Sender: TObject);
procedure cbCanShowKabinetClick(Sender: TObject);
procedure cbAsPlacingInProjClick(Sender: TObject);
procedure cbCanGroupByNameClick(Sender: TObject);
procedure cbReportWithStampClick(Sender: TObject);
procedure cbShowCablePathClick(Sender: TObject);
procedure CheckAllReportsClick(Sender: TObject);
procedure cbOldReportFormClick(Sender: TObject);
procedure cbGroupByHeightOfPlacingClick(Sender: TObject);
procedure cbCanHaveSupplyValueClick(Sender: TObject);
// procedure ShowEtazhClick(Sender: TObject);
// procedure ShowKabinetClick(Sender: TObject);
private
FFrLocale: TfrLocale;
FFrPrintForm: TfrPrintForm;
FPrintDevice: TPrintDevice;
FUsefrDialog: Boolean; //*** юзать диалог печати из компоненты TfrReport
GFormMode: TResourceReportFormMode;
FReportUseKind: TReportUseKinds;
FExceedLength: Double;
FCatalog: TSCSCatalog;
FComponent: TSCSComponent;
FObjectName: string;
FReportCaption: String;
FSavedOnAppRestore: TNotifyEvent;
FSavedOnAppMinimize: TNotifyEvent;
FormList: TObjectList;
FMasterOldRecNo: Integer;
FDetailOldRecNo: Integer;
FOldRecNo: Integer;
FCurrRecNo: Integer;
FPassNum: Integer;
FTotalLaborTime: Integer;
FModifiedReportTemplate: Boolean;
//*** Для пакетной печати
FReportCountToPrint: Integer;
FReportCountPrinted: integer;
//FPackgeDir: string; // Tolik 07/08/2020 --
//FfrOLEExcelExport: TMyfrOleExl;
FCostOfProjectReportParams: TCostOfProjectReportParams;
//Tolik 16/02/2022 --
//FcbCanHaveActiveComponentsCurr: TRzCheckBox;
//FcbCanHaveDismountAccountCurr: TRzCheckBox;
//
FReportPagesVisibilityList: TIntList; // Tolik 31/03/2020 --
// Tolik 21/05/2020
FExportToXLSX: Boolean;
FExportToDocX: Boolean;
//
{ Private declarations }
procedure AddSortFieldsToReportItemParams(AReportItemParams: TReportItemParams);
procedure CorrectReport(AResourceReportFormMode: TResourceReportFormMode);
procedure ClearTVReportTemplates;
procedure CreateControls;
function DefineCurrRecNo: Integer;
procedure DefineReportModeControls;
procedure DefineReportNodeControls(ARepNode: TFlyNode; AWithTemplateInfo: Boolean);
procedure DefineReportNodeActiveShablonText(ARepNode: TFlyNode);
procedure DefineRepSortInfo;
procedure DefineRepTemplates;
procedure DelReportTemplate(ARepNode: TFlyNode; ATemplateType: Integer);
procedure ExportTemplateToFile(ATemplateType: Integer);
function GetCurrReportItemParamValues: TReportItemParams;
function GetReportFileNameByType(AReportType: Integer; ATemplateType: Integer; ACanA3: Boolean): String;
function GetReportItemParamByRepType(AReportType: Integer): TReportItemParams;
function GetTemplateTypeByColumnIndex(AColIndex: Integer): Integer;
function GetTemplateTypeByCurrOptions: Integer;
function ImportTemplateFromFile: Boolean;
function IsSimpleReportKind(AReportUseKinds: TReportUseKinds): Boolean;
procedure MakeEditReportTemplate(AMakeEdit: TMakeEdit; AMakeFromStandart: Boolean; ATemplateType: Integer);
function MakeNewReportTemplateWizard: Boolean;
procedure SortMemTableByParams(AMemTable: TkbmMemTable; AReportItemParams, AReportItemParamValues: TReportItemParams);
procedure PrepareReportFormats;
procedure RepListWrite(AName: String; AObjCount, AComponCount: Integer; AWorkCost: Double);
procedure RepObjWrite(AName: String; AItemType: TItemType; AComponCount: Integer; AWorkCost: Double);
procedure RepComponWrite(AName: String; AisCompon: Boolean; AWorkCost: Double; APref: Integer);
procedure RepResourcesWrite(AResourcesCost: Double; APref: Integer);
procedure RepResourceWrite(AName: String; AWorkCost: Double; APref: Integer);
procedure RepComplectsWrite(AComplCost: Double);
procedure LoadPortName(AIDPointComponent, AIDLineComponent: Integer; var ANppPort: Integer; var APortName: String;
aPort: Pointer=nil; aPortFromPos: PInteger=nil; aPortToPos: PInteger=nil);
function GetMultiPortNameMark(APointComponent: TSCSComponent; ARetIndexIfNoMark: Boolean): String;
function GetParallelInterfaces(AFirstConnCompon, AFirstLineCompon, ALastConnCompon, ALastLineCompon: TSCSComponent): TInterfLists;
function GetUOMLengthMin: String;
function GetUOMWithOrthographMarks: String;
function GetUOMWeight: String;
function GetUOMWeightOrthographMarks: String;
public
//Tolik 16/02/2022 --
FcbCanHaveActiveComponentsCurr: TRzCheckBox;
FcbCanHaveDismountAccountCurr: TRzCheckBox;
//
GForm: TForm;
FmtCableChannelGrp: TkbmMemTable;
FdsrcCableChannelGrp: TDataSource;
FmtCableChannel: TkbmMemTable;
FdsrcCableChannel: TDataSource;
FmtCrossJournal: TkbmMemTable;
FdsrcCrossJournal: TDataSource;
FmtExplicationRoom: TkbmMemTable;
FdsrcExplicationRoom: TDataSource;
FmtExplicationRoomDetail: TkbmMemTable;
FdsrcExplicationRoomDetail: TDataSource;
FmtExplicationCompon: TkbmMemTable;
FdsrcExplicationCompon: TDataSource;
FmtExplicationComponDetail: TkbmMemTable;
FdsrcExplicationComponDetail: TDataSource;
FmtExplicationComponSubDetail: TkbmMemTable;
FdsrcExplicationComponSubDetail: TDataSource;
//Tolik 17/10/2023 --
FmtPortReport: TkbmMemTable;
FmtPortReportDetail: TkbmMemTable;
FdsrcPortReport: TDataSource;
FdsrcPortReportDetail: TDataSource;
//
// Tolik
//ReelsCableFlow : TStringList; // список строк с расходом кабеля из катушек
AllNetTypes: Boolean; // флажок (если выбраны все типы сетей для отчета/отчетов)
NetTypeGuidList: TStringList; // список гуидов типов сетей на проекте (для дерева)
NetTypeGuidListSelected: TStringList; // список гуидов типов сетей, выбранных пользователем для отчета
INeedNormsRecources: Boolean;
//
FmtHouse: TkbmMemTable;
FdsrcHouse: TDataSource;
FmtApproach: TkbmMemTable;
FdsrcApproach: TDataSource;
FmtDefectAct: TkbmMemTable;
FdsrcDefectAct: TDataSource;
FmtCommerceInvoice: TkbmMemTable;
FdsrcCommerceInvoice: TDataSource;
FmtCablePaths: TkbmMemTable;
FdsrcCablePaths: TDataSource;
FmtCablePathsInfo: TkbmMemTable;
FdsrcCablePathsInfo: TDataSource;
FmtCrossConnection: TkbmMemTable;
FdsrcCrossConnection: TDataSource;
FmtMarkRoomTS: TkbmMemTable;
FdsrcMarkRoomTS: TDataSource;
FmtMarkPathPanel: TkbmMemTable;
FdsrcMarkPathPanel: TDataSource;
FmtMarkPathPanelPorts: TkbmMemTable;
FdsrcMarkPathPanelPorts: TDataSource;
FmtMarkSocket: TkbmMemTable;
FdsrcMarkSocket: TDataSource;
FmtMarkSocketPanel: TkbmMemTable;
FdsrcMarkSocketPanel: TDataSource;
FmtMarkCable: TkbmMemTable;
FdsrcMarkCable: TDataSource;
FRepMsgList: TStringList;
FPricePrecision: Integer;
FKolvoPrecision: Integer;
FPackgeDir: string; // Tolik 07/08/2020 --
procedure FormMdiClose(Sender: TObject; var Action: TCloseAction);
procedure ApplMinimize(Sender: TObject);
procedure ApplRestore(Sender: TObject);
procedure frOLEExcelExportStartExportPageEvent(Sender: TObject; ACaption: string; AObjCount: Integer);
procedure frOLEExcelExportProgressExportPageEvent(Sender: TObject; var AWasCancel: Boolean;
AObjIndex, AObjectCount: Integer);
procedure frOLEExcelExportEndExportPageEvent(Sender: TObject; AWasCancel: Boolean);
procedure DefinePrecisions;
procedure DefineRepDesignLanguage;
function ExtractDirToNewReport(ADateTime: TDateTime): String;
function ExtractDirToReportTemplate(AReportName: String): String;
function GetTargetFolder: TSCSCatalog;
procedure ShowWizard(AReportUseKind: TReportUseKinds; AShow: Boolean=true);
procedure ShowPreparedReport(AParams: TReportItemParams);
procedure ShowReportByParams(AFolder: TSCSCatalog; AParams: TReportItemParams);
function ShowReportFromFile(AReportMode: TResourceReportFormMode; AParams: TReportItemParams; AReportFile: String;
APrintDevice: TPrintDevice; AIsTemplate: Boolean; AMakeEditTemplate: TMakeEdit): Boolean;
function CheckCanShowReport(ACAtalog: TSCSCatalog): Boolean;
procedure InitRepMsgList;
function PrepareCommerceInvoiceObjects(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams): TSCSCatalog;
procedure ShowListObjectReport(AIDComponList: Integer);
procedure ShowFolderResourceReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
ACanHaveActiveComponents, ACanHaveDismountAccount,
AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue: Boolean);
procedure ShowFolderNormReport(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents: Boolean);
procedure ShowFolderCableReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
AFormMode: TResourceReportFormMode; ACanHaveActiveComponents, ACanHaveDismountAccount: Boolean; AReportItemParamValues: TReportItemParams);
procedure ShowFolderDisparityComponReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
AFormMode: TResourceReportFormMode);
procedure ShowFolderCableJournal(AFolder: TSCSCatalog; AParams: TReportItemParams; AResRepFormMode: TResourceReportFormMode; ACanHaveActiveComponents, ACanHaveDismountAccount, AFullPath: Boolean);
procedure ShowFolderCableJournalExt(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents, ACanHaveDismountAccount, AFullPath: Boolean);
procedure ShowFolderLegendObjectIcons(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents: Boolean);
procedure ShowFolderTypeComponenetsReport(AFolder: TSCSCatalog; AParams: TReportItemParams);
procedure ShowFolderSpecificationReport(AFolder: TSCSCatalog; AParams, AReportItemParamValues: TReportItemParams;
AResourceReportFormMode: TResourceReportFormMode;
ACanHaveActiveComponents, ACanHaveZeroPriceComponents,
ACanHaveDismountAccount,
ACanRoundValue, ACanHaveSupplyValue: Boolean);
procedure ShowFolderExplanatoryReport(AFolder: TSCSCatalog; AParams: TReportItemParams);
procedure ShowPriorCostOfProjectReport(AParams: TReportItemParams);
procedure ShowPriorCostOfProjectReportWizard(AMemTable, ATotalParams: TkbmMemTable;
ACostOfProjectReportParams: TCostOfProjectReportParams; AShowTotalParams, AShowTemplates: Boolean);
procedure ShowMarkPages(AFolder: TSCSCatalog; AParams: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode; AReportItemParamValues: TReportItemParams);
procedure ShowExplicationRoom(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
// Tolik -- 06/03/2018 --
{procedure ShowExplicationComponent(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams;ACanHaveActiveComponents, ACanHaveDismountAccount, AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue, ACanShowKabinet, ACanShowObjHierarchy, ACanGroupByName: Boolean);}
procedure ShowExplicationComponent(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams;ACanHaveActiveComponents, ACanHaveDismountAccount, AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue, ACanShowKabinet, ACanShowObjHierarchy, ACanGroupByName,{ AShowHeightOfPlacing,} AGroupByHeightOfPlacing: Boolean);
//
procedure ShowExplicationComponentOLD(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
procedure ShowComponSpecifications(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
procedure ShowCrossJournal(AFolder: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode);
procedure ShowHouse(AFolder: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
procedure ShowDefectAct(AFolder: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode);
procedure ShowDefectActForCompon(ACompon: TSCSComponent; AParams: TReportItemParams; ADefectAct: TDefectAct);
procedure ShowCommerceInvoice(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
procedure ShowCablePaths(AParams: TReportItemParams);
Procedure ShowPortConnections(aParams: TReportItemParams); // Tolik 07/09/2023 --
procedure ShowCrossConnection(AParams: TReportItemParams);
procedure ShowCablePathsWizard(ACable: TSCSComponent);
Procedure ShowPortWizard(aCupBoard: TSCSComponent); // Tolik 07/09/2023 --
procedure ShowCrossConnectionWizard(ACompon: TSCSComponent);
//added by Tolik
procedure ShowWACoordinatesReport(AFolder: TSCSCatalog; AList: TStringList);
Procedure IncPaketPrintCounter;
Procedure ShowXLSXReport(aRep: TfrReport; aFileNAme: String);
Procedure SaveRopPagesVisibility(aRep: TfrReport); // Tolik 31/03/2020 --
constructor Create(AOwner: TComponent; AForm: TForm);
destructor Destroy; override;
// Tolik 17/03/2020 --
Property Catalog: TSCSCatalog read FCatalog;
Property Component: TSCSComponent read FComponent;
Property ReportPagesVisibilityList: TIntList read FReportPagesVisibilityList write FReportPagesVisibilityList;
// Tolik 21/05/2020
Property ExportToXLSX: Boolean read FExportToXLSX write FExportToXLSX;
Property ExportToDocX: Boolean read FExportToDocX write FExportToDocX;
//
// Tolik 23/06/2020 --
property ReportCountToPrint: Integer read FReportCountToPrint write FReportCountToPrint;
property ReportCountPrinted: Integer read FReportCountPrinted write FReportCountPrinted;
// Tolik 16/02/2022 -- FReportUseKind: TReportUseKinds;
property ReportUseKind: TReportUseKinds read FReportUseKind write FReportUseKind;
end;
{
var
F_ResourceReport: TF_ResourceReport;}
// Added by Tolik
// Procedure SortCables (var CableTypes : array of TCableTypes);
implementation
Uses U_Main, Unit_DM_SCS, FIBQuery, U_Common, U_Preview, U_ESCadClasess,
Gauges, U_MakeMarkPage, U_MasterDefectAct, U_GuideFileList, U_SCSClasses,
U_CAD, {Tolik 20/03/2020} U_ExpXlsX;
var
ReelsCableFlow : TStringList;
isCompCable: Boolean;
// ReportPagesVisibilityList: TIntList;// Tolik 31/03/2020 --
{$R *.dfm}
{ TReportShablons }
// Added by Tolik
type
TCableTypeArray = array of TCableTypes;
procedure TF_ResourceReport.ReportGetValue(const ParName: String;
var ParValue: Variant);
begin
{ if ParName = 'TotalCost' then
ParValue := '';
if ParName = 'TodayDate' then
ParValue := '';}
if ParName = 'CurrencyName' then
begin
if rkProject in FReportUseKind then
ParValue := TF_Main(GForm).GCurrencyM.NameBrief
else
if rkCalc in FReportUseKind then
ParValue := FCostOfProjectReportParams.CurrencyName;
end;
if ParName = 'ExceedLength' then
ParValue := FExceedLength;
end;
procedure TF_ResourceReport.ReportUserFunction(const Name: String; p1, p2,
p3: Variant; var Val: Variant);
var
SCSProjCatalog: TSCSCatalog;
FooterBand: TfrBandView;
begin
SCSProjCatalog := nil;
if FCatalog <> nil then
if FCatalog.ItemType = itProject then
SCSProjCatalog := FCatalog
else
SCSProjCatalog := FCatalog.GetTopParentCatalog;
if Name = 'GETREPLABEL' then
//Tolik 18/02/2022 --
//Val := DateToStr(Date)+' '+cResourceReport_Msg24 +ApplicationName+' '+VersionEXE
Val := ApplicationName+' '+VersionEXE
//
else
if Name = 'GETPROJECTNAME' then
begin
Val := '';
SCSProjCatalog := nil;
if Assigned(FCatalog) then
if FCatalog.ItemType = itProject then
SCSProjCatalog := FCatalog
else
SCSProjCatalog := FCatalog.GetTopParentCatalog;
if Assigned(SCSProjCatalog) then
Val := SCSProjCatalog.GetNameForVisible;
end
else
if Name = 'GETLISTNAME' then
begin
Val := '';
if Assigned(FCatalog) then
if FCatalog.ItemType = itList then
Val := FCatalog.GetNameForVisible
else
if FCatalog.ItemType = itDir then
Val := FCatalog.GetNameForVisible+' ('+GetCatalogItemsNames(FCatalog, [itList])+')';
end
else
if Name = 'GETCOMPONNAME' then
begin
Val := '';
if Assigned(FComponent) then
val := FComponent.GetNameForVisible;
end
//Tolik
else
if Name = 'GETISCOMPCABLE' then // 08/02/2018 --для отчета "Полный путь кабеля " -- показатель, принадлежит ли кабель,
// на котором вызван отчет компьютерной сети
begin
if isCompCable then
Val := 1
else
val := 0;
end
else
if Name = 'GETCABLENAME' then
begin
Val := '';
if Assigned(FComponent) then
Val := FComponent.Name;
end
else
if Name = 'GETCABLEZAPAS' then
begin
Val := null;
if FCatalog.ItemType = itList then
Val := TSCSList(FCatalog).Setting.LengthKoef;
end
else
if Name = 'GETZAKAZCHIKNAME' then
begin
if rkCalc in FReportUseKind then
Val := FCostOfProjectReportParams.ZakazchikName
else
begin
//Tolik
// Val := TSCSProject(SCSProjCatalog).Setting.CustomerName;
Val := F_ProjMan.GSCSBase.CurrProject.Setting.CustomerName;
end;
{ if rkProject in FReportUseKind then
// if ((rkProject in FReportUseKind) or (rkWACoordinates in FReportUseKind)) then
begin
if SCSProjCatalog <> nil then
Val := TSCSProject(SCSProjCatalog).Setting.CustomerName;
end
else
if rkCalc in FReportUseKind then
Val := FCostOfProjectReportParams.ZakazchikName;}
end
else
if Name = 'GETPODRADCHIKNAME' then
begin
//changed by Tolik
// if rkProject in FReportUseKind then
// if ((rkProject in FReportUseKind) or (rkWACoordinates in FReportUseKind)) then
{ begin
if SCSProjCatalog <> nil then
Val := TSCSProject(SCSProjCatalog).Setting.ContractorName;
end
else
if rkCalc in FReportUseKind then
Val := FCostOfProjectReportParams.PodradchikName;
}
if rkCalc in FReportUseKind then
Val := FCostOfProjectReportParams.PodradchikName
else
if SCSProjCatalog <> nil then
Val := TSCSProject(SCSProjCatalog).Setting.ContractorName
else
Val := '';
end
else
if Name = 'GETORGANIZATIONNAME' then
begin
if SCSProjCatalog <> nil then
Val := TSCSProject(SCSProjCatalog).Setting.OrganizationName;
end
else
if Name = 'GETCURRNPP' then
begin
Val := DefineCurrRecNo; //frDBDataSet_Master.DataSource.DataSet.RecNo;
end
else
if Name = 'GETISNEWRECORD' then
begin
if (FCurrRecNo = FOldRecNo) and (FOldRecNo <> 0) then
Val := false
else
Val := true;
end
else
if Name = 'GETPASSNUM' then
begin
Val := FPassNum;
end
else
if Name = 'INCPASSNUM' then
begin
Inc(FPassNum);
Val := FPassNum;
end
else
if Name = 'DEFINEPAGEFOOTER' then
begin
FooterBand := TfrBandView(Report.FindObject('PageFooter'));
//if FooterBand <> nil then
//begin
//end;
end
else
if Name = 'GETLENGTHTHROUGHFLOOR' then
begin
Val := 0;
if FCatalog is TSCSProject then
Val := Round2(FloatInUOM(TSCSProject(FCatalog).Setting.HeightThroughFloor * (TSCSProject(FCatalog).IDsNearFloorFigures.Count) / 2,
umMetr, TF_Main(GForm).FUOM));
end
else
if Name = 'GETIZM' then
Val := GetNameUOM(TF_Main(GForm).FUOM, true)
else
if Name = 'GETIZMSYMB' then
Val := GetNameUOM(TF_Main(GForm).FUOM, true, false)
else
if Name = 'GETIZMLENMIN' then
Val := GetUOMLengthMin
else
if Name = 'GETIZMWEIGHT' then
Val := GetUOMWeight
else
if Name = 'GETNDS' then
begin
if rkProject in FReportUseKind then
begin
if SCSProjCatalog <> nil then
Val := TSCSProject(SCSProjCatalog).Setting.NDS;
end
end
else
if Name = 'GETPRICEWITHNDS' then //21.11.2013 - Вернуть цену с НДС
begin
Report.GetVariableValue(p1, Val);
if Val <> null then
if TSCSProject(SCSProjCatalog).Setting.NDS > 0 then
Val := Val * (TSCSProject(SCSProjCatalog).Setting.NDS/100+1)
end
else
if Name = 'GETTOTALLABORTIME' then
Val := GetDisplayTextToNORMLaborTime(IntToStr(FTotalLaborTime))
else
if Name = 'GETCAPT' then
begin
Val := '';
//Tolik 23/10/2023 -- for ports report
if p1 = 'PORTSREPORT' then
Val := cRepMsg276
else
if p1 = 'PORTTO' then
Val := cRepMsg278
else
if p1 = 'CONNECTEDBY' then
Val := cRepMsg277
else
if p1 = 'PORTSCUPBOARD' then
Val := GPortsCupBoard
else
if p1 = 'BUSYPORTS' then
Val := cRepMsg282
else
if p1 = 'FREEPORTS' then
Val := cRepMsg283
else
if p1 = 'BUSYPORTSCOUNT' then
Val := GReportBusyPortsCount
else
if p1 = 'FREEPORTSCOUNT' then
Val := GReportFreePortsCount
else
//
if p1 = 'CUSTOMER' then
Val := cRepMsg01
// added by Tolik for CommerceInvoice Report
else
if p1 = 'RESOURCES' then
Val := cRepMsg207_1
else
if p1 = 'CONTRACTOR' then
Val := cRepMsg02
else
if p1 = 'PROJNAME' then
Val := cRepMsg03
else
if p1 = 'PAGENAME' then
Val := cRepMsg10
else
if p1 = 'GRAPHSYMBLEGEND' then
Val := cRepMsg04
else
if p1 = 'NUM' then
// Tolik 21/01/2020
{$IF DEFINED (SCS_PE)}
Val := 'N'
{$ELSE}
Val := cRepMsg05
{$IFEND}
//
else
if p1 = 'NAME' then
Val := cRepMsg06
else
if p1 = 'INDICATION' then
Val := cRepMsg07
else
if p1 = 'WORKEDOUT' then
Val := cRepMsg08
else
if p1 = 'LENGTHALLCABLES' then
Val := cRepMsg227
else
if p1 = 'CHECKEDBY' then
Val := cRepMsg09
else
if p1 = 'UNDERLINE' then
Val := DupStr('_', 30) //'______________________________'
else
if p1 = 'ADJUSTT' then
Val := cRepMsg11
else
if p1 = 'VZAMINVENTNUMT' then
Val := cRepMsg12
else
if p1 = 'SIGNANDDATET' then
Val := cRepMsg13
else
if p1 = 'INVNUMPODLT' then
Val := cRepMsg14
else
if p1 = 'IZMT' then
Val := cRepMsg15
else
if p1 = 'KOLICHT' then
Val := cRepMsg16
else
if p1 = 'PAGET' then
Val := cRepMsg17
else
if p1 = 'NUMDOCT' then
Val := cRepMsg18
else
if p1 = 'SIGNT' then
Val := cRepMsg19
else
if p1 = 'DATET' then
Val := cRepMsg20
else
if p1 = 'STAGET' then
Val := cRepMsg21
else
if p1 = 'PAGEST' then
Val := cRepMsg22
else
if p1 = 'SIGNATURE' then
Val := cRepMsg23
else
if p1 = 'LASTNAME' then
Val := cRepMsg24
else
if p1 = 'CABLEDUCTSLIST' then
Val := cRepMsg25
else
if p1 = 'UOM' then
Val := cRepMsg26
else
if p1 = 'FULLNESSPERC' then
Val := cRepMsg27
else
if p1 = 'LENGTH_M' then
Val := cRepMsg154 + GetUOMWithOrthographMarks //cRepMsg28
else
if p1 = 'RESERVE_M' then
Val := cRepMsg155 + GetUOMWithOrthographMarks //cRepMsg29
else
if p1 = 'PRICE' then
Val := cRepMsg30
else
if p1 = 'COST' then
Val := cRepMsg31
else
if p1 = 'TOTAL' then
Val := cRepMsg32
else
if p1 = 'GENERALCABDUCTSLEN' then
Val := cRepMsg33
else
if p1 = 'M' then
Val := cRepMsg34
else
if p1 = 'GENERALRESERVLEN' then
Val := cRepMsg35
else
if p1 = 'CABLEDUCTSLIST_NOTE1' then
Val := cRepMsg36
else
if p1 = 'CABLELIST' then
Val := cRepMsg37
else
if p1 = 'CONNECTBEGINSH' then
Val := cRepMsg38
else
if p1 = 'CONNECTENDSH' then
Val := cRepMsg39
else
if p1 = 'GENERALCABLESLEN' then
Val := cRepMsg40
else
if p1 = 'GENERALRESERVLEN' then
Val := cRepMsg41
else
if p1 = 'CABLELIST_NOTE1' then
Val := cRepMsg42
else
if p1 = 'CABLELIST_NOTE2' then
Val := cRepMsg43
else
if p1 = 'LISTOFWORKS' then
Val := cRepMsg44
else
if p1 = 'CODE' then
Val := cRepMsg45
else
if p1 = 'VOLUME' then
Val := cRepMsg46
else
if p1 = 'RESOURCELIST' then
Val := cRepMsg47
else
if p1 = 'VENDORSERIALNUM' then
Val := cRepMsg48
else
if p1 = 'DISTRIBSERIALNUM' then
Val := cRepMsg49
else
if p1 = 'VENDOR' then
Val := cRepMsg50
else
if p1 = 'QUANTITY' then
Val := cRepMsg51
else
if p1 = 'PRICEVAT' then
Val := cRepMsg52
else
if p1 = 'COSTVAT' then
Val := cRepMsg53
else
if p1 = 'TOTALCOST' then
Val := cRepMsg54
else
if p1 = 'RESOURCELIST_NOTE1' then
Val := cRepMsg55
else
if p1 = 'EXTLOGBOOK' then
Val := cRepMsg56
else
if p1 = 'NUMPP' then
Val := cRepMsg57
else
if p1 = 'NUMCABLE' then
Val := cRepMsg58
else
if p1 = 'CABLEDATA' then
Val := cRepMsg59
else
if p1 = 'CORENUMBER' then
Val := cRepMsg60
else
if p1 = 'GOFROM' then
Val := cRepMsg61
else
if p1 = 'GOWHERE' then
Val := cRepMsg62
else
if p1 = 'BUILDING' then
Val := cRepMsg63
else
if p1 = 'DEVICE_RACK' then
Val := cRepMsg64
else
if p1 = 'ELEMENT_PANEL' then
Val := cRepMsg65
else
if p1 = 'SEATORCIRCUITBOARDTYPE' then
Val := cRepMsg66
else
if p1 = 'NUMPORT' then
Val := cRepMsg67
else
if p1 = 'PORTMARKING' then
Val := cRepMsg68
else
if p1 = 'JUNCTWITHCABLE' then
Val := cRepMsg69
else
if p1 = 'CABLINGTRACE' then
Val := cRepMsg70
else
if p1 = 'MARKINGLABEL' then
Val := cRepMsg71
else
if p1 = 'CABLEDIAMETERMM' then
Val := cRepMsg156 +', '+ GetUOMLengthMin //cRepMsg72
else
if p1 = 'CABLELEN_M_BUILDING' then
Val := cRepMsg157+', '+ GetNameUOM(TF_Main(GForm).FUOM, true)+' '+cRepMsg158 //cRepMsg73
else
if p1 = 'NOTE' then
Val := cRepMsg74
else
if p1 = 'CABLELOGBOOK' then
Val := cRepMsg75
else
if p1 = 'GOST21_101_97' then
Val := cRepMsg76
else
if p1 = 'CABLETYPE' then
Val := cRepMsg77
else
if p1 = 'NUMSWITCHBOARD' then
Val := cRepMsg78
else
if p1 = 'NUMSWITCHBOARDPORT' then
Val := cRepMsg79
else
if p1 = 'COMESFROM' then
Val := cRepMsg80
else
if p1 = 'NUMOUTLETORSWITCHBOARD' then
Val := cRepMsg81
else
if p1 = 'NUMOUTLETORSWITCHBOARDPORT' then
Val := cRepMsg82
else
if p1 = 'ROOM' then
Val := cRepMsg83
else
if p1 = 'CABLE' then
Val := cRepMsg84
else
if p1 = 'CATEGORY' then
Val := cRepMsg85
else
if p1 = 'FROM' then
Val := cRepMsg86
else
if p1 = 'TO' then
Val := cRepMsg87
else
if p1 = 'WORKPLACE' then
Val := cRepMsg88
else
if p1 = 'WORKAREA' then
Val := cRepMsg88_
else
if p1 = 'PORT' then
Val := cRepMsg89
else
if p1 = 'TYPE' then
Val := cRepMsg90
else
if p1 = 'SPECIFICATION' then
Val := cRepMsg91
else
if p1 = 'PRODMARKNUMSH' then
Val := cRepMsg92
else
if p1 = 'DISTRIBMARKNUMSH' then
Val := cRepMsg93
else
if p1 = 'VENDOR' then
Val := cRepMsg94
else
if p1 = 'PRICEWITHVAT' then
Val := cRepMsg95
else
if p1 = 'COSTWITHVAT' then
Val := cRepMsg96
else
if p1 = 'SUM' then
Val := cRepMsg97
else
if p1 = 'SPECIFICATION_NOTE1' then
Val := cRepMsg98
else
if p1 = 'SPECIFICATION_NOTE2' then
Val := cRepMsg99
else
if p1 = 'GOST21_110_95' then
Val := cRepMsg100
else
if p1 = 'POSITION' then
Val := cRepMsg101
else
if p1 = 'NAMEANDTECHCHARACK' then
Val := cRepMsg102
else
if p1 = 'DOCTYPEMARKINDICAT' then
Val := cRepMsg103
else
if p1 = 'CODEOFEQUIPMMATERIAL' then
Val := cRepMsg104
else
if p1 = 'FACTORYPRODUCER' then
Val := cRepMsg105
else
if p1 = 'UNITOFMEASURE' then
Val := cRepMsg106
else
if p1 = 'MASSOFUNITKG' then
Val := cRepMsg153 + GetUOMWeightOrthographMarks
else
if p1 = 'EXPLANATORYNOTE' then
Val := cRepMsg109
else
if p1 = 'BYTHEPROJECT' then
Val := cRepMsg110
else
if p1 = 'BASEPROJCURRENCY' then
Val := cRepMsg111
else
if p1 = 'PROJVAT' then
Val := cRepMsg112
else
if p1 = 'INTERFLOORLIFTINGSHEIGHT_M' then
Val := cRepMsg145 + GetUOMWithOrthographMarks //cRepMsg113
else
if p1 = 'BYPAGES' then
Val := cRepMsg114
else
if p1 = 'FLOORHEIGHT_M' then
Val := cRepMsg146 + GetUOMWithOrthographMarks //cRepMsg115
else
if p1 = 'DROPCEILINGHEIGHT_M' then
Val := cRepMsg147 + GetUOMWithOrthographMarks //cRepMsg116
else
if p1 = 'POINTOBJECTSPLACEMENTHEIGHT_M' then
Val := cRepMsg148 + GetUOMWithOrthographMarks //cRepMsg117
else
if p1 = 'ROUTEPLACEMENTHEIGHT_M' then
Val := cRepMsg149 + GetUOMWithOrthographMarks //cRepMsg118
else
if p1 = 'CONDUITSFULLNESSCOEFFICIENT' then
Val := cRepMsg119
else
if p1 = 'CABLELENGTHRESERVE' then
Val := cRepMsg120
else
if p1 = 'PORTRESERVE_M' then
Val := cRepMsg150 + GetUOMWithOrthographMarks //cRepMsg121
else
if p1 = 'MULTIPORTRESERVE_M' then
Val := cRepMsg151 + GetUOMWithOrthographMarks //Val := cRepMsg122
else
if p1 = 'MAXLENRESTRICTION_M' then
Val := cRepMsg152 + GetUOMWithOrthographMarks //cRepMsg123
else
if p1 = 'EXPLICATIONROOM' then
Val := cRepMsg124
else
if p1 = 'LETTERTOPLAN' then
Val := cRepMsg125
else
if p1 = 'FLOOR' then
Val := cRepMsg126
else
if p1 = 'LODGEMENTTNUM' then
Val := cRepMsg127
else
if p1 = 'ROOMNUM' then
Val := cRepMsg128
else
if p1 = 'APPOINTMENTROOM' then
Val := cRepMsg129
else
if p1 = 'SQUAREINSIDE' then
Val := cRepMsg130
else
if p1 = 'SQM' then
Val := cRepMsg159+'.'+GetNameUOM(TF_Main(GForm).FUOM, true, false)+'.' //кв.м. кв.фт. cRepMsg131
else
if p1 = 'INCLUDING' then
Val := cRepMsg132
else
if p1 = 'TOTALSQUARE' then
Val := cRepMsg133
else
if p1 = 'HABITABLESQUARE' then
Val := cRepMsg134
else
if p1 = 'BACKROOMSQUARE' then
Val := cRepMsg135
else
if p1 = 'SQUARENOINCLUDETOTATAL' then
Val := cRepMsg136
else
if p1 = 'SQUARESELFWILLEDBUILDING' then
Val := cRepMsg137
else
if p1 = 'HEIGHT' then
Val := cRepMsg138
else
if p1 = 'TOTALINFLOOR' then
Val := cRepMsg139
else
if p1 = 'EXPLICATIONCOMPON' then
Val := cRepMsg140
else
if p1 = 'COMPONNUM' then
Val := cRepMsg141
else
if p1 = 'NAMEMARK' then
Val := cRepMsg142
else
if p1 = 'CROSSJOURNAL' then
Val := cRepMsg143
else
if p1 = 'GOST21_110_95' then
Val := cRepMsg144
else
if p1 = 'INTERFLOORLIFTINGSHEIGHT' then
Val := cRepMsg145
else
if p1 = 'FLOORHEIGHT' then
Val := cRepMsg146
else
if p1 = 'DROPCEILINGHEIGHT' then
Val := cRepMsg147
else
if p1 = 'POINTOBJECTSPLACEMENTHEIGHT' then
Val := cRepMsg148
else
if p1 = 'ROUTEPLACEMENTHEIGHT' then
Val := cRepMsg149
else
if p1 = 'PORTRESERVE' then
Val := cRepMsg150
else
if p1 = 'MULTIPORTRESERVE' then
Val := cRepMsg151
else
if p1 = 'MAXLENRESTRICTION' then
Val := cRepMsg152
else
if p1 = 'MASSOFUNIT' then
Val := cRepMsg153
else
if p1 = 'LENGTH' then
Val := cRepMsg154
else
if p1 = 'RESERVE' then
Val := cRepMsg155
else
if p1 = 'CABLEDIAMETER' then
Val := cRepMsg156
else
if p1 = 'CABLELEN' then
Val := cRepMsg157
else
if p1 = 'BUILDING_S' then
Val := cRepMsg158
else
if p1 = 'SQ' then
Val := cRepMsg159
else
if p1 = 'MATERIALS' then
Val := cRepMsg160
else
if p1 = 'ARTICUL' then
Val := cRepMsg161
else
if p1 = 'WORKS' then
Val := cRepMsg162
else
if p1 = 'DEFECTACT' then
Val := cRepMsg164
else
if p1 = 'FINDDEFECT' then
Val := cRepMsg165
else
if p1 = 'WITHDEFINEWORKS' then
Val := cRepMsg166
else
if p1 = 'REPAIRDEFECT' then
Val := cRepMsg167
else
if p1 = 'ADDRESS' then
Val := cRepMsg168
else
if p1 = 'DEFECTDESCRIPTION' then
Val := cRepMsg169
else
if p1 = 'LINKTRANSPORT' then
Val := cRepMsg170
else
if p1 = 'POINTA' then
Val := cRepMsg171
else
if p1 = 'POINTB' then
Val := cRepMsg172
else
if p1 = 'CABLE' then
Val := cRepMsg173
else
if p1 = 'DEFACTMATERIALS' then
Val := cRepMsg174
else
if p1 = 'SETEQUIPMENT' then
Val := cRepMsg175
else
if p1 = 'EQUIPMENT' then
Val := cRepMsg176
else
if p1 = 'MOVEEQUIPMENT' then
Val := cRepMsg177
else
if p1 = 'DEFACTCONTRACTOR' then
Val := cRepMsg178
else
if p1 = 'DATEGETTING' then
Val := cRepMsg179
else
if p1 = 'DATEEXECUTION' then
Val := cRepMsg180
else
if p1 = 'FORCOMPONENT' then
Val := cRepMsg181
else
if p1 = 'R25HOMEANDAPPROACH' then
Val := cRepMsg191
else
if p1 = 'R25NAME' then
Val := cRepMsg182
else
if p1 = 'R25COOPERATIVE' then
Val := cRepMsg183
else
if p1 = 'R25HEO' then
Val := cRepMsg184
else
if p1 = 'R25AGREED' then
Val := cRepMsg185
else
if p1 = 'R25BOXINSTALLED' then
Val := cRepMsg186
else
if p1 = 'R25PRESENCEPOWER200WFROMNETWORK' then
Val := cRepMsg187
else
if p1 = 'R25CABLESETTOBOX' then
Val := cRepMsg188
else
if p1 = 'R25FIBEROPTICWELDED' then
Val := cRepMsg189
else
if p1 = 'R25EQUIPMENTINSTALLED' then
Val := cRepMsg190
else
//Tolik
if p1 = 'CROSSCONNECTION' then
Val := cRepMsg205
else
if p1 = 'BUILDINGDISTRIBUTOR' then
Val := cRepMsg228
else
if p1 = 'REELSCABLEFLOW' then
//Tolik 07/09/2020 --
// Val := ReelsCableFlow.Text
begin
if Assigned(ReelsCableFlow) then
Val := ReelsCableFlow.Text
else
Val := '';
end
else
if p1 = 'CABLEREZERV' then
Val := cRepMsg229
else
if p1 = 'WACOORDINATES' then
Val := cRepMsg238
else
if p1 = 'PATH' then
Val := cRepMsg230
else
if p1 = 'CABLE' then
Val := cRepMsg240
else
if p1 = 'CABLEWIREMARKING' then
Val := cRepMsg247
else
if p1 = 'TRACE' then
Val := cRepMsg248
else
if p1 = 'CABLETRACEPART' then
Val := cRepMsg249
else
if p1 = 'TRACEBEGIN' then
Val := cRepMsg250
else
if p1 = 'TRACEEND' then
Val := cRepMsg251
else
if p1 = 'CABLEWIRE' then
Val := cRepMsg252
else
if p1 = 'ONPROJECT' then
Val := cRepMsg253
else
if p1 = 'CABLELAID' then
Val := cRepMsg254
else
if p1 = 'COUNTANDCROSSSQUARE' then
Val := cRepMsg255
else
if p1 = 'CABLEMARK' then
Val := cRepMsg256
else
if p1 = 'CABLETUBEJOURNAL' then
Val := cRepMsg257
else
if p1 = 'THEN' then
Val := cRepMsg206
else
if p1 = 'PARTCABLELENGTH' then
Val := cRepMsg237
else
if p1 = 'PRIORCOSTOFPROJECT' then
Val := cRepMsg192
else
// к основной рамке на чертеж (подписи)(Tolik)
if p1 = 'RAZRABOTAL' then
Val := cRepMsg260
else
if p1 = 'PROVERIL' then
Val := cRepMsg261
else
if p1 = 'NCONTROL' then
Val := cRepMsg262
else
if p1 = 'TCONTROL' then
Val := cRepMsg263
else
if p1 = 'UTVERDIL' then
Val := cRepMsg264
{ Значения из свойств проекта и листа}
else
if p1 = 'STAMPDEVELOPER' then
try
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampDeveloper // разработал
except
end
else
if p1 = 'MAINENGINEER' then
try
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampMainEngineer //главный инженер проекта
except
end
else
if p1 = 'STAMPCHECKER' then
try
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampChecker // проверил
except
end
else
if p1 = 'STAMPAPPROVED' then
try
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampApproved // утвердил
except
end
else
if p1 = 'DESIGNSTAGE' then
try
// Tolik -- 24/02/2020 --
if Assigned(GCadForm) then
Val := GCadForm.FListSettings.CADStampDesignStage
else
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampDesignStage // стадия проектирования
except
end
else
if p1 = 'PROECTORGANIZATION' then
try
Val := F_ProjMan.GSCSBase.CurrProject.Setting.OrganizationName // наименование организации проектировщика
except
end
else
if p1 = 'LISTSIGN' then
try
Val := F_ProjMan.GSCSBase.CurrProject.ProjectLists.Items[0].Setting.CADStampListSign // обозначение документа
except
end
//
else
begin
val := GetStrFromStringsByKey(FRepMsgList, p1);
end;
end
else if Name = 'GETLOAT' then
begin
val := FloatToStrFix(p1, FloatPrecision);
end;
{if Name = 'EOPAGE' then
begin
// передаём номер по порядку - Npp - из базы
P1 := ExpandVariables(P1);
// и предыдущий номер по порядку - Npp - из базы
P2 := ExpandVariables(P2);
// если они равны, то № п/п = - 1; - для нормальной нумерации в отчёте
if P1 = P2 then
Val := - 1
else
Val := 0;
end;}
{if Name = 'HIDEZERO' then
if p1 = 0 then
Val := false
else
Val := true; }
end;
// added dy Tolik
function GetListName(AComponent: TSCSComponent): String;
var //ListCatalog: TCatalog;
SCSList: TSCSList;
begin
Result := '';
SCSList := nil;
SCSList := AComponent.GetListOwner; //TF_Main(GForm).GSCSBase.CurrProject.GetListBySCSID(AIDList);
if Assigned(SCSList) then
Result := SCSList.GetNameForVisible(false);
//ListCatalog := TF_Main(GForm).DM.GetCatalogByComponAndItemType(AIDComponent, itList);
//Result := ListCatalog.Name;
end;
// процедура записи маркировки и длины линейных компонетов по пути кабеля в списки
Procedure AddtoPropList(propList1,propList2:TStringList; SCSComponent : TSCSComponent);
Var
s: string;
i: integer;
SCSCatalog: TSCSCatalog;
TopComponent: TSCSComponent;
Begin
SCSCatalog := SCSComponent.GetFirstParentCatalog; //трасса
SCSCatalog.LoadLength;
if SCSCatalog.Length <> 0 then
begin
SCSCatalog.LoadLength;
TopComponent := SCSComponent.GetTopComponent; // элемент, в который вложен кабель (если есть)
TopComponent.LoadCurrLength;
//showmessage(floattostr(RoundCP(TopComponent.Length)));
s:='';
if TopComponent<>SCSComponent then // если кабель вложен
begin
if TopComponent.NameMark = '' then //если нет маркировки
begin
if TopComponent.NameShort <> '' then
s:=TopComponent.NameShort + ' ' + inttostr(TopComponent.MarkID);
end
else s := TopComponent.NameMark; // есть маркировка
if s = '' then // нет ни маркировки ни обозначения - забиваем наименование(не более 14 символов)
begin
for i := 1 to Length(TopComponent.Name) do
begin
s:=s + TopComponent.Name[i];
if i = 14 then break;
end;
end;
//наименование
propList1.BeginUpdate;
propList1.Add(s);
propList1.EndUpdate;
//длина компонента или трассы
propList2.BeginUpdate;
propList2.Add(Floattostr(RoundCP(SCSComponent.GetPartLength)));
propList2.EndUpdate;
end
else // кабель лежит на трассе
begin
//наименование трассы
propList1.BeginUpdate;
propList1.Add(SCSComponent.GetFirstParentCatalog.Name + inttostr(SCSComponent.GetFirstParentCatalog.MarkID));
propList1.EndUpdate;
//длина трассы
propList2.BeginUpdate;
propList2.Add(floattostr(RoundCP(SCSComponent.Length-SCSComponent.LengthReserv)));
propList2.EndUpdate;
end;
end;
End; //пипец
Procedure GetCablePath(SCSCompon: TSCSComponent; propList,PropList1: TStringList; var ComponList: TSCSComponents);
Var
FirstCompon, LastCompon: TSCSComponent;
m,x, PortCountFrom, PortCountTo : integer;
s : string;
currTrace,NextTrace: TFigure; // трассы, по которым проходит кабель
currLine: TOrthoLine; // текущая трасса
FirstTraceFound, NextTraceFound: Boolean; // две соседние трассы
Figure: TFigure;
Ortholine: TOrtholine;
Connector1, Connector2, Connector3, Connector4: TConnectorObject; // коннекторы трасс
Compon1, Compon2, Compon3, Compon4: TSCSComponent; // компоненты, сидящие на коннекторах трасс
currSCSCatalog, nextSCSCatalog: TSCSCatalog;
PartSCSComponent1,PartSCSComponent2: TSCScomponent;
ListName: string;
FromNppPort1: integer;
ListOwner: TSCSList;
TraceListOwner : TSCSList;
ListCAD : TF_CAD;
// Tolik 29/09/2016 --
CanAddBetweenFloorHeinght: Boolean;
Begin
FirstCompon := SCSCompon.FirstConnectedConnCompon;//.GetTopComponent;
LastCompon := SCSCompon.LastConnectedConnCompon;//.GetTopComponent;
PortCountFrom := 0;
PortCountTo := 0;
// определяем количество портов у конечных объектов на кабеле
// для отчета берем маркировку топового компонента от объекта, у которого
// портов больше (это будет предположительно, шкаф, панель и т.п.)
// у объекта, имеющего меньше портов берем его маркировку
if (FirstCompon <> nil) and (LastCompon <> nil) then
begin
if (FirstCompon.GetTopComponent <> nil) and (FirstCompon.GetTopComponent.IsLine <> 1) then
begin
if FirstCompon.GetTopComponent.Interfaces <> nil then
begin
if FirstCompon.GetTopComponent.Interfaces.Count = 0 then
FirstCompon.GetTopComponent.LoadInterfaces(-1, false);
PortCountFrom := GetPortsCount(FirstCompon.GetTopComponent, 1, true);
end;
end;
if (LastCompon.GetTopComponent <> nil) and (LastCompon.GetTopComponent.IsLine <> 1) then
begin
if LastCompon.GetTopComponent.Interfaces <> nil then
begin
if LastCompon.GetTopComponent.Interfaces.Count = 0 then
LastCompon.GetTopComponent.LoadInterfaces(-1, false);
PortCountTo := GetPortsCount(LastCompon.GetTopComponent, 1, true);
end;
end;
if PortCountFrom > PortCountTo then
FirstCompon := FirstCompon.GetTopComponent;
if PortCountTo > PortCountFrom then
LastCompon := LastCompon.GetTopComponent;
PropList.Add(FirstCompon.NameMark);
PropList1.Add(' ');
end;
s := '';
for x := 0 to ComponList.Count - 1 do
begin
s := '';
nextSCSCatalog := nil;
PartSCSComponent1 := ComponList[x];
ListOwner:=PartSCSComponent1.GetListOwner;
currSCSCatalog := PartSCSComponent1.GetFirstParentCatalog; // трасса
U_ResourceReport.AddtoPropList(propList,propList1,PartSCSComponent1); // добавляем трассу в список
// получаем кабель(частями)
currSCSCatalog.LoadLength; // длина трассы
// если трасса не последняя в списке, то берем следующую
// и ищем предмет, лежащий на стыке трасс (если есть)
//09/03/2016
//if x <> SCSCompon.WholeComponent.Count-1 then
if (x <> (SCSCompon.WholeComponent.Count - 1)) and (x <> (ComponList.Count - 1)) then
begin
PartSCSComponent2 := ComponList[x+1];
nextSCSCatalog := PartSCSComponent2.GetFirstParentCatalog;
nextSCSCatalog.LoadLength; // длина трассы
TraceListOwner := currSCSCatalog.GetListOwner; //лист, на котором находится трасса
ListCad := GetListByID(TraceListOwner.SCSID); // Кад, на котором нарисована трасса
currTrace := nil; // на всякий
nextTrace := nil;
connector1 := nil;
connector2 := nil;
connector3 := nil;
connector4 := nil;
compon1 := nil;
compon2 := nil;
compon3 := nil;
compon4 := nil;
currTrace := (TOrthoLine(GetFigureByID(ListCad,currSCSCatalog.SCSID)));
// первая трасса
// ищем трассу на Каде
if currTrace <> nil then //нашли трассу на КАДе
begin
connector1 := TConnectorObject(Tortholine(CurrTrace).JoinConnector1);
if connector1.JoinedConnectorsList.Count<>0 then
begin
// первый коннектор трассы
connector1:=TConnectorObject(connector1.JoinedConnectorsList[0]);
currSCSCatalog := ListOwner.GetCatalogFromReferencesBySCSID(connector1.ID);
if currSCSCatalog.SCSComponents.Count<> 0 then
Compon1:=currSCSCatalog.SCSComponents[0];
end;
// второй коннектор трассы
connector2 := TConnectorObject(Tortholine(CurrTrace).JoinConnector2);
if connector2.JoinedConnectorsList.Count<>0 then
begin
connector2:=TConnectorObject(connector2.JoinedConnectorsList[0]);
currSCSCatalog := ListOwner.GetCatalogFromReferencesBySCSID(connector2.ID);
if currSCSCatalog.SCSComponents.Count<> 0 then
Compon2:=currSCSCatalog.SCSComponents[0];
end;
end;
// вторая трасса
TraceListOwner := nextSCSCatalog.GetListOwner; //лист, на котором находится трасса
ListCad:=GetListByID(TraceListOwner.SCSID); // Кад, на котором нарисована трасса
nextTrace := (TOrthoLine(GetFigureByID(ListCad,nextSCSCatalog.SCSID)));
if nextTrace <> nil then //нашли трассу на КАДе
begin
//первый коннектор трассы
connector3 := TConnectorObject(Tortholine(nextTrace).JoinConnector1);
if connector3.JoinedConnectorsList.Count<>0 then
begin
connector3:=TConnectorObject(connector3.JoinedConnectorsList[0]);
nextSCSCatalog := ListOwner.GetCatalogFromReferencesBySCSID(connector3.ID);
if nextSCSCatalog.SCSComponents.Count<> 0 then
Compon3:=nextSCSCatalog.SCSComponents[0];
end;
// второй коннектор трассы
connector4 := TConnectorObject(Tortholine(nextTrace).JoinConnector2);
if connector4.JoinedConnectorsList.Count<>0 then
begin
connector4:=TConnectorObject(connector4.JoinedConnectorsList[0]);
nextSCSCatalog := ListOwner.GetCatalogFromReferencesBySCSID(connector4.ID);
if nextSCSCatalog.SCSComponents.Count<> 0 then
compon4:=nextSCSCatalog.SCSComponents[0];
end;
end;
// определяем компонент на стыке трасс
s:='';
if ((compon1 <> nil) and ((compon1 = compon3) or (compon1 = compon4))) then
begin
// если есть компонент - делаем следующее:
// если есть маркировка - добавляем в список
// если нет - ищем обозначение компонента и индекс
// если и их нет - берем название компонента и обрезаем до 14 символов,
// если его длина больше
if compon1.NameMark<>'' then
s:=compon1.NameMark
else
if compon1.NameShort<>'' then
s:=s+compon1.NameShort+inttostr(compon1.MarkID);
if s='' then
begin
for m := 0 to Length(compon1.Name) do
begin
s:=s + compon1.Name[m];
if m = 14 then
break;
end;
end;
// добавляем объект в список
propList.BeginUpdate;
propList.Add(s);
propList.EndUpdate;
propList1.BeginUpdate;
propList1.Add(' ');
propList1.EndUpdate;
end;
s:=''; // на всякий случай
if ((compon2<>nil) and ((compon2 = compon3) or (compon2=compon4))) then
begin
if compon2.NameMark<>'' then
s:=compon2.NameMark
else
if compon2.NameShort<>'' then
s:=s+compon2.NameShort+inttostr(compon2.MarkID);
if s='' then
begin
for m := 0 to Length(compon2.Name) do
begin
s:=s + compon2.Name[m];
if m = 14 then
break;
end;
end;
// добавляем объект в список
propList.BeginUpdate;
// Tolik 29/09/2016--
// propList.Add(s);
propList.Add(copy(s, 1, 14));
//
propList.EndUpdate;
propList1.BeginUpdate;
propList1.Add(' ');
propList1.EndUpdate;
end;
// смотрим, есть ли межэтажное перекрытие
// if ((TOrthoLine(currTrace).FIsRaiseUpDown) and (TOrthoLine(nextTrace).FIsRaiseUpDown)) then
if PartSCSComponent1.GetListOwner <> PartSCSComponent2.GetListOwner then
begin
CanAddBetweenFloorHeinght := True;
// не добавлять высоту межэтежки, если попали на магистраль
{if ((TOrthoLine(currTrace).JoinConnector1 <> nil) and (TConnectorObject(TOrthoLine(currTrace).JoinConnector1).FConnRaiseType in
[crt_BetweenFloorDown, crt_BetweenFloorUP, crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(currTrace).JoinConnector2 <> nil) and (TConnectorObject(TOrthoLine(currTrace).JoinConnector2).FConnRaiseType in
[crt_BetweenFloorDown, crt_BetweenFloorUP, crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(NextTrace).JoinConnector1 <> nil) and (TConnectorObject(TOrthoLine(NextTrace).JoinConnector1).FConnRaiseType in
[crt_BetweenFloorDown, crt_BetweenFloorUP, crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(NextTrace).JoinConnector2 <> nil) and (TConnectorObject(TOrthoLine(NextTrace).JoinConnector2).FConnRaiseType in
[crt_BetweenFloorDown, crt_BetweenFloorUP, crt_TrunkUP, crt_TrunkDown])) then
CanAddBetweenFloorHeinght := False;}
if ((TOrthoLine(currTrace).JoinConnector1 <> nil) and (TConnectorObject(TOrthoLine(currTrace).JoinConnector1).FConnRaiseType in
[crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(currTrace).JoinConnector2 <> nil) and (TConnectorObject(TOrthoLine(currTrace).JoinConnector2).FConnRaiseType in
[crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(NextTrace).JoinConnector1 <> nil) and (TConnectorObject(TOrthoLine(NextTrace).JoinConnector1).FConnRaiseType in
[crt_TrunkUP, crt_TrunkDown])) or
((TOrthoLine(NextTrace).JoinConnector2 <> nil) and (TConnectorObject(TOrthoLine(NextTrace).JoinConnector2).FConnRaiseType in
[crt_TrunkUP, crt_TrunkDown])) then
CanAddBetweenFloorHeinght := False;
if CanAddBetweenFloorHeinght then
begin
// если задана высота межэтажного перекрытия, добавляем его (там же тоже кабель проходит)
if currSCSCatalog.ProjectOwner.Setting.HeightThroughFloor > 0 then
begin
propList.BeginUpdate;
propList.Add(cRepMsg231);
propList.EndUpdate;
propList1.BeginUpdate;
propList1.Add(FloatToStr(currSCSCatalog.ProjectOwner.Setting.HeightThroughFloor));
propList1.EndUpdate;
end;
end;
end;
end;
end;
if (FirstCompon <> nil) and (LastCompon<>nil) then
begin
// Tolik --29/09/2016--
PropList.Add(LastCompon.NameMark);
PropList1.Add(' ');
end;
if ComponList <> nil then FreeAndNil(ComponList);
End; // пипец
// украдено у Игоря by Tolik из TSCSComponent.DefineFirstLast (модуль U_SCSComponent)
// правда, немножко переделано совсем
Procedure SetActualOrderInPartComponent(aComponent: TSCSComponent; ComponList : TSCSComponents; FromNppPort1 : integer; ListName : String);
Var
Component : TSCSComponent;
SortedWholeComponent: TIntList;
my_comp, ComponentToOrder: TSCSComponent;
StepComponent: TSCSComponent;
JoinedComponent: TSCSComponent;
i, j: Integer;
portcount1, portcount2 : integer;
ListOwner: TSCSList;
EndPointCad : TF_CAD;
PointComponent : TSCSComponent;
SCSCatalog : TSCSCatalog;
SCSInterfaces: TSCSInterfaces;
Begin
Component := aComponent;
// SCSCatalogs := TSCSCatalogs.Create(false);
SortedWholeComponent := TIntList.Create;
Component.DefineFirstLast;
ComponentToOrder := nil;
ListOwner := Component.GetListOwner;
my_comp := Component.FirstConnectedConnCompon.GetTopComponent;
if my_comp <> nil then
begin
SCSInterfaces := my_comp.GetInterfacesByIsPort(1, True, -1, nil);
portcount1 := SCSInterfaces.Count;
// Tolik -- 20/02/2017 -*- утечка памяти
SCSInterfaces.Clear;
SCSInterfaces.Free;
//
my_comp := Component.LastConnectedConnCompon.GetTopComponent;
SCSInterfaces := my_comp.GetInterfacesByIsPort(1, True, -1, nil);
portcount2 := SCSInterfaces.Count;
// Tolik -- 20/02/2017 -*-
SCSInterfaces.Clear;
SCSInterfaces.Free;
//
ComponentToOrder := Component.FirstConnectedConnCompon;
// Сразу же определяем порядок листов для отчета
// и порт шкафа
begin
if Component.FirstConnectedConnCompon.ListID = Component.LastConnectedConnCompon.ListID then
ListName := U_ResourceReport.GetListName(Component.FirstConnectedConnCompon)
else
begin
if Portcount1 >= PortCount2 then
ListName := U_ResourceReport.GetListName(Component.FirstConnectedConnCompon)+'/'+GetListName(Component.LastConnectedConnCompon)
else
ListName := U_ResourceReport.GetListName(Component.LastConnectedConnCompon)+'/'+GetListName(Component.FirstConnectedConnCompon);
end;
end;
if PortCount1 >= PortCount2 then
ComponentToOrder := Component.FirstConnectedConnCompon
else
begin
ComponentToOrder := Component.LastConnectedConnCompon;
Component.LastConnectedConnCompon := Component.FirstConnectedConnCompon;
Component.FirstConnectedConnCompon := ComponentToOrder;
end;
FromNppPort1 := Component.FirstConnectedConnCompon.MarkID ;
if Component<> nil then
begin
for i := 0 to Component.WholeComponent.Count - 1 do
begin
for j := 0 to ComponentToOrder.JoinedComponents.Count - 1 do
begin
StepComponent := ComponentToOrder.JoinedComponents[j];
if ((SortedWholeComponent.IndexOf(StepComponent.ID)= -1) and (Component.WholeComponent.IndexOf(StepComponent.ID)<> -1)) then
begin
SortedWholeComponent.Add(StepComponent.ID);
ComponList.Add(StepComponent);
ComponentToOrder := StepComponent;
SCSCatalog := StepComponent.GetFirstParentCatalog;
break;
end;
end;
end;
end;
ComponentToOrder := Component;
//*** Не один участок кабеля не ушел в пизду
if ComponentToOrder.WholeComponent.Count = SortedWholeComponent.Count then
begin
ComponentToOrder.WholeComponent.Clear;
ComponentToOrder.WholeComponent.Assign(SortedWholeComponent);
end;
SortedWholeComponent.Free;
end;
End;
//
// сортировка массива кабелей по убыванию в массиве типов
Procedure SortCables (var CableTypes : TCableTypeArray);
Var
i,j,l: integer;
k: double;
SortAgain: boolean;
s: string;
Begin
if Length(CableTypes) > 1 then
begin
for i := 0 to Length(CableTypes) - 1 do
begin
// если элементов массива больше двух, выполняем "пузырьковую сортировку"
if Length(CableTypes[i].Cables) > 2 then
begin
repeat
SortAgain := false;
for j := 0 to Length(CableTypes[i].Cables) - 2 do
begin
if CableTypes[i].Cables[j].Length < CableTypes[i].Cables[j + 1].Length then
begin
k := CableTypes[i].Cables[j].Length; // длина кабеля
l := CableTypes[i].CableIDs[j]; // идентификатор
CableTypes[i].Cables[j].Length := CableTypes[i].Cables[j + 1].Length;
CableTypes[i].CableIDs[j] := (CableTypes[i].CableIDs[j + 1]);
CableTypes[i].Cables[j + 1].Length := k;
CableTypes[i].CableIDs[j + 1] := l;
SortAgain := true;
end;
end;
until not SortAgain;
end;
// если кабеля всего 2, то, при необходимости, меняем их местами
if Length(CableTypes[i].Cables) = 2 then
begin
if CableTypes[i].Cables[0].Length < CableTypes[i].Cables[1].Length then
begin
k := CableTypes[i].Cables[0].Length; // длина кабеля
l := CableTypes[i].CableIDs[0]; // идентификатор
CableTypes[i].Cables[0].Length := CableTypes[i].Cables[1].Length;
CableTypes[i].CableIDs[0] := (CableTypes[i].CableIDs[1]);
CableTypes[i].Cables[1].Length := k;
CableTypes[i].CableIDs[1] := l;
SortAgain := true;
end;
end;
end;
end;
End;
// функция "можно ли еще чего отрезать от данной катушки"
Function CanCutReel (var Reel : TCableReels; var Cables : array of TCables) : boolean;
Var
i: integer;
Begin
Result := false;
for i := 0 to Length(Cables) - 1 do
begin
if not Cables[i].Selected then
// если остаток кабеля в катушке больше отрезка кабеля
if (Reel.Rest >= Cables[i].Length) and (Cables[i].Selected = false) then
begin
Result := true;
Reel.CanCut := true;
break;
end;
end;
If not Result then
Reel.CanCut := False; // если ничего уже нельзя отрезать, помечаем катушку как отработанную
End;
// функция для формирования списка айдишников отобранных кабелей
Function AddCableId(var CableIdsList:TIntList; CableId : integer) : boolean;
Var
i: integer;
Begin
Result := True;
if CableIdsList <> nil then
begin
if CableIdsList.Count > 0 then
begin
for i := 0 to CableIdsList.Count - 1 do
begin
if CableIdsList[i] = CableId then
Result := False;
end;
end
else
Result := True;
end
else
begin
CableIdsList := TIntList.Create;
Result := True;
end;
if Result then
begin
CableIdsList.Add(CableId);
end;
End;
// процедура записи наименований катушек в таблицу
//no comments (сам не понял,чего написал)
Procedure CableReelNamesToMemTable(aMemTable : TkbmMemTable; CableTypes : TCableTypeArray);
Var
i,j,k,l: integer;
ReelFound: boolean;
ReelCount: integer;
s: string;
Begin
ReelCount := 0;
// если таблица не пустая
if not aMemTable.IsEmpty then
begin
// если список кабелей не пустой
if Length(CableTypes) > 0 then
begin
if aMemTable.RecordCount > 0 then
begin
aMemTable.First;
repeat
ReelFound := False;
ReelCount := 0;
l := aMemTable.FieldValues['ID'];
for i := 0 to Length(CableTypes) - 1 do
begin
if Length(CableTypes[i].Reels) > 0 then
begin
for j := 0 to Length(CableTypes[i].Reels) - 1 do
begin
if CableTypes[i].Reels[j].CableIDs.Count > 0 then
begin
for k := 0 to CableTypes[i].Reels[j].CableIDs.Count - 1 do
begin
if l = CableTypes[i].Reels[j].CableIDs[k] then
begin
if ReelCount = 0 then
begin
aMemTable.Edit;
aMemTable.FieldByName('REELNAME').AsString :=' ('+ CableTypes[i].ReelName + cRepMsg234+ inttostr(j+1)+')';
ReelFound := True;
aMemTable.Post;
inc(ReelCount);
break;
end
else //для кабеля с длиной, превышающей длину поставки
begin
aMemTable.Edit;
s := aMemTable.FieldByName('REELNAME').Value;
delete(s, pos(')',s), 1);
aMemTable.FieldByName('REELNAME').AsString := s + ', ' + inttostr(j+1)+')';
ReelFound := True;
inc(ReelCount);
aMemTable.Post;
break;
end;
//break;
end;
end;
end;
end;
end;
end;
if not ReelFound then
begin
aMemTable.Edit;
aMemTable.FieldByName('REELNAME').AsString := ' ('+ cRepMsg233+')';
aMemTable.Post;
end
else
if ReelCount > 1 then
begin
aMemTable.Edit;
s := aMemTable.FieldByName('REELNAME').value;
aMemTable.FieldByName('REELNAME').AsString := s + ' ('+ cRepMsg233+')';
aMemTable.Post;
end;
if not aMemTable.eof then
aMemTable.Next;
until aMemTable.Eof;
end;
end
else
begin
// Tolik 09/10/2017 --
if aMemTable.RecordCount > 0 then
begin
aMemTable.First;
repeat
aMemTable.Edit;
aMemTable.FieldByName('REELNAME').AsString := ' ('+ cRepMsg233+')';
aMemTable.Post;
if not aMemTable.eof then
aMemTable.Next;
until aMemTable.eof;
end;
end;
end;
End;
// процедура добавления типа кабеля в список
Procedure CableTypesAdd(SCSComponent : TSCSComponent; var CableTypes : TCableTypeArray; var CableIdsList : TIntList; CableID : Integer; aForm: TF_ResourceReport);
Var
i ,j: integer;
CableIn, TakeThisCable: boolean;
CurrSuppliesKind: TNBSuppliesKind;
k: double;
// CurrSuppliesKind : TNBSuppliesKind;
//процедура записи типа кабеля в список
Procedure SaveCableType(SCSComponent : TSCSComponent; CurrSuppliesKind: TNBSuppliesKind);
// Var
// currCableTypes : TCableTypeArray;
Begin
// Setlength(currCableTypes,length(currCableTypes)+1);
// сохраняем величину поставки(пригодится)
if CheckIsTradUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure) then
begin
// F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure
SetLength(CableTypes, Length(CableTypes) + 1);
CableTypes[Length(CableTypes) - 1].Length := RoundX(FloatInUOM(CurrSuppliesKind.Data.UnitKolvoTradUOM, umFoot, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
CableTypes[Length(CableTypes) - 1].CableIDs := TIntList.Create;
CableTypes[Length(CableTypes) - 1].Izm := GetNameUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure, true);
CableTypes[Length(CableTypes) - 1].CableCypher := SCSComponent.Cypher;
end
else
begin
SetLength(CableTypes, Length(CableTypes) + 1);
CableTypes[Length(CableTypes) - 1].Length := RoundX(FloatInUOM(CurrSuppliesKind.Data.UnitKolvo, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
CableTypes[Length(CableTypes) - 1].CableIDs := TIntList.Create;
// 18/10/2020 -- в метрической могут быть сантиметры....ю поэтому:
//CableTypes[Length(CableTypes) - 1].Izm := CurrSuppliesKind.Data.Izm; // единицы измерения
CableTypes[Length(CableTypes) - 1].Izm := GetNameUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure, true);
//
CableTypes[Length(CableTypes) - 1].CableCypher := SCSComponent.Cypher;
end;
CableTypes[Length(CableTypes) - 1].ReelName := CurrSuppliesKind.Data.Name; // наименование поставки(катушка, моток, боббина и т.п.)
// CableTypes[Length(CableTypes) - 1].Length := RoundX(FloatInUOM(CurrSuppliesKind.Data.UnitKolvoTradUOM, umFoot, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
CableTypes[Length(CableTypes) - 1].TypeName := CurrSuppliesKind.Data.GUID; // GUIDNB
CableTypes[Length(CableTypes) - 1].Name := SCSComponent.Name + ' ' + SCSComponent.ArticulProducer;// + ' ' + SCSComponent.NameMark + ' ' + SCSComponent.ArticulProducer;
// добавляем отрезок кабеля к данному типу
SetLength(CableTypes[Length(CableTypes) - 1].Cables, Length(CableTypes[Length(CableTypes) - 1].Cables) + 1);
if CheckIsTradUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure) then
Cabletypes[Length(CableTypes) - 1].Cables[Length(Cabletypes[Length(CableTypes) - 1].Cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue)
//RoundCP(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure))
else
Cabletypes[Length(CableTypes) - 1].Cables[Length(Cabletypes[Length(CableTypes) - 1].Cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
//RoundCP(SCSComponent.Length);
Cabletypes[Length(CableTypes) - 1].CableIDs.Add(CableID); // идентификатор кабеля
// Cabletypes[Length(CableTypes)-1].GuidNB := CurrSuppliesKind.Data.GUID;
End;
Begin
// SCSComponent.LoadWholeLength;
// SCSComponent.LoadWholeComponent(false);
// если кабель еще не выбирался
if AddCableID(CableIDsList, CableId) then
begin
CableIn := false;
CurrSuppliesKind := nil;
// получаем параметры поставки кабеля
CurrSuppliesKind := F_ProjMan.GSCSBase.CurrProject.Spravochnik.GetSuppliesKindByID(SCSComponent.IDSuppliesKind);
// если задан вид поставки
if CurrSuppliesKind <> nil then
begin
// Если длина кабеля превышает длину поставки - его не считаем
//TakeThisCable := True;
SCSComponent.LoadWholeLength; // загрузить длину кабеля по всей длине
{if CheckIsTradUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure) then
begin
if (RoundX(FloatInUOM(SCSComponent.Length, umMetr, umFoot), aForm.neKolvoPrecision.IntValue) >
//if (RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue) > // могут быть дюймы...
CurrSuppliesKind.Data.UnitKolvoTradUOM) then
TakeThisCable := false;
end
else
begin
if SCSComponent.Length > CurrSuppliesKind.Data.UnitKolvo then
TakeThisCable := false;
end;}
// Если кабель годится(длина не превышает величину поставки) - смотрим тип и отбираем типы кабелей
//if TakeThisCable then
begin
// проверяем на наличие типа кабеля
// если список типов пуст - добавляем сразу
if Length(CableTypes) = 0 then
SaveCableType(SCSComponent, CurrSuppliesKind)
else
// если список типов не пуст - проверяем, нет ли такого в списке
begin
CableIn := false;
for i := 0 to Length(CableTypes) - 1 do
begin
// есть такой кабель - добавляем этот отрезок кабеля в список с данному типу
// if CableTypes[i].TypeName = CurrSuppliesKind.Data.GUID then
if CableTypes[i].CableCypher = SCSComponent.Cypher then
begin
CableIn := true;
SetLength(CableTypes[i].cables,Length(CableTypes[i].cables) + 1);
if CheckIsTradUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure) then
// Cabletypes[Length(CableTypes) - 1].Cables[Length(Cabletypes[Length(CableTypes) - 1].Cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue)
CableTypes[i].cables[Length(CableTypes[i].cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue)
//RoundCP(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure))
else
// Cabletypes[Length(CableTypes) - 1].Cables[Length(Cabletypes[Length(CableTypes) - 1].Cables) - 1].Length := RoundX(SCSComponent.Length, aForm.neKolvoPrecision.IntValue);//RoundCP(SCSComponent.Length);
// Cabletypes[Length(CableTypes) - 1].Cables[Length(Cabletypes[Length(CableTypes) - 1].Cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
CableTypes[i].Cables[Length(CableTypes[i].cables) - 1].Length := RoundX(FloatInUOM(SCSComponent.Length, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure), aForm.neKolvoPrecision.IntValue);
CableTypes[i].CableIDs.Add(CableID); // идентификатор кабеля
break;
end;
end;
// нет такого типа кабеля в списке - добавляем
if not CableIn then
SaveCableType(SCSComponent,CurrSuppliesKind);
end;
end;
end // задана поставка
end; // кабель не выбирался
End;
// освобождение памяти, занятой массивом типов кабелей
Procedure FreeCableTypes(CableTypes : TCableTypearray);
Var
i,j: integer;
Begin
if Length(CableTypes) > 0 then
begin
for i := 0 to Length(CableTypes) - 1 do
begin
if Length(CableTypes[i].Reels) > 0 then
begin
for j := 0 to Length(CableTypes[i].Reels) - 1 do
begin
FreeAndNil(CableTypes[i].Reels[j].CableIDs);
end;
end;
FreeAndNil(CableTypes[i].CableIDs);
end;
end;
SetLength(CableTypes,0);
End;
// расчет количества катушек и резка кабелей от них
Procedure CableReelCalculate(CableTypes : TCableTypeArray; MethodType : string; var ReelsCableFlow : TStringList; aForm: TF_ResourceReport );
Var
i,j,k,l : integer;
ReelsCount : integer; // текущее расчетное количество катушек для типа кабеля
ReelsCounter : integer; // счетчик отработанных катушек
SCSComponent : TSCSComponent;
CableIn : Boolean;
CurrSuppliesKind: TNBSuppliesKind;
CableChecks : array of boolean;
TakeThisCable : Boolean;
s, OverReelString : string; // OverReelString - для единиц поставки, отрезанных от компонент с длиной, превышающей длину поставки
// Сброс параметров типов кабелей
Procedure DropCableTypesParam(CableTypes : TCableTypes);
Var i : integer;
Begin
// сбрасываем параметры кабелей для данного типа кабеля
if Length(CableTypes.Cables) > 0 then
begin
for i := 0 to Length(CableTypes.Cables) - 1 do
begin
CableTypes.Cables[i].Selected := False;
end;
end;
// сбрасываем параметры катушек
if Length(CableTypes.Reels) > 0 then
begin
for i := 0 to Length(CableTypes.Reels) - 1 do
begin
// остаток кабеля в катушке
CableTypes.Reels[i].Rest := CableTypes.Length;
// список отрезков кабелей
SetLength(CableTypes.Reels[i].Cables, 0);
// можно ли резать из катушки
CableTypes.Reels[i].CanCut := True;
// список айдишников кабелей (если есть)
if CableTypes.Reels[i].CableIDs <> nil then
begin
if CableTypes.Reels[i].CableIDs.Count > 0 then
CableTypes.Reels[i].CableIDs.Clear;
end;
end;
end;
End; // пипец
function getOverReels(var aReelsCount: integer; aOrder: Integer): string;
var i, j, k: integer;
ReelsCount : integer;
begin
Result := '';
aReelsCount := 0;
for k := 0 to Length(CableTypes[aOrder].Cables) - 1 do
begin
// если кабель больше величины поставки
if (CableTypes[aOrder].Cables[k].Selected = false) and (CableTypes[aOrder].Cables[k].Length >= CableTypes[aOrder].Length) then
begin
// отрезаем от кабеля размер катушки, пока он не станет меньше, чем величина поставки(катушки)
while CableTypes[aOrder].Cables[k].Length >= CableTypes[aOrder].Length do
begin
CableTypes[aOrder].Cables[k].Length := CableTypes[aOrder].Cables[k].Length - CableTypes[aOrder].Length;
SetLength(CableTypes[aOrder].Reels, Length(CableTypes[aOrder].Reels) + 1);
CableTypes[aOrder].Reels[Length(CableTypes[aOrder].Reels) - 1].Rest := 0;
//списов идентификаторов кабелей в катушке
CableTypes[aOrder].Reels[Length(CableTypes[aOrder].Reels) - 1].CableIDs := TIntList.Create;
CableTypes[aOrder].Reels[Length(CableTypes[aOrder].Reels) - 1].CableIDs.add(CableTypes[aOrder].CableIDs[k]);
Inc(aReelsCount);
if Result = '' then
Result := inttostr(aReelsCount)
else
Result := Result + ', ' + inttostr(aReeLsCount);
end;
end;
end;
if Result <> '' then
begin
if aReelsCount > 1 then
Result := 'Для кабелей с превышающей длиной катушки №№: ' + Result
else
Result := 'Для кабелей с превышающей длиной катушка №: ' + Result;
end;
end;
// расчет количества бухт и расхода кабелей
// режим еффективной работы
Procedure MaxEfficiency(CableTypes : TCableTypeArray);
Var
i,j,k,l : integer;
Counter : integer; // счетчик
AllCableLength : double;
s : string; // сточка для отчета (катушка № + список кабелей)
CableCut : Boolean;
overrellsCount: integer;
OverReelCount: integer;
OverReelStr: String;
Begin
// если список типов кабелей не пустой
if Length(CableTypes) > 0 then
begin
// формируем количество катушек
// для каждого типа кабеля
// делаем предварительный просчет количества катушек
// Tolik 02/11/2020 --
//кабели с длиной, превышающей длину поставки(коцаем)
for i := 0 to Length(CableTypes) - 1 do
begin
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
while CableTypes[i].Cables[j].Length > Cabletypes[i].Length do
begin
CableTypes[i].Cables[j].Length := CableTypes[i].Cables[j].Length - Cabletypes[i].Length;
SetLength(CableTypes[i].Reels, Length(CableTypes[i].Reels) + 1);
CableTypes[i].Reels[Length(CableTypes[i].Reels) -1].Rest := -1;
CableTypes[i].Reels[Length(CableTypes[i].Reels) -1].CableIDs := TIntList.Create;
CableTypes[i].Reels[Length(CableTypes[i].Reels) -1].CableIDs.Add(CableTypes[i].CableIDs[j]);
end;
end;
end;
//
for i := 0 to Length(CableTypes) - 1 do
begin
AllCableLength := 0;
Counter := 0;
// если есть список кабелей
if Length(CableTypes[i].Cables) > 0 then
begin
// получаем общую длину кабелей и их количество
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
AllCableLength := AllCableLength + CableTypes[i].Cables[j].Length;
Counter := Counter + 1;
end;
// если общая длина кабелей данного типа не нулевая, можно производить расчет количества катушек
if AllCableLength > 0 then
begin
// Tolik 02/11/2020 --
if CableTypes[i].Cables[j].Length > 0 then
begin
repeat
// добавляем катушку (единицу поставки, может быть и не катущка)
SetLength(CableTypes[i].Reels,Length(CableTypes[i].Reels) + 1);
if Length(CableTypes[i].Reels) >= 10000 then
begin
showmessage(cRepMsg236);
break;
end;
// начальный остаток в катушке - величина поставки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest := Cabletypes[i].Length;
//создаем список идентификаторов кабелей для катушки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].CableIDs := TIntList.Create;
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
// если остаток кабеля в катушке больше или равен размеру текущего кабеля заданного типа и кабель еще не отрезался - отрезаем
if (CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest >= CableTypes[i].Cables[j].Length) and (CableTypes[i].Cables[j].Selected = false) then
begin
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest := CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest - CableTypes[i].Cables[j].Length;
CableTypes[i].Cables[j].Selected := true;
// CableTypes[i].Reels[Length(CableTypes[i].Reels)-1].CableIDs.Add(CableTypes[i].CableIDs[j]); // идентификатор кабеля
Dec(Counter);
if Counter = 0 then
Break; //// BREAK ////; на всякий
//Counter := Counter - 1; // уменьшаем счетчик
end;
end;
until Counter = 0;
end;
// сбрасываем отметки кабелей
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
CableTypes[i].Cables[j].Selected := false;
end;
//возвращаем остатки в исходное положение
for j := 0 to Length(CableTypes[i].Reels) - 1 do
//CableTypes[i].Reels[j].Rest := CableTypes[i].Length;
if CableTypes[i].Reels[j].Rest <> -1 then // только не для катушек, отрезанных от кабеля с превышающей длиной
CableTypes[i].Reels[j].Rest := CableTypes[i].Length;
end;
end;
end; // финиш предварительного просчета
// теперь, если есть катушки - режем по алгоритму (от каждой по очереди ), пока не отрежем все кабели
// для каждого типа кабеля
for i := 0 to Length(CableTypes) - 1 do
begin
AllCableLength := 0;
Counter := 0;
ReelsCount := Length(CableTypes[i].Reels); // расчетное количество катушек данного типа кабеля
// если есть список кабелей
if Length(CableTypes[i].Cables) > 0 then
begin
// получаем общую длину кабелей и их количество
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
AllCableLength := AllCableLength + CableTypes[i].Cables[j].Length;
Counter := Counter + 1;
end;
// если общая длина кабелей данного типа не нулевая, можно резать
if AllCableLength > 0 then
begin
// сначала добавляем тип кабеля в список
ReelsCableFlow.Add(Cabletypes[i].Name);
// Для кабелей с превышающей длиной
OverReelStr := '';
OverReelCount := 0;
for j := 0 to Length(CableTypes[i].Reels) - 1 do
begin
if CableTypes[i].Reels[j].Rest = -1 then
begin
if OverReelStr = '' then
OverReelStr := inttostr(j + 1)
else
OverReelStr := OverReelStr + ', ' + inttostr(j + 1);
inc(OverReelCount);
end;
end;
if OverReelCount > 0 then
begin
if OverReelCount > 1 then
OverReelStr := 'Для кабелей с превышающей длиной катушки №№: ' + OverReelStr
else
OverReelStr := 'Для кабелей с превышающей длиной катушка №: ' + OverReelStr;
ReelsCableFlow.Add(OverReelStr);
end;
//
repeat
for j := 0 to Length(CableTypes[i].Reels) - 1 do
begin
ReelsCounter := 0; // счетчик отработанных катушек
// если от катушки можно чего отрезать ...
if CanCutReel(CableTypes[i].Reels[j],CableTypes[i].Cables) then
// то отрезаем
begin
for k := 0 to Length(CableTypes[i].Cables) - 1 do
begin
if ((CableTypes[i].Cables[k].Length <= CableTypes[i].Reels[j].Rest) and (CableTypes[i].Cables[k].Selected = False)) then
begin
// отрезаем
CableTypes[i].Reels[j].Rest := CableTypes[i].Reels[j].Rest - CableTypes[i].Cables[k].Length;
// добавляем к катушке идентификатор кабеля
CableTypes[i].Reels[j].CableIDs.Add(CableTypes[i].CableIDs[k]);
// добавляем к катушке кабель
SetLength(CableTypes[i].Reels[j].Cables, Length(CableTypes[i].Reels[j].Cables) + 1);
CableTypes[i].Reels[j].Cables[Length(CableTypes[i].Reels[j].Cables) - 1] := CableTypes[i].Cables[k].Length;
CableTypes[i].Cables[k].Selected := True; // отмечаем кабель как отрезанный
//Counter := Counter - 1; // уменьшаем счетчик неотрезанных кабелей
dec(Counter);
break;
end;
end;
end
// если от катушки отрезать ничего уже нельзя, то увеличиваем счетчик отработанных катушек
else
ReelsCounter := ReelsCounter + 1;
end;
// если приключилось так, что расчетного количества катушек не хватило, чтобы отрезать весь кабель
// (счеткик отработанных катушек будет равен их количеству, а счетчик отрезанных кабелей еще не обнулился),
// то нужно добавить катушку к данному типу кабелей и сбросить расчеты, чтобы все пересчиталось заново
if ((ReelsCounter = ReelsCount) and (Counter > 0)) then
begin
// сбрасываем расчеты для данного типа кабеля
DropCableTypesParam(CableTypes[i]);
// добавляем катушку (единицу поставки, может быть и не катущка)
SetLength(CableTypes[i].Reels,Length(CableTypes[i].Reels) + 1);
// начальный остаток в катушке - величина поставки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest := Cabletypes[i].Length;
//создаем список идентификаторов кабелей для катушки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].CableIDs := TIntList.Create;
// обновляем счетчик отрезанных кабелей для перерасчета
Counter := Length(CableTypes[i].Cables);
end;
until Counter = 0;
// добавляем список катушек с кабелями в лист для отчета
// катушки
for j := 0 to Length(CableTypes[i].Reels) - 1 do
begin
if CableTypes[i].Reels[j].Rest <> -1 then
begin
s := ' ' + CableTypes[i].ReelName + cRepMsg234 + inttostr(j + 1)+ ': ';
//s := ' ' + CableTypes[i].ReelName + cRepMsg234 + inttostr(overrellsCount + 1)+ ': ';
for k := 0 to Length(CableTypes[i].Reels[j].Cables) - 1 do
begin
s := s + FormatFloat('0.0##', CableTypes[i].Reels[j].Cables[k]);
if k < (Length(CableTypes[i].Reels[j].Cables) - 1) then
if Length(s) <> Length(' ' + CableTypes[i].ReelName + cRepMsg234 + inttostr(overrellsCount + 1)+ ': ') then
s := s + '; ';
end;
// s := s + cRepMsg235 + floattostr(Cabletypes[i].Reels[j].Rest) + CableTypes[i].Izm + cRepMsg232;
s := s + cRepMsg235 + FormatFloat('0.0##',Cabletypes[i].Reels[j].Rest) + ' ' + CableTypes[i].Izm + cRepMsg232;
ReelsCableFlow.Add(s);
end;
//inc(overrellsCount);
end;
end;
end;
end; // пока не отрежем все кабели
end;
End;
// расчет количества бухт и расхода кабелей
// режим економии кабеля
Procedure MaxScrapRate(CableTypes : TCableTypeArray);
Var
i,j,k,l : integer;
ReelsCount : integer;
AllCableLength : double;
rest : double;
AllCablesDistributed : boolean;
CableCut : boolean;
Counter : integer;
s : string;
overrellsCount: integer;
Begin
// если есть кабели
if Length(CableTypes) > 0 then
begin
// for each cable type count Reels
for i := 0 to Length(CableTypes) - 1 do
begin
AllCableLength := 0;
Counter := 0;
// если длина кабелей данного типа больше ноля
// можно считать расход кабеля
for j := 0 to Length(CableTypes[i].Cables) - 1 do
begin
AllCableLength := AllCableLength + CableTypes[i].Cables[j].Length;
Counter := Counter + 1;
end;
if AllCableLength > 0 then
begin
ReelsCableFlow.Add(CableTypes[i].Name);
// для кабелей с превышающей длиной
OverReelString := getOverReels(overrellsCount, i);
if OverReelString <> '' then
begin
ReelsCableFlow.Add(OverReelString);
end;
repeat
// добавляем катушку
SetLength(CableTypes[i].Reels, Length(CableTypes[i].Reels) + 1);
// если количество катушек больше 10000, то брякнемся (на всякий)
if Length(CableTypes[i].Reels) >= 10000 then
begin
showmessage(cRepMsg236);
break;
end;
// величина поставки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest := CableTypes[i].Length;
//списов идентификаторов кабелей в катушке
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].CableIDs := TIntList.Create;
// начинаем резать от нее все, что смогем
s := ' ' + CableTypes[i].ReelName + cRepMsg234 + inttostr(Length(CableTypes[i].Reels))+ ': ';
for k := 0 to Length(CableTypes[i].Cables) - 1 do
begin
// если кабель меньше остатка и еще не отрезался - отрезаем
if (CableTypes[i].Cables[k].Selected = false) and (CableTypes[i].Cables[k].Length < CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest) then
begin
// отрезаем от катушки
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest := CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest - CableTypes[i].Cables[k].Length;
// причисляем кабель к данной катушке
SetLength(CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Cables, Length(CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Cables) + 1 );
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Cables[Length(CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Cables) - 1] := CableTypes[i].Cables[k].Length;
// добавляем к катушке идентификатор кабеля
CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].CableIDs.Add(CableTypes[i].CableIDs[k]);
// отмечаем кабель как отрезанный
CableTypes[i].Cables[k].Selected := true;
// формируем строку (длины кабелей в катушке)
if Length(s)<> Length(' ' + CableTypes[i].ReelName + cRepMsg234 + inttostr(Length(CableTypes[i].Reels))+ ': ') then
s := s +' ; ';
s := s + FormatFloat('0.0##', CableTypes[i].Cables[k].Length);
Counter := Counter - 1; // уменьшаем счетчик
end;
end;
// s := s + cRepMsg235 + floattostr(CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest) + CableTypes[i].Izm + cRepMsg232;
s := s + cRepMsg235 + FormatFloat('0.0##', CableTypes[i].Reels[Length(CableTypes[i].Reels) - 1].Rest) + ' ' + CableTypes[i].Izm + cRepMsg232;
ReelsCableFlow.Add(s);
until Counter = 0;
s := '';
end;
end;
// округляем остатки
{ for i := 0 to Length(CableTypes)-1 do
begin
for j := 0 to Length(CableTypes[i].Reels)-1 do
begin
CableTypes[i].Reels[j].Rest := RoundX(CableTypes[i].Reels[j].Rest , aForm.neKolvoPrecision.IntValue);
end;
end; }
end;
End;
Begin
// очищаем или создаем список типов кабелей с катушками и
// отрезанными от них кабелями
if ReelsCableFlow = nil then
ReelsCableFlow := TStringList.Create
else
ReelsCableFlow.Clear;
// сортируем кабели по убыванию по типам
SortCables(CableTypes);
// расчет расхода по заданному алгоритму
if MethodType = 'MaxEfficiency' then
MaxEfficiency(CableTypes);
if MethodType = 'MaxScrapRate' then
MaxScrapRate(CableTypes);
End;
//Tolik -- 04/09/2016 --
{
Constructor TCableWayCompon.Create;
begin
FirstCompon := nil;
LastCompon := Nil;
Npp := 0;
Passed := False;
CanSeekSide1 := True;
CanSeekSide2 := True;
CableInterfName := '';
CableInterface := nil;
Side1ConnectedInterface := Nil;
Side2ConnectedInterface := Nil;
Side1InterfList := Nil;
Side2InterfList := Nil;
WayList := TList.Create;
GroupedNpp := TIntList.Create;
end;
Destructor TCableWayCompon.Destroy;
begin
FirstCompon := nil;
LastCompon := Nil;
CableInterface := nil;
Npp := 0;
Passed := False;
FreeAndNil(WayList);
FreeAndNil(GroupedNpp);
end; }
//////////////////////////
procedure TReportShablons.AddShablonToList(AID: Integer; AName: String;
AIsActive: Boolean);
begin
FRepShablons.AddObject(AName, TObject(AID));
if AIsActive then
FActiveShablonID := AID;
end;
procedure TReportShablons.DefineActiveShablonIfNoDefined;
begin
if FActiveShablonID = -1 then
// Если в списке есть еще другие шаблоны, то выбираем последний из списка
if FRepShablons.Count > 0 then
FActiveShablonID := Integer(FRepShablons.Objects[FRepShablons.Count-1]);
end;
procedure TReportShablons.ClearRepShablons;
begin
FRepShablons.Clear;
//AddShablonToList(0, cResourceReport_Msg9, true);
FActiveShablonID := -1;
end;
constructor TReportShablons.Create;
begin
inherited;
FActiveShablonID := -1;
FRepShablons := TStringList.Create;
FMessgShablonNoExists := cResourceReport_Msg9_2;
ClearRepShablons;
end;
destructor TReportShablons.Destroy;
begin
FreeAndNil(FRepShablons);
inherited;
end;
function TReportShablons.GetActiveShablonName: string;
begin
Result := GetShablonNameByID(FActiveShablonID);
end;
function TReportShablons.GetShablonNameByID(AID: Integer): string;
var
IndexOfID: Integer;
begin
Result := FMessgShablonNoExists;
IndexOfID := FRepShablons.IndexOfObject(TObject(AID));
if IndexOfID <> -1 then
Result := FRepShablons.Strings[IndexOfID];
end;
procedure TReportShablons.RemoveShablonNameByID(AID: Integer);
var
IndexOfID: Integer;
begin
if AID <> 0 then
begin
IndexOfID := FRepShablons.IndexOfObject(TObject(AID));
if IndexOfID <> -1 then
FRepShablons.Delete(IndexOfID);
//*** Определить новый активный шаблон
if AID = FActiveShablonID then
// Если стандартный есть в списке, то делаем его активным
if FRepShablons.IndexOfObject(TObject(0)) <> -1 then
FActiveShablonID := 0
else
begin
FActiveShablonID := -1;
DefineActiveShablonIfNoDefined;
end;
end;
end;
{ TReportItemParams }
constructor TReportItemParams.Create(AMode: TResourceReportFormMode; ARepType: Integer; AReportUseKind: TReportUseKind);
begin
inherited Create;
Mode := AMode;
RepType := ARepType;
ReportUseKind := AReportUseKind;
ReportUseByProjType := [];
CanHaveActiveComponents := biFalse;
CanHaveZeroPriceComponents := biFalse;
CanHaveFormMode := biFalse;
CanHavePageSize := biFalse;
CanHaveDismountAccount := biFalse;
CanHaveTemplate := biTrue;
CanHaveStamp := biFalse;
FullPathInCableJournal := biFalse;
CanHaveSupplyValue := biFalse;
CanRoundValue := biFalse;
CanAsPlacingInProj := biFalse;
CanGroupByCompType := biFalse;
CanFloorNppWithRoom := biFalse;
CanInTwoCopies := biFalse;
CanCabinetParams := biFalse;
CanResources := biFalse;
CanPricePrecision := biFalse;
CanKolvoPrecision := biFalse;
//Added by Tolik for ExplicationComponent Report
CanShowKabinet :=biFalse;
CanShowObjHierarchy :=biFalse;
CanGroupByName := biFalse;
//ShowHeightOfPlacing := biFalse; // 06/03/2018 --
GroupByHeightOfPlacing := biFalse;
//////////////////////////////////
CanShowResources := biFalse;
CanShowWorks := biFalse;
CanShowCablePaths := biFalse;
CanShowOldReportForm := biFalse;
PageToShow := 0;
GroupMode := biNone;
FSimpleShablons := TReportShablons.Create;
FStampShablons := TReportShablons.Create;
FReportSortInfo := TReportSortInfo.Create(Self);
end;
destructor TReportItemParams.Destroy;
begin
FreeAndNil(FSimpleShablons);
FreeAndNil(FStampShablons);
FreeAndNil(FReportSortInfo);
inherited;
end;
function TReportItemParams.GetShablonsByTemplateType(
ATemplateType: Integer): TReportShablons;
begin
Result := nil;
case ATemplateType of
ttSimple:
Result := FSimpleShablons;
ttStamp:
Result := FStampShablons;
end;
end;
{ TF_ResourceReport }
// ##### Конструктор #####
constructor TF_ResourceReport.Create(AOwner: TComponent; AForm: TForm);
begin
GForm := AForm;
ExportToXLSX := False;
ExportToDocX := False;
Inherited Create(AOwner);
end;
// ##### Деструктор #####
destructor TF_ResourceReport.Destroy;
begin
inherited;
end;
procedure TF_ResourceReport.FormCreate(Sender: TObject);
var
StrToAdd: String;
i: Integer;
TreeCollection: TTreeCollectionClass;
tmp: TTreeColumn;
RepParams: TReportItemParams;
PrevIconCount: Integer;
tmpKbmMemTable: TkbmMemTable;
procedure AddParamsToReportList(AItemName: String; AParams: TReportItemParams; AIsOn: Boolean = true);
var
Node: TFlyNode;
begin
Node := tvReports.Items.Add(nil, AItemName);
Node.ImageIndex := 0;
Node.SelectedIndex := Node.ImageIndex;
Node.Data := AParams;
if AIsOn then
Node.Cells[rciIsOn] := bsTrue
else
Node.Cells[rciIsOn] := bsFalse;
if AParams.CanHaveTemplate = biFalse then
begin
AParams.FSimpleShablons.FMessgShablonNoExists := '';
AParams.FStampShablons.FMessgShablonNoExists := '';
end
else
if (AParams.CanHaveStamp <> biTrue) then
AParams.FStampShablons.FMessgShablonNoExists := '';
AddSortFieldsToReportItemParams(AParams);
end;
{procedure AddListItem(AItemName: String; AItemMode: TResourceReportFormMode; ARepType: Integer;
ACanHaveActiveComponents: Integer; ACanHaveZeroPriceComponents: Integer = biFalse;
ACanHavePageSize: Integer = biFalse; ACanHaveFormMode: Integer = biFalse;
ACanHaveDismountAccount: Integer = biFalse; ACanStamp: Integer = biTrue;
AFullPathInCableJournal: Integer = biFalse);
var ListItem: TListItem;
ptrReportItemParams: TReportItemParams;
Node: TFlyNode;
StrMode: string;
StrRepType: string;
begin
//ListItem := lvReports.Items.Add;
//ListItem.Caption := AItemName;
//ListItem.ImageIndex := 21;
//GetMem(ptrReportItemParams, SizeOf(TReportItemParams));
ptrReportItemParams := TReportItemParams.Create(AItemMode, ARepType);
ptrReportItemParams.Mode := AItemMode;
ptrReportItemParams.RepType := ARepType;
ptrReportItemParams.CanHaveActiveComponents := ACanHaveActiveComponents;
ptrReportItemParams.CanHaveZeroPriceComponents := ACanHaveZeroPriceComponents;
ptrReportItemParams.CanHaveFormMode := ACanHaveFormMode;
ptrReportItemParams.CanHavePageSize := ACanHavePageSize;
ptrReportItemParams.CanHaveDismountAccount := ACanHaveDismountAccount;
ptrReportItemParams.CanHaveStamp := ACanStamp;
ptrReportItemParams.FullPathInCableJournal := AFullPathInCableJournal;
StrMode := '';
StrRepType := '';
case AItemMode of
fmUnsign: StrMode := 'fmUnsign';
fmRObject: StrMode := 'fmRObject';
fmRResources: StrMode := 'fmRResources';
fmRNorms: StrMode := 'fmRNorms';
fmRCable: StrMode := 'fmRCable';
fmRCableExceedLength: StrMode := 'fmRCableExceedLength';
fmRCableCanal: StrMode := 'fmRCableCanal';
fmRDisparityComponColor: StrMode := 'fmRDisparityComponColor';
fmRDisparityComponProducer: StrMode := 'fmRDisparityComponProducer';
fmRCableJournal: StrMode := 'fmRCableJournal';
fmRCableJournalExt: StrMode := 'fmRCableJournalExt';
fmRLegendObjectIcons: StrMode := 'fmRLegendObjectIcons';
fmRTypeComponents: StrMode := 'fmRTypeComponents';
fmRSpecification: StrMode := 'fmRSpecification';
fmRGOSTSpecification: StrMode := 'fmRGOSTSpecification';
fmRGOSTSpecificationA3: StrMode := 'fmRGOSTSpecificationA3';
fmRExplanatoryReport: StrMode := 'fmRExplanatoryReport';
end;
case ARepType of
rtResources: StrRepType := 'rtResources';
rtCable: StrRepType := 'rtCable';
rtCableCanal: StrRepType := 'rtCableCanal';
rtCableJournal: StrRepType := 'rtCableJournal';
rtCableJournalExt: StrRepType := 'rtCableJournalExt';
rtSpecification: StrRepType := 'rtSpecification';
rtGOSTSpecification: StrRepType := 'rtGOSTSpecification';
rtNorms: StrRepType := 'rtNorms';
rtExplanatoryReport: StrRepType := 'rtExplanatoryReport';
rtLegendObjectIcons: StrRepType := 'rtLegendObjectIcons';
end;
GLog.Add('RepParams := TReportItemParams.Create('+StrMode+', '+StrRepType+');');
//GLog.Add('RepParams.Mode := '+IntToStr(Ord(AItemMode))+';');
//GLog.Add('RepParams.RepType := '+IntToStr(ARepType)+';');
if ACanHaveActiveComponents = biTrue then
GLog.Add('RepParams.CanHaveActiveComponents := '+IntToStr(ACanHaveActiveComponents)+';');
if ACanHaveZeroPriceComponents = biTrue then
GLog.Add('RepParams.CanHaveZeroPriceComponents := '+IntToStr(ACanHaveZeroPriceComponents)+';');
if ACanHaveFormMode = biTrue then
GLog.Add('RepParams.CanHaveFormMode := '+IntToStr(ACanHaveFormMode)+';');
if ACanHavePageSize = biTrue then
GLog.Add('RepParams.CanHavePageSize := '+IntToStr(ACanHavePageSize)+';');
if ACanHaveDismountAccount = biTrue then
GLog.Add('RepParams.CanHaveDismountAccount := '+IntToStr(ACanHaveDismountAccount)+';');
if ACanStamp = biTrue then
GLog.Add('RepParams.CanHaveStamp := '+IntToStr(ACanStamp)+';');
if AFullPathInCableJournal = biTrue then
GLog.Add('RepParams.FullPathInCableJournal := '+IntToStr(AFullPathInCableJournal)+';');
GLog.Add('AddParamsToReportList('+AItemName+', RepParams);');
GLog.Add('');
//ListItem.Data := ptrReportItemParams;
AddParamsToReportList(AItemName, ptrReportItemParams);
//25.09.2007
//Node := tvReports.Items.Add(nil, AItemName);
//Node.ImageIndex := 21;
//Node.SelectedIndex := Node.ImageIndex;
//Node.Data := ptrReportItemParams;
//Node.Cells[rciIsOn] := bsTrue;
end;}
begin
CreateControls;
// Tolik 31/03/2020 --
ReportPagesVisibilityList := nil;
// Tolik 09/02/2018
isCompCable := False;
//
//*** tvReports
tvReports.Items.Clear;
tvReports.Columns.Clear;
//*** Колонка Вкл
TreeCollection := tvReports.Columns.Add(cResourceReport_Msg22_1, 'TTreeColumn');
//*** Колонка Вид отчета
TreeCollection := tvReports.Columns.Add(cResourceReport_Msg22_2, 'TTreeColumn');
//*** Колонка Шаблон
TreeCollection := tvReports.Columns.Add(cResourceReport_Msg22_3, 'TTreeColumn');
//*** Колонка Шаблон со штампом
TreeCollection := tvReports.Columns.Add(cResourceReport_Msg22_4, 'TTreeColumn');
tvReports.StructureCol := rciName;
//tvReports.Columns[tciSimple].EditorStyle.Sections.Add;
//tvReports.Columns[tciStamp].EditorStyle.Sections.Add;
tvReports.Columns[rciIsOn].EditorStyle.AutoComplete := true;
tvReports.Columns[rciIsOn].EditorStyle.EditorType := tetCheckBox;
tvReports.Columns[rciIsOn].EditorStyle.Ctl3d := true;
tvReports.Columns[rciIsOn].Width := 30;
//tvReports.Columns[rciIsOn].EditorStyle.Sections
// Tolik
tvReports.Columns[rciIsOn].Caption := '';
CheckAllReports.Left := 8;
CheckAllReports.Top := 2;
CheckAllReports.Hint := cexdAll;
CheckAllReports.ShowHint := True;
CheckAllReports.Parent := tvReports;
CheckAllReports.Refresh;
//
tvReports.Columns[rciName].AutoFit := true;
tvReports.Columns[rciName].EditorStyle.AutoComplete := true;
tvReports.Columns[rciName].EditorStyle.AutoDropDown := true;
tvReports.Columns[rciName].ReadOnly := true;
tvReports.Columns[rciName].Width := 210;
tvReports.Columns[rciSimple].EditorStyle.AutoComplete := true;
tvReports.Columns[rciSimple].Width := 100;
tvReports.Columns[rciStamp].EditorStyle.AutoComplete := true;
tvReports.Columns[rciStamp].Width := 50;
tvReports.Columns[rciSimple].EditorStyle.EditorType := tetDropDownList;
tvReports.Columns[rciStamp].EditorStyle.EditorType := tetDropDownList;
tvReports.Columns[rciSimple].EditorStyle.ButtonType := tbtDropDown;
tvReports.Columns[rciStamp].EditorStyle.ButtonType := tbtDropDown;
tvReports.Columns[rciSimple].EditorStyle.DropdownStyles := tvReports.Columns[rciSimple].EditorStyle.DropdownStyles+[ddsSized];
tvReports.Columns[rciStamp].EditorStyle.DropdownStyles := tvReports.Columns[rciStamp].EditorStyle.DropdownStyles+[ddsSized];
tvReports.ToolTips := true;
tvReports.ToolTipPause := 3000;
tvReports.StatesDrawed := false;
//*** tvReportTarget
tvReportTarget.Items.Clear;
tvReportTarget.Columns.Clear;
//*** Печать листа
TreeCollection := tvReportTarget.Columns.Add(cResourceReport_Msg23_1, 'TTreeColumn');
//*** Печать отчета
TreeCollection := tvReportTarget.Columns.Add(cResourceReport_Msg23_2, 'TTreeColumn');
//*** Наименование объекта
TreeCollection := tvReportTarget.Columns.Add(cResourceReport_Msg23_3, 'TTreeColumn');
tvReportTarget.StructureCol := 2;
tvReportTarget.Columns[0].EditorStyle.Ctl3d := true;
tvReportTarget.Columns[0].EditorStyle.EditorType := tetCheckBox;
//tvReportTarget.Columns[0].Prompt := 'Teeeeest';
tvReportTarget.Columns[0].Width := 20;
tvReportTarget.Columns[1].EditorStyle.Ctl3d := true;
tvReportTarget.Columns[1].EditorStyle.EditorType := tetCheckBox;
tvReportTarget.Columns[1].Width := 20;
tvReportTarget.Columns[2].ReadOnly := true;
tvReportTarget.Columns[2].Width := 200;
tvReportTarget.Images.Clear;
tvReportTarget.Images.AddImages(TF_Main(GForm).DM.ImageList_Dir);
// настраиваем иконки свертывания-развертывания
PrevIconCount := tvReportTarget.Images.Count;
tvReportTarget.Images.AddImages(TF_Main(GForm).DM.ImageList_FlyTree);
tvReportTarget.ButtonCollapsedIndex := tbiCollapsed + PrevIconCount;
tvReportTarget.ButtonExpandedIndex := tbiExpanded + PrevIconCount;
tvReportTarget.DefaultRowHeight := 17;
//tvReportTarget.Options := tvReportTarget.Options + [goRowSelect, goAlwaysShowEditor];
tvReportTarget.FitColumnToClientWidth := true;
tvReportTarget.ShowButtons := false;
tvReportTarget.StatesDrawed := false;
FcbCanHaveActiveComponentsCurr := nil;
FcbCanHaveDismountAccountCurr := nil;
{
AddListItem(cResourceReport_Msg1_1, fmRExplanatoryReport, rtExplanatoryReport, biFalse);
AddListItem(cResourceReport_Msg1_2, fmRSpecification, rtSpecification, biTrue, biTrue, biFalse, biFalse, biTrue, biFalse);
AddListItem(cResourceReport_Msg1_3, fmRGOSTSpecification, rtGOSTSpecification, biTrue, biFalse, biTrue, biFalse, biTrue, biFalse);
AddListItem(cResourceReport_Msg1_4, fmRCableJournal, rtCableJournal, biTrue, biFalse, biFalse, biFalse, biTrue);
//AddListItem(cResourceReport_Msg1_5_1, fmRCableJournalExt, rtCableJournalExt, biTrue, biFalse, biFalse, biFalse, biTrue);
//AddListItem(cResourceReport_Msg1_5_2, fmRCableJournalExt, rtCableJournalExt, biTrue, biFalse, biFalse, biFalse, biTrue, biTrue, biTrue);
AddListItem(cResourceReport_Msg1_5_1, fmRCableJournalExt, rtCableJournalExt, biTrue, biFalse, biFalse, biFalse, biTrue, biTrue, biTrue);
AddListItem(cResourceReport_Msg1_6, fmRResources, rtResources, biTrue, biTrue, biFalse, biTrue, biTrue);
AddListItem(cResourceReport_Msg1_7, fmRNorms, rtNorms, biTrue);
AddListItem(cResourceReport_Msg1_8, fmRCable, rtCable, biTrue, biFalse, biFalse, biFalse, biTrue);
//AddListItem('Ведомость кабелей с превышающей длиной', fmRCableExceedLength);
AddListItem(cResourceReport_Msg1_9, fmRCableCanal, rtCableCanal, biTrue, biFalse, biFalse, biFalse, biTrue);
AddListItem(cResourceReport_Msg1_10, fmRLegendObjectIcons, rtLegendObjectIcons, biTrue);
//AddListItem('Ведомость соединений по несоответствующим цветам', fmRDisparityComponColor);
//AddListItem('Ведомость соединений по несоответствующим производителям', fmRDisparityComponProducer);
}
//Tolik 07/09/2023 --
//*** Подключенные/свободные порты шкафа --
RepParams := TReportItemParams.Create(fmPortReport, rtPortReport, rkPortReport);
RepParams.CanHaveStamp := biFalse;
AddParamsToReportList(cResourceReport_Msg1_30, RepParams);
//
//*** Пояснительная записка
RepParams := TReportItemParams.Create(fmRExplanatoryReport, rtExplanatoryReport, rkProject);
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_1, RepParams);
//*** Спецификация
RepParams := TReportItemParams.Create(fmRSpecification, rtSpecification, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveZeroPriceComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
RepParams.CanResources := biTrue;
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
RepParams.GroupMode := gmComponType;
AddParamsToReportList(cResourceReport_Msg1_2, RepParams);
//*** Спецификация (ГОСТ 21.110-95)
RepParams := TReportItemParams.Create(fmRGOSTSpecification, rtGOSTSpecification, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveZeroPriceComponents := biTrue;
RepParams.CanHavePageSize := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
RepParams.CanResources := biTrue;
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
RepParams.GroupMode := gmComponType;
AddParamsToReportList(cResourceReport_Msg1_3, RepParams);
//*** Кабельный журнал
RepParams := TReportItemParams.Create(fmRCableJournal, rtCableJournal, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveStamp := biTrue;
RepParams.FullPathInCableJournal := biTrue;
// Tolik 09/11/2020 --
//RepParams.CanHaveSupplyValue := biTrue;
//RepParams.CanRoundValue := biTrue;
//
AddParamsToReportList(cResourceReport_Msg1_4, RepParams);
//*** Кабельный журнал ГОСТ
RepParams := TReportItemParams.Create(fmRGOSTCableJournal, rtGOSTCableJournal, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanShowOldReportForm := biFalse;
RepParams.FullPathInCableJournal := biTrue;
//RepParams.CanHaveStamp := biTrue;
//RepParams.FullPathInCableJournal := biTrue;
AddParamsToReportList(cResourceReport_Msg1_11, RepParams);
//*** Расширенный кабельный журнал
RepParams := TReportItemParams.Create(fmRCableJournalExt, rtCableJournalExt, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveStamp := biTrue;
RepParams.FullPathInCableJournal := biTrue;
AddParamsToReportList(cResourceReport_Msg1_5_1, RepParams);
//*** Кроссовый журнал
RepParams := TReportItemParams.Create(fmRCrossJournal, rtCrossJournal, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
AddParamsToReportList(cResourceReport_Msg1_21, RepParams);
//*** Кроссовый журнал (ГОСТ 21.110-95)
RepParams := TReportItemParams.Create(fmRGOSTCrossJournal, rtGOSTCrossJournal, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
AddParamsToReportList(cResourceReport_Msg1_22, RepParams);
//*** Ведомость ресурсов
RepParams := TReportItemParams.Create(fmRResources, rtResources, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveZeroPriceComponents := biTrue;
RepParams.CanHaveFormMode := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveStamp := biTrue;
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
AddParamsToReportList(cResourceReport_Msg1_6, RepParams);
//*** Ведомость сметных норм/расценок
RepParams := TReportItemParams.Create(fmRNorms, rtNorms, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_7, RepParams);
//*** Ведомость кабелей
RepParams := TReportItemParams.Create(fmRCable, rtCable, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveStamp := biTrue;
RepParams.CanAsPlacingInProj := biTrue;
// Tolik 09/11/2020 --
//RepParams.CanHaveSupplyValue := biTrue;
//RepParams.CanRoundValue := biTrue;
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
//
AddParamsToReportList(cResourceReport_Msg1_8, RepParams);
//*** Ведомость кабельных каналов
RepParams := TReportItemParams.Create(fmRCableCanal, rtCableCanal, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_9, RepParams);
//*** Легенда условных обозначений
RepParams := TReportItemParams.Create(fmRLegendObjectIcons, rtLegendObjectIcons, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_10, RepParams);
//*** Экспликация кабинетов
RepParams := TReportItemParams.Create(fmRExplicationRoom, rtExplicationRoom, rkProject);
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_19, RepParams);
//*** Экспликация компонентов
RepParams := TReportItemParams.Create(fmRExplicationComponent, rtExplicationComponent, rkProject);
{RepParams.CanHaveStamp := biTrue;
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanAsPlacingInProj := biTrue;
RepParams.CanGroupByCompType := biTrue;
}
// Changed by Tolik
RepParams.CanHaveStamp := biTrue;
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanAsPlacingInProj := biTrue;
RepParams.CanGroupByCompType := biTrue;
RepParams.CanHaveZeroPriceComponents := biTrue;
//RepParams.CanHaveFormMode := biTrue;
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
RepParams.CanShowKabinet := biTrue;
RepParams.CanShowObjHierarchy := biTrue;
RepParams.CanGroupByName := biTrue;
//RepParams.ShowHeightOfPlacing := biTrue; // Tolik -- 06/03/2018 --
RepParams.GroupByHeightOfPlacing := biTrue; // Tolik -- 06/03/2018 --
AddParamsToReportList(cResourceReport_Msg1_20, RepParams);
// Спецификация на компоненты
RepParams := TReportItemParams.Create(fmCompoSpecification, rtCompoSpecification, rkProject);
RepParams.CanHaveStamp := biFalse;
RepParams.CanHaveTemplate := biFalse;
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
AddParamsToReportList(cResourceReport_Msg1_25, RepParams, false);
// Дом с подъездом
RepParams := TReportItemParams.Create(fmRHouse, rtHouse, rkProject);
RepParams.CanHaveStamp := biTrue;
RepParams.CanAsPlacingInProj := biTrue;
AddParamsToReportList(cResourceReport_Msg1_24, RepParams, true);
// Дефектный акт
RepParams := TReportItemParams.Create(fmRDefectAct, rtDefectAct, rkProject);
RepParams.CanHaveStamp := biTrue;
AddParamsToReportList(cResourceReport_Msg1_23, RepParams, false);
// счет-фактура
RepParams := TReportItemParams.Create(fmCommerceInvoice, rtCommerceInvoice, rkProject);
RepParams.CanHaveActiveComponents := biTrue;
//added by Tolik
RepParams.CanShowResources := biTrue;
RepParams.CanShowWorks := biTrue;
//Tolik 04/07/2022
RepParams.CanHaveZeroPriceComponents := biTrue;
//
RepParams.CanPricePrecision := biTrue;
RepParams.CanKolvoPrecision := biTrue;
// RepParams.CanHaveFormMode := biTrue;
// RepParams.CanHaveStamp := biTrue;
//Tolik 21/02/2018 --
RepParams.CanHaveSupplyValue := biTrue;
RepParams.CanRoundValue := biTrue;
//
// RepParams.CanPricePrecision := biTrue;
// RepParams.CanKolvoPrecision := biTrue;
//RepParams.CanHaveZeroPriceComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
//RepParams.CanRoundValue := biTrue;
AddParamsToReportList(cResourceReport_Msg1_26, RepParams, true);
//*** Предварительная оценка стоимости проекта
RepParams := TReportItemParams.Create(fmRPriorCostOfProject, rtPriorCostOfProject, rkCalc);
AddParamsToReportList(cResourceReport_Msg1_12, RepParams);
//*** Полный путь кабеля
RepParams := TReportItemParams.Create(fmRCablePaths, rtCablePaths, rkCablePath);
//Tolik;
RepParams.PageToShow := 0;
AddParamsToReportList(cResourceReport_Msg1_27, RepParams);
//added by Tolik
// Координаты рабочих мест
RepParams := TReportItemParams.Create(fmWACoordinates, rtWACoordinates, rkWaCoordinates);
AddParamsToReportList(cResourceReport_Msg1_29, RepParams);
//*** Кроссовое подключение
RepParams := TReportItemParams.Create(fmRCrossConnection, rtCrossConnection, rkCrossConnection);
AddParamsToReportList(cResourceReport_Msg1_28, RepParams);
//-------- Маркировочные листы --------------
// Телекомуникационная комната
RepParams := TReportItemParams.Create(fmRMarkRoomTS, rtMarkRoomTS, rkMarkPages);
AddParamsToReportList(cResourceReport_Msg1_13, RepParams);
// Патч-панели
RepParams := TReportItemParams.Create(fmRMarkPathPanel, rtMarkPathPanel, rkMarkPages);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
AddParamsToReportList(cResourceReport_Msg1_14, RepParams);
// Порты патч-панелей
RepParams := TReportItemParams.Create(fmRMarkPathPanelPorts, rtMarkPathPanelPorts, rkMarkPages);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
AddParamsToReportList(cResourceReport_Msg1_15, RepParams);
// Розетки
RepParams := TReportItemParams.Create(fmRMarkSocket, rtMarkSocket, rkMarkPages);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanFloorNppWithRoom := biTrue;
RepParams.CanCabinetParams := biTrue;
AddParamsToReportList(cResourceReport_Msg1_16, RepParams);
// Идентификаторы телекомуникационных комнат для лицевых панелей разеток
RepParams := TReportItemParams.Create(fmRMarkSocketPanel, rtMarkSocketPanel, rkMarkPages);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanCabinetParams := biTrue;
AddParamsToReportList(cResourceReport_Msg1_17, RepParams);
// Кабели
RepParams := TReportItemParams.Create(fmRMarkCable, rtMarkCable, rkMarkPages);
RepParams.CanHaveActiveComponents := biTrue;
RepParams.CanHaveDismountAccount := biTrue;
RepParams.CanInTwoCopies := biTrue;
RepParams.CanCabinetParams := biTrue;
AddParamsToReportList(cResourceReport_Msg1_18, RepParams);
//lvReports.Selected := lvReports.Items[0];
//RichEdit_Report.SelAttributes.Name := 'Courier';
//RichEdit_Report.Font.Name := 'Courier';//'Times New Roman';
{MemTable_RCable.Active := false;
MemTable_RCable.FieldDefs.Clear;
MemTable_RCable.FieldDefs.Add('ID', ftInteger); //*** ID лин. компоненты
MemTable_RCable.FieldDefs.Add('Name', ftString, 255);
MemTable_RCable.FieldDefs.Add('Name_Begin', ftString, 255); //*** Начало соединения
MemTable_RCable.FieldDefs.Add('Name_End', ftString, 255); //*** Конец соединения
MemTable_RCable.FieldDefs.Add('Length', ftFloat); //*** Длина
MemTable_RCable.FieldDefs.Add('Max_Length', ftFloat); //*** Длина
MemTable_RCable.FieldDefs.Add('Price', ftFloat); //*** Цена
MemTable_RCable.FieldDefs.Add('Cost', ftFloat); //*** Стоимость
}
{MemTable_RResources.Active := false;
MemTable_RResources.FieldDefs.Clear;
MemTable_RResources.FieldDefs.Add('ID', ftInteger); //*** ID лин. компоненты
MemTable_RResources.FieldDefs.Add('Name', ftString, 255);
MemTable_RResources.FieldDefs.Add('Kolvo', ftFloat); //*** Длина
MemTable_RResources.FieldDefs.Add('Price', ftFloat); //*** Цена
MemTable_RResources.FieldDefs.Add('Cost', ftFloat); //*** Стоимость }
{MemTable_RDisparityCompColor.Active := false;
MemTable_RDisparityCompColor.FieldDefs.Clear;
MemTable_RDisparityCompColor.FieldDefs.Add('ID1', ftInteger);
MemTable_RDisparityCompColor.FieldDefs.Add('Name1', ftString, 255);
MemTable_RDisparityCompColor.FieldDefs.Add('Name_Object1', ftString, 255);
MemTable_RDisparityCompColor.FieldDefs.Add('ID2', ftInteger);
MemTable_RDisparityCompColor.FieldDefs.Add('Name2', ftString, 255);
MemTable_RDisparityCompColor.FieldDefs.Add('Name_Object2', ftString, 255);
MemTable_RDisparityCompColor.FieldDefs.Add('Name_Connect_Type', ftString, 255);}
FormList := TObjectList.Create(false);
FSavedOnAppMinimize := nil;
FSavedOnAppRestore := nil;
//*** Насыпать поля в таблици
MemTable_RCableJournal.FieldDefs.Clear;
MemTable_RCableJournal.FieldDefs.Add(fnID, ftAutoInc);
MemTable_RCableJournal.FieldDefs.Add(fnNameList, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameCable, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnName, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameMark, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftInteger);
//MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnComponentIndex, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnIZM, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnCategory, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnLength, ftFloat);
MemTable_RCableJournal.FieldDefs.Add(fnNameFrom, ftString, 255);
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameTo, ftString, 255);
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeTo, ftString, 255);
// added by tolik
MemTable_RCableJournal.FieldDefs.Add(fnLengthReserv, ftFloat); // запас кабеля
MemTable_RCableJournal.FieldDefs.Add(fnReelName,ftString,255); // наименование катушки из которой отрезан кабель
MemTable_RCableJournalExt.FieldDefs.Clear;
MemTable_RCableJournalExt.FieldDefs.Add('ID', ftAutoInc);
MemTable_RCableJournalExt.FieldDefs.Add('NumCable', ftInteger);
MemTable_RCableJournalExt.FieldDefs.Add('CableData', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('NameMark', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('IZM', ftString, 20);
MemTable_RCableJournalExt.FieldDefs.Add('NumThread', ftInteger);
MemTable_RCableJournalExt.FieldDefs.Add('From_Building', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add(fnFromDevice, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnFromDeviceSecond, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnFromDeviceThird, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnFromDeviceFourth, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add('From_Element', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('From_InterfName', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('From_NppPort', ftInteger);
MemTable_RCableJournalExt.FieldDefs.Add('From_PortMark', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('From_WeldingCable', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('From_NumThread', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('To_Building', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add(fnToDevice, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnToDeviceSecond, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnToDeviceThird, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add(fnToDeviceFourth, ftString, 60);
MemTable_RCableJournalExt.FieldDefs.Add('To_Element', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('To_InterfName', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('To_NppPort', ftInteger);
MemTable_RCableJournalExt.FieldDefs.Add('To_PortMark', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('To_WeldingCable', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('To_NumThread', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('TraceCabling', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('Sign', ftString, 200);
MemTable_RCableJournalExt.FieldDefs.Add('Kolvo', ftInteger);
MemTable_RCableJournalExt.FieldDefs.Add('Diameter', ftFloat);
MemTable_RCableJournalExt.FieldDefs.Add('Length', ftFloat);
MemTable_RCableJournalExt.FieldDefs.Add('Note', ftString, 200);
// added by Tolik
MemTable_RCableJournalExt.FieldDefs.Add(fnMarks,ftMemo); // путь прохождения кабеля
MemTable_RCableJournalExt.FieldDefs.Add(fnPrices,ftMemo); // длины кусков кабеля по маршруту (на название не смотрим, там не цена)
{tmpKbmMemTable := MemTable_RCable;
for i := 0 to tmpKbmMemTable.FieldDefs.Count - 1 do
begin
StrToAdd := tmpKbmMemTable.Name + '.FieldDefs.Add('''+tmpKbmMemTable.FieldDefs[i].Name+'''';
case tmpKbmMemTable.FieldDefs[i].DataType of
ftAutoInc:
StrToAdd := StrToAdd +', ftAutoInc';
ftBoolean:
StrToAdd := StrToAdd +', ftBoolean';
ftFloat:
StrToAdd := StrToAdd +', ftFloat';
ftInteger:
StrToAdd := StrToAdd +', ftInteger';
ftString:
StrToAdd := StrToAdd +', ftString, '+IntToStr(tmpKbmMemTable.FieldDefs[i].Size);
end;
StrToAdd := StrToAdd + ');';
GLog.Add(StrToAdd);
end;}
mtExplanatoryProj.FieldDefs.Add(fnID, ftInteger);
mtExplanatoryProj.FieldDefs.Add(fnMarkID, ftInteger);
mtExplanatoryProj.FieldDefs.Add(fnName, ftString, 255);
mtExplanatoryProj.FieldDefs.Add(fnCurrencyMName, ftString, 255);
mtExplanatoryProj.FieldDefs.Add(fnCurrencySName, ftString, 255);
mtExplanatoryProj.FieldDefs.Add(fnNDS, ftFloat);
mtExplanatoryProj.FieldDefs.Add(fnCustomerName, ftString, 255);
mtExplanatoryProj.FieldDefs.Add(fnContractorName, ftString, 255);
mtExplanatoryProj.FieldDefs.Add(fnHeightThroughFloor, ftFloat);
mtExplanatoryProj.FieldDefs.Add(fnIsVisible, ftBoolean);
// added by Tolik
mtExplanatoryProj.FieldDefs.Add(fnMaterialsCost, ftFloat); // стоимость материалов
mtExplanatoryProj.FieldDefs.Add(fnResourcesCost, ftFloat); // стоимостьресурсов
mtExplanatoryProj.FieldDefs.Add(fnWorksCost, ftFloat); // стоимостьработ
mtExplanatoryProj.FieldDefs.Add(fnTotalCOst, ftFloat); // общая стоимость проекта
//
//*** Лист
//Вкладка общие
mtExplanatoryList.FieldDefs.Add(fnID, ftInteger);
mtExplanatoryList.FieldDefs.Add(fnProjectID, ftInteger);
mtExplanatoryList.FieldDefs.Add(fnMarkID, ftInteger);
mtExplanatoryList.FieldDefs.Add(fnName, ftString, 255);
mtExplanatoryList.FieldDefs.Add(fnHeightRoom, ftFloat); //Высота этажа
mtExplanatoryList.FieldDefs.Add(fnHeightCeiling, ftFloat); //Высота фальш потолка
mtExplanatoryList.FieldDefs.Add(fnHeightSocket, ftFloat); //Высота размещ точ объектов
mtExplanatoryList.FieldDefs.Add(fnHeightCorob, ftFloat); //Высота размещ трасс
mtExplanatoryList.FieldDefs.Add(fnCableCanalFullnessKoef, ftFloat); //Коэффициент заполненности кабельных каналов
mtExplanatoryList.FieldDefs.Add(fnLengthKoef, ftFloat); //Процент запаса длины кабеля
mtExplanatoryList.FieldDefs.Add(fnPortReserv, ftFloat); //Резерв со стороны порта
mtExplanatoryList.FieldDefs.Add(fnMultiportReserv, ftFloat); //Резерв со стороны мультипорта
mtExplanatoryList.FieldDefs.Add(fnTwistedPairMaxLength, ftFloat); //Ограничение по максимальной длине (для витой пары)
mtExplanatoryList.MasterSource := dsrcExplanatoryProj;
mtExplanatoryList.DetailFields := fnProjectID;
// added by Tolik
mtExplanatoryList.FieldDefs.Add(fnMaterialsCost, ftFloat); // стоимость материалов
mtExplanatoryList.FieldDefs.Add(fnResourcesCost, ftFloat); // стоимостьресурсов
mtExplanatoryList.FieldDefs.Add(fnWorksCost, ftFloat); // стоимостьработ
mtExplanatoryList.FieldDefs.Add(fnTotalCOst, ftFloat); // общая стоимость проекта
//
mtRLegendObjectIcons.FieldDefs.Add(fnName, ftString, 255);
mtRLegendObjectIcons.FieldDefs.Add(fnPicture, ftBlob);
//added by Tolik for WA Coordinates Report
//MemTable_WACoordinates.FieldDefs.Add(fnNameList, ftString, 255); // лист
//MemTable_WACoordinates.FieldDefs.Add(fnName, ftstring, 255); // компонент
//MemTable_WACoordinates.FieldDefs.Add('NameMark', ftstring, 255); // компонент
//MemTable_WACoordinates.FieldDefs.Add(fnX, ftstring, 255); // координаты
//MemTable_WACoordinates.FieldDefs.Add(fnY, ftstring, 255);
//MemTable_WACoordinates.FieldDefs.Add(fnZ, ftstring, 255);
FFrLocale := frLocale;
DefineRepDesignLanguage;
FFrPrintForm := nil;
FPrintDevice := pdScreen;
FUsefrDialog := true;
//FfrOLEExcelExport := nil;
{
LengthKoef: Double;
PortReserv: Double;
MultiportReserv: Double;
CableCanalFullnessKoef: Double; //*** % заполненности кабельного канала
TwistedPairMaxLength: Double;
CADBlockStep: Double;
CADClickObjectType: TClickType;
CADTraceColor: TColor;
CADTraceStyle: TPenStyle;
CADTraceWidth: Integer;
CADShowObjectNotesType: TShowType;
CADStampType: TStampType;
CADShowRaise: Boolean;
ShowObjectTypePM: TShowType; //*** отображать полное или краткое название в МП
ShowObjectTypeCAD: TShowType; //*** отображать полное или краткое название на КАДе
//ShowObjectMarking: Boolean; //*** Отображать маркировки объктов
GroupListObjectsByType: Boolean; //*** Группировать объекты
ControlJoinByNetType: Boolean;
ControlComplectJoinByProducer: Boolean;
ShowLineObjectLength: Boolean; // Отображать длину линейных объектов
ShowLineObjectNote: Boolean; // Отображать подписи к линейным объектам
ShowConnObjectNote: Boolean; // Отображать подписи к точечным объектам
ShowLineObjectCaption: Boolean; // Отображать подписи к линейным объектам
ShowConnObjectCaption: Boolean;
PutCableInTrace: Boolean; // Ложить кабель на трассу
NoteCountPrefix: string[1];
CADGridStep: Double;
CADHeight: Double;
CADPageOrient: TPageOrient;
CADPageSizeIndex: Integer;
CADWidth: Double;
ListType: TListType; // Тип листа (обычный, отображение компоненты (Шкафа))
IDFigureForDesignList: Integer; // Связь с объектом, в котором находится Шкаф
IDListForDesignList: Integer; // Связь с листом, в котором находится Шкаф
//2006_02_10
ControlComplectByProperties: Boolean;
ControlJoinByProperties: Boolean;
//2006_05_10
CADStampLang: TStampLang;
}
//tvReports.Images := TF_Main(GForm).DM.ImageList_Tree;
//tvReports.Images.Clear;
//tvReports.Images.AddImages(TF_Main(GForm).DM.ImageList_Tree);
// Tolik
NetTypeGuidList := TStringList.Create;
NetTypeGuidListSelected := TStringList.Create;
//Tolik 17/02/2022 --
//AllNetTypes := False;
AllNetTypes := True; // не сформируется ведомость ресурсов, если будет false
//
INeedNormsRecources := False;
//
InitRepMsgList;
rbModeView.Checked := true;
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
cbShowCablePath.Checked := true;
{$IFEND}
cbCanHaveZeroPriceComponents.Checked := true;
end;
procedure TF_ResourceReport.FormDestroy(Sender: TObject);
begin
//ClearListViewObjects(lvReports);
DeactiveDataSets(Self);
Application.OnMinimize := FSavedOnAppMinimize;
Application.OnRestore := FSavedOnAppRestore;
if FFrPrintForm <> nil then
FreeAndNil(FFrPrintForm);
FormList.Free;
//FFrLocale.Free;
if FRepMsgList <> nil then
begin
FreeStringsObjects(FRepMsgList, true);
FreeAndNil(FRepMsgList);
end;
//Tolik
FreeAndNil(NetTypeGuidList);
FreeAndNil(NetTypeGuidListSelected);
end;
procedure TF_ResourceReport.FormShow(Sender: TObject);
begin
if Not Assigned(FSavedOnAppRestore) then
FSavedOnAppRestore := Application.OnRestore;
if Not Assigned(FSavedOnAppMinimize) then
FSavedOnAppMinimize := Application.OnMinimize;
Application.OnRestore := ApplRestore;
Application.OnMinimize := ApplMinimize;
//Tolik --
Label5.Caption := cRepMsg271;
//
{GroupBox1.Visible := false;
Panel_RCable.Visible := false;
Panel_RResouces.Visible := false;
Panel_RDisparityCompColor.Visible := false;
}
case GFormMode of
fmRCable, fmRCableExceedLength, fmRCableCanal:
begin
case GFormMode of
// added by Toik
fmWaCoordinates :
begin
Caption := cResourceReport_Msg1_29;
end;
fmRCable:
begin
Caption := cResourceReport_Msg2_1;
//GT_RCableNameBegin.Visible := true;
//GT_RCableNameEnd.Visible := true;
//GT_RCableMaxLength.Visible := true;
end;
fmRCableExceedLength:
begin
Caption := cResourceReport_Msg2_2;
//GT_RCableNameBegin.Visible := true;
//GT_RCableNameEnd.Visible := true;
//GT_RCableMaxLength.Visible := true;
end;
fmRCableCanal:
begin
Caption := cResourceReport_Msg2_3;
//GT_RCableNameBegin.Visible := false;
//GT_RCableNameEnd.Visible := false;
//GT_RCableMaxLength.Visible := false;
end;
end;
//Panel_RCable.Visible := true;
//GT_RCablePrice.Caption := 'Цена за 1м, ' + GCurrency.Name_Brief;
//GT_RCableCost.Caption := 'Стоимость, ' + GCurrency.Name_Brief;
end;
fmRResources:
begin
Caption := cResourceReport_Msg2_4;
//Panel_RResouces.Visible := true;
//GT_RResourcesPrice.Caption := 'Цена за 1м, ' + GCurrency.Name_Brief;
//GT_RResourcesCost.Caption := 'Стоимость, ' + GCurrency.Name_Brief;
end;
fmRDisparityComponColor, fmRDisparityComponProducer:
begin
case GFormMode of
fmRDisparityComponColor:
Caption := cResourceReport_Msg2_5;
fmRDisparityComponProducer:
Caption := cResourceReport_Msg2_6;
end;
//Panel_RDisparityCompColor.Visible := True;
end;
end;
gbViewCloseResize(gbViewClose);
//Tolik --12/08/2018 --
if cbGroupByHeightOfPlacing.Checked then
begin
cbCanShowKabinet.Checked := False;
cbCanShowObjHierarchy.Enabled := True;
end
else
if cbCanShowKabinet.Checked then
cbGroupByHeightOfPlacing.Checked := False;
//
end;
function TF_ResourceReport.DefineCurrRecNo: Integer;
var
RecNoDelta: Integer;
begin
FOldRecNo := FCurrRecNo;
if frDBDataSet_Detail.DataSource <> nil then
begin
if frDBDataSet_Master.DataSource.DataSet.RecNo = FMasterOldRecNo then
begin
RecNoDelta := Abs(frDBDataSet_Detail.DataSource.DataSet.RecNo - FDetailOldRecNo);
if RecNoDelta > 0 then
begin
FCurrRecNo := FCurrRecNo + 1;
FDetailOldRecNo := frDBDataSet_Detail.DataSource.DataSet.RecNo;
end;
end;
end;
RecNoDelta := Abs(frDBDataSet_Master.DataSource.DataSet.RecNo - FMasterOldRecNo);
if RecNoDelta > 0 then
begin
FCurrRecNo := FCurrRecNo + 1;
FMasterOldRecNo := frDBDataSet_Master.DataSource.DataSet.RecNo;
end;
Result := FCurrRecNo;
end;
procedure TF_ResourceReport.DefineReportModeControls;
var
i: Integer;
Node: TFlyNode;
NodeObj: TObject;
begin
node := nil;
tvReportTarget.Columns[tciCAD].Visible := rbModePacketPrint.Checked and Not(rkMarkPages in FReportUseKind);
tvReportTarget.Columns[tciReport].Visible := (rbModePacketPrint.Checked or rbModePacketPrintToExcel.Checked);
tvReports.Columns[rciIsOn].Visible := rbModePacketPrint.Checked or rbModePacketPrintToExcel.Checked;
CheckAllReports.Visible := rbModePacketPrint.Checked or rbModePacketPrintToExcel.Checked;
//tvReports.Columns[0].Visible
//*** разрешить опции проекта
//rbPageSizeA3.Enabled := Not rbModePacketPrint.Checked;
//rbPageSizeA4.Checked := Not rbPageSizeA3.Enabled;
gbReportMode.Visible := Not rbModePacketPrint.Checked;
DefineReportNodeControls(tvReports.Selected, false);
//*** Определить видимые ветви
Node := tvReportTarget.Items[0];
// Tolik -- 30/09/2016 --
{while Node <> nil do
begin
NodeObj := TObject(Node.Data);
if NodeObj <> nil then
if NodeObj is TSCSList then
Node.Hidden := (rbModePacketPrint.Checked = false) and (TSCSList(NodeObj).IsNormalType = false);
Node := Node.GetNext;
end;}
while Node <> nil do
begin
try
begin
NodeObj := TObject(Node.Data);
if NodeObj <> nil then
if NodeObj is TSCSList then
Node.Hidden := (rbModePacketPrint.Checked = false) and (TSCSList(NodeObj).IsNormalType = false);
Node := Node.GetNext;
end;
except on E: Exception do
begin
Node := Nil;
//ShowMessage(' tvReportTarget.Items.Count = ' + IntToStr(tvReportTarget.Items.Count));
end;
end;
end;
//
{
for i := 0 to tvReportTarget.Items.Count - 1 do
begin
Node := tvReportTarget.Items[0];
NodeObj := TObject(Node.Data);
if NodeObj <> nil then
if NodeObj is TSCSList then
Node.Hidden := (rbModePacketPrint.Checked = false) and (TSCSList(NodeObj).IsNormalType = false);
end;}
pnPacketExportType.Enabled := rbModePacketPrintToExcel.Checked;
rbPackExportExcel.Enabled := pnPacketExportType.Enabled;
rbPackExportExcel2007.Enabled := pnPacketExportType.Enabled;
rbPackExportPdf.Enabled := pnPacketExportType.Enabled;
rbPackExportWord2007.Enabled := pnPacketExportType.Enabled;
if Not rbModePacketPrint.Checked then
begin
end
else
begin
end;
end;
procedure TF_ResourceReport.DefineReportNodeControls(ARepNode: TFlyNode; AWithTemplateInfo: Boolean);
var
ReportItemParams: TReportItemParams;
RepNode: TFlyNode;
RepNodeParams: TReportItemParams;
//StrNode: String;
CanHaveTemplateBool: Boolean;
CanHaveStampBool: Boolean;
HaveUserTemplate: Boolean;
HaveUserStampTemplate: Boolean;
CanHaveActiveComponents: Integer;
CanHaveDismountAccount: Integer;
CanHaveZeroPriceComponents: Integer;
CanHaveStamp: Integer;
FullPathInCableJournal: Integer;
CanHaveSupplyValue: Integer;
CanRoundValue: Integer;
CanAsPlacingInProj: Integer;
CanGroupByCompType: Integer;
CanFloorNppWithRoom: Integer;
CanInTwoCopies: Integer;
CanCabinetParams: Integer;
CanResources: Integer;
CanPricePrecision: Integer;
CanKolvoPrecision: Integer;
// Added by Tolik for ExplicationComponent Report
CanShowKabinet: Integer;
CanShowObjHierarchy : Integer;
CanGroupByName : Integer;
//ShowHeightOfPlacing: Integer; // 06/03/2018 --
GroupByHeightOfPlacing: Integer; // 06/03/2018 --
//Added by Tolik для счета-фактуры
CanShowResources : Integer;
CanShowWorks : Integer;
// Added by Tolik for GOSTCableJournal
CanShowCablePaths : Integer;
CanShowOldReportForm: Integer;
//////////////////////////////////////
PageToShow: Integer;
GroupMode: Integer;
IsPackageMode: Boolean;
ExistsActiveTemplate: Boolean;
ExistsActiveStampTemplate: Boolean;
// Tolik
i, CheckCounter: Integer;
Node: TFlyNode;
currReportItemParams: TReportItemParams;
procedure LoadRepShablonsToColumn(AReportShablons: TReportShablons; AColNumber: Integer);
var
i: Integer;
TemplateNode: TFlyNode;
begin
for i := 0 to AReportShablons.FRepShablons.Count - 1 do
begin
TemplateNode := tvReports.Columns[AColNumber].EditorStyle.Sections[0].Items.Add(nil, AReportShablons.FRepShablons[i]);
TemplateNode.Data := Pointer(AReportShablons.FRepShablons.Objects[i]);
end;
end;
procedure HandleOption(AOptionValue: Integer; ACheckBox: TObject);
var
SavedOnClick: TNotifyEvent;
begin
//24.04.2009 if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
if ACheckBox <> nil then
begin
SavedOnClick := TRzCheckBox(ACheckBox).OnClick;
TRzCheckBox(ACheckBox).OnClick := nil;
try
if ACheckBox = cbcanShowObjHierarchy then
cbCanShowObjHierarchy.Enabled:=((cbCanShowKabinet.Enabled) and (cbCanShowKabinet.Checked))
else
begin
if ACheckBox = cbAsPlacingInProj then
cbAsPlacingInProj.Enabled := not cbCanShowKabinet.Checked
else
TRzCheckBox(ACheckBox).Enabled := AOptionValue = biTrue;
if ACheckBox = cbReportWithStamp then
begin
{if cbShowCablePath.Visible then
begin
//cbShowCablePath.Enabled := not cbReportWithStamp.Checked;
cbReportWithStamp.enabled := not cbShowCablePath.checked;
end;}
if RZGroupBox3.Visible then
begin
if AOptionValue = biTrue then
begin
cbShowCablePath.Enabled := not cbReportWithStamp.Checked;
if cbShowCablePath.Enabled and cbShowCablePath.Checked then
cbReportWithStamp.Enabled := false;
end;
end;
end;
{ if ACheckBox = cbReportWithStamp then
begin
cbReportWithStamp.Enabled := not cbCanShowKabinet.Checked and not cbCanGroupByName.Checked;
if cbCanShowKabinet.Checked then
cbReportWithStamp.Checked := false;
if cbCanGroupByName.Checked then
cbReportWithStamp.Checked := false;
end }
end;
//TRzCheckBox(ACheckBox).Checked := AOptionValue = biTrue;
//TRzCheckBox(ACheckBox).Enabled := AOptionValue <> biNone;
finally
TRzCheckBox(ACheckBox).OnClick := SavedOnClick;
end;
end;
end;
begin
ReportItemParams := nil;
if ARepNode <> nil then
begin
ReportItemParams := TReportItemParams(ARepNode.Data);
end;
if ARepNode = nil then
ClearTVReportTemplates;
{StrNode := cResourceReport_Msg9;
if NewNode <> nil then
StrNode := StrNode +' '+IntToStr(NewNode.Index);
TemplateNode := tvReports.Columns[tciSimple].EditorStyle.Sections[0].Items.Add(nil, StrNode);
TemplateNode := tvReports.Columns[tciSimple].EditorStyle.Sections[0].Items.Add(nil, StrNode);
TemplateNode.Data := Pointer(10);
//*** Шаблон со штампом
TemplateNode := tvReports.Columns[tciStamp].EditorStyle.Sections[0].Items.Add(nil, cResourceReport_Msg9);
TemplateNode.Data := Pointer(10); }
CanHaveTemplateBool := true;
CanHaveStampBool := false;
HaveUserTemplate := false;
HaveUserStampTemplate := false;
ExistsActiveTemplate := false;
ExistsActiveStampTemplate := false;
CanCabinetParams := biFalse;
GroupMode := biNone;
if ReportItemParams <> nil then
begin
//added by Tolik
if ReportItemParams.RepType = rtMarkPathPanelPorts then
SortPanel.Visible := true
else
SortPanel.Visible := false;
if ReportItemParams.RepType = rtPortReport then
PortsReportPanel.Visible := true
else
PortsReportPanel.Visible := false;
// added by Tolik
if ReportItemParams.RepType = rtExplicationComponent then
RzGroupBox2.Visible := true
else
RzGroupBox2.Visible := false;
if ReportItemParams.RepType = rtCommerceInvoice then
gbResources.Visible := true
else
gbResources.Visible := false;
if (ReportItemParams.RepType = rtCableJournal) or ( ReportItemParams.RepType = rtCableJournalExt) then
begin
RzGroupBox3.Enabled := true;
RzGroupBox3.Visible := true;
cbShowCablePath.Enabled := not cbReportWithStamp.Checked;
// cbReportWithStamp.Enabled := not cbShowCablePath.Checked;
if cbShowCablePath.Enabled and cbShowCablePath.Checked then
cbReportWithStamp.Enabled := false;
end
else
RzGroupBox3.Visible := false;
if ReportItemParams.RepType = rtGOSTCableJournal then
begin
RzGroupBox3.Enabled := false;
RzGroupBox3.Visible := false;
cbOldReportForm.Visible := true;
cbOldReportForm.Enabled := true;
end
else
cbOldReportForm.Visible := false;
// Tolik 28/10/2020 -- показать тип разрезки кабеля и для счет-фактуры, чтобы правильно посчитать
{ if (((ReportItemParams.RepType = rtCommerceInvoice) or (ReportItemParams.RepType = rtSpecification) or
(ReportItemParams.RepType = rtGOSTSpecification) or (ReportItemParams.RepType = rtResources) or
(ReportItemParams.RepType = rtCableJournal) or (ReportItemParams.RepType = rtCable)) and
(cbCanHaveSupplyValue.Checked = True)) then
rgCableRate.Visible := true }
if ((ReportItemParams.RepType = rtCommerceInvoice) or (ReportItemParams.RepType = rtSpecification) or
(ReportItemParams.RepType = rtGOSTSpecification) or (ReportItemParams.RepType = rtResources) or
(ReportItemParams.RepType = rtCableJournal) or (ReportItemParams.RepType = rtCable)) then
rgCableRate.Visible := true
else
//if ((ReportItemParams.RepType = rtCableJournal) or (ReportItemParams.RepType = rtCable)) then
{if ((ReportItemParams.RepType = rtCableJournal) or (ReportItemParams.RepType = rtCable)) then
//
rgCableRate.Visible := true
else}
rgCableRate.Visible := false;
//
if AWithTemplateInfo then
begin
ClearTVReportTemplates;
//*** Насыпать шаблоны простых отчетов в дерево
LoadRepShablonsToColumn(ReportItemParams.FSimpleShablons, rciSimple);
//*** Насыпать шаблоны отчетов со штампами в дерево
LoadRepShablonsToColumn(ReportItemParams.FStampShablons, rciStamp);
DefineReportNodeActiveShablonText(ARepNode);
end;
//*** Определить активные параметры отчета
CanHaveActiveComponents := biFalse;
CanHaveDismountAccount := biFalse;
CanHaveZeroPriceComponents := biFalse;
CanHaveStamp := biFalse;
FullPathInCableJournal := biFalse;
CanHaveSupplyValue := biFalse;
CanRoundValue := biFalse;
CanAsPlacingInProj := biFalse;
CanGroupByCompType := biFalse;
CanResources := biFalse;
CanPricePrecision := biFalse;
CanKolvoPrecision := biFalse;
CanShowKabinet := biFalse;
CanShowObjHierarchy := biFalse;
CanGroupByName := biFalse;
//ShowHeightOfPlacing := biFalse; // 06/03/2018 - -
GroupByHeightOfPlacing := biFalse; // 06/03/2018 --
//Added by Tolik для счета-фактуры
CanShowResources :=biFalse;
CanShowWorks := biFalse;
CanShowCablePaths := biTrue;
CanShowOldReportForm := biFalse;
PageToShow := 0;
//
CanFloorNppWithRoom := biFalse;
CanInTwoCopies := biFalse;
IsPackageMode := rbModePacketPrint.Checked or rbModePacketPrintToExcel.Checked;
if Not IsPackageMode then
begin
CanHaveActiveComponents := ReportItemParams.CanHaveActiveComponents;
CanHaveDismountAccount := ReportItemParams.CanHaveDismountAccount;
CanHaveZeroPriceComponents := ReportItemParams.CanHaveZeroPriceComponents;
CanHaveStamp := ReportItemParams.CanHaveStamp;
FullPathInCableJournal := ReportItemParams.FullPathInCableJournal;
CanHaveSupplyValue := ReportItemParams.CanHaveSupplyValue;
CanRoundValue := ReportItemParams.CanRoundValue;
CanAsPlacingInProj := ReportItemParams.CanAsPlacingInProj;
CanGroupByCompType := ReportItemParams.CanGroupByCompType;
CanResources := ReportItemParams.CanResources;
CanFloorNppWithRoom := ReportItemParams.CanFloorNppWithRoom;
CanInTwoCopies := ReportItemParams.CanInTwoCopies;
CanCabinetParams := ReportItemParams.CanCabinetParams;
CanPricePrecision := ReportItemParams.CanPricePrecision;
CanKolvoPrecision := ReportItemParams.CanKolvoPrecision;
// added by Tolik for ExplicationComponent Report
CanShowKabinet := ReportItemParams.CanShowKabinet;
CanShowObjHierarchy := ReportItemParams.CanShowObjHierarchy;
CanGroupByName := ReportItemParams.CanGroupByName;
//ShowHeightOfPlacing := ReportItemParams.ShowHeightOfPlacing; // 06/03/2018 --
GroupByHeightOfPlacing := ReportItemParams.GroupByHeightOfPlacing; // 06/03/2018 --
//////////////////////////
//Added by Tolik для счета-фактуры
CanShowResources := ReportItemParams.CanShowResources;
CanShowWorks := ReportItemParams.CanShowWorks;
//
PageToshow := ReportItemParams.PageToShow;
GroupMode := ReportItemParams.GroupMode;
end
else
begin
RepNode := tvReports.Items[0];
while RepNode <> nil do
begin
if Not RepNode.Hidden then
if RepNode.Cells[rciIsOn] = bsTrue then
begin
RepNodeParams := TReportItemParams(RepNode.Data);
if RepNodeParams.CanHaveActiveComponents = biTrue then
CanHaveActiveComponents := biTrue;
// Added by Tolik
if RepNodeParams.CanShowKabinet = biTrue then
CanShowKabinet := biTrue;
if RepNodeParams.CanShowObjHierarchy = biTrue then
if (cbCanShowObjHierarchy.Checked and cbCanShowObjHierarchy.Enabled) then
CanShowObjHierarchy := biTrue
else CanShowObjHierarchy := biFalse;
if RepNodeParams.CanGroupByName = biTrue then
CanGroupByName := biTrue;
if RepNodeParams.CanShowResources = biTrue then
CanShowResources := biTrue;
if RepNodeParams.CanShowWorks = biTrue then
CanShowWorks := biTrue;
{if RepNodeParams.ShowHeightOfPlacing = biTrue then
ShowHeightOfPlacing := biTrue;}
if RepNodeParams.GroupByHeightOfPlacing = biTrue then
GroupByHeightOfPlacing := biTrue;
///////////////////////////////////////////////
if RepNodeParams.CanHaveDismountAccount = biTrue then
CanHaveDismountAccount := biTrue;
if RepNodeParams.CanHaveZeroPriceComponents = biTrue then
CanHaveZeroPriceComponents := biTrue;
if RepNodeParams.CanHaveStamp = biTrue then
begin
if RzGroupBox3.Visible then
begin
if cbShowCablePath.Checked then
CanHaveStamp := biFalse
else
CanHaveStamp := biTrue
end
else
CanHaveStamp := biTrue
end;
if RepNodeParams.FullPathInCableJournal = biTrue then
FullPathInCableJournal := biTrue;
if RepNodeParams.CanHaveSupplyValue = biTrue then
CanHaveSupplyValue := biTrue;
if RepNodeParams.CanRoundValue = biTrue then
CanRoundValue := biTrue;
if RepNodeParams.CanAsPlacingInProj = biTrue then
CanAsPlacingInProj := biTrue;
if RepNodeParams.CanGroupByCompType = biTrue then
CanGroupByCompType := biTrue;
if RepNodeParams.CanResources = biTrue then
CanResources := biTrue;
if RepNodeParams.CanFloorNppWithRoom = biTrue then
CanFloorNppWithRoom := biTrue;
if RepNodeParams.CanInTwoCopies = biTrue then
CanInTwoCopies := biTrue;
if RepNodeParams.CanCabinetParams = biTrue then
CanCabinetParams := biTrue;
if RepNodeParams.CanPricePrecision = biTrue then
CanPricePrecision := biTrue;
if RepNodeParams.CanKolvoPrecision = biTrue then
CanKolvoPrecision := biTrue;
if RepNodeParams.GroupMode <> biNone then
GroupMode := ReportItemParams.GroupMode;
end;
RepNode := RepNode.GetNext;
end;
end;
HandleOption(CanHaveActiveComponents, FcbCanHaveActiveComponentsCurr);
HandleOption(CanHaveDismountAccount, FcbCanHaveDismountAccountCurr);
HandleOption(CanHaveZeroPriceComponents, cbCanHaveZeroPriceComponents);
HandleOption(CanHaveStamp, cbReportWithStamp);
HandleOption(FullPathInCableJournal, cbFullPathInCableJournal);
HandleOption(CanHaveSupplyValue, cbCanHaveSupplyValue);
HandleOption(CanRoundValue, cbCanRoundValue);
HandleOption(CanAsPlacingInProj, cbAsPlacingInProj);
HandleOption(CanGroupByCompType, cbGroupByCompType);
HandleOption(CanResources, cbCanResources);
// added by Tolik for ExplicationComponent Report
HandleOption(CanShowKabinet, cbCanShowKabinet);
HandleOption(CanShowObjHierarchy,cbCanShowObjHierarchy);
HandleOption(CanGroupByName,cbCanGroupByName);
HandleOption(GroupByHeightOfPlacing, cbGroupByHeightOfPlacing);
/////////
//Added by Tolik для счета-фактуры
HandleOption(CanShowResources,cbCanShowResources);
HandleOption(CanShowWorks,cbCanShowWorks);
//
HandleOption(CanFloorNppWithRoom, cbFloorNppWithRoom);
HandleOption(CanInTwoCopies, cbInTwoCopies);
gbReportMode.Enabled := (ReportItemParams.CanHaveFormMode = biTrue) and rbModeView.Checked;
//gbPageSize.Enabled := (ReportItemParams.CanHavePageSize = biTrue) and (Not IsPackageMode);
gbPageSize.Enabled := (ReportItemParams.CanHavePageSize = biTrue) and rbModeView.Checked;
gbValues.Enabled := (Not rbModeView.Checked) or (ReportItemParams.CanHaveFormMode = biFalse) or rbRepModeDocument.Checked;
gbGroupType.Enabled := GroupMode <> biNone;
CanHaveStampBool := CanHaveStamp = biTrue;
CanHaveTemplateBool := ReportItemParams.CanHaveTemplate = biTrue;
HaveUserTemplate := ReportItemParams.FSimpleShablons.FActiveShablonID > 0;
HaveUserStampTemplate := ReportItemParams.FStampShablons.FActiveShablonID > 0;
ExistsActiveTemplate := ReportItemParams.FSimpleShablons.FActiveShablonID <> -1;
ExistsActiveStampTemplate := ReportItemParams.FStampShablons.FActiveShablonID <> -1;
{HandleOption(ReportItemParams.CanHaveActiveComponents, cbCanHaveActiveComponents);
HandleOption(ReportItemParams.CanHaveDismountAccount, cbCanHaveDismountAccount);
HandleOption(ReportItemParams.CanHaveZeroPriceComponents, cbCanHaveZeroPriceComponents);
HandleOption(ReportItemParams.CanHaveStamp, cbReportWithStamp);
HandleOption(ReportItemParams.FullPathInCableJournal, cbFullPathInCableJournal);
gbReportMode.Enabled := ReportItemParams.CanHaveFormMode = biTrue;
gbPageSize.Enabled := ReportItemParams.CanHavePageSize = biTrue;
CanHaveStampBool := ReportItemParams.CanHaveStamp = biTrue;
HaveUserTemplate := ReportItemParams.FSimpleShablons.FActiveShablonID <> 0;
HaveUserStampTemplate := ReportItemParams.FStampShablons.FActiveShablonID <> 0;}
end
else
begin
HandleOption(biNone, FcbCanHaveActiveComponentsCurr);
HandleOption(biNone, FcbCanHaveDismountAccountCurr);
HandleOption(biNone, cbCanHaveZeroPriceComponents);
HandleOption(biNone, cbReportWithStamp);
HandleOption(biNone, cbFullPathInCableJournal);
HandleOption(biNone, cbCanHaveSupplyValue);
HandleOption(biNone, cbCanRoundValue);
HandleOption(biNone, cbAsPlacingInProj);
HandleOption(biNone, cbGroupByCompType);
HandleOption(biNone, cbCanResources);
HandleOption(biNone, cbFloorNppWithRoom);
HandleOption(biNone, cbInTwoCopies);
HandleOption(biNone, cbCanShowKabinet);
//HandleOption(biNone, cbShowHeightOfPlacing);
HandleOption(biNone, cbGroupByHeightOfPlacing);
HandleOption(biNone, cbCanshowObjHierarchy);
HandleOption(biNone, cbCanGroupByName);
HandleOption(biNone, cbCanShowResources);
HandleOption(biNone, cbCanShowWorks);
gbReportMode.Enabled := false;
gbPageSize.Enabled := false;
gbGroupType.Enabled := false;
//rbGroupByComponType.Checked := GroupMode = gmComponType;
//rbGroupByGroupName.Checked := GroupMode = gmGroupName;
end;
// Свойства Отображение кабинетов
gbNoCabinetNameShort.Enabled := CanCabinetParams = biTrue;
lbNoCabinet.Enabled := CanCabinetParams = biTrue;
edNoCabinet.Enabled := CanCabinetParams = biTrue;
nePricePrecision.Enabled := CanPricePrecision = biTrue;
neKolvoPrecision.Enabled := CanKolvoPrecision = biTrue;
//*** Шаблон со штампом
tvReports.Columns[rciSimple].ReadOnly := Not ExistsActiveTemplate;
tvReports.Columns[rciStamp].ReadOnly := (CanHaveStampBool = False) or Not ExistsActiveStampTemplate;
Act_NewSimpleTemplateFromStandart.Enabled := CanHaveTemplateBool; //true;
Act_NewSimpleTemplateFromUser.Enabled := HaveUserTemplate;
Act_NewStampTemplateFromStandart.Enabled := CanHaveStampBool;
Act_NewStampTemplateFromUser.Enabled := CanHaveStampBool and HaveUserStampTemplate;
Act_NewMarkPageFromUser.Enabled := ExistsActiveTemplate;
Act_ExportSimpleTemplateToFile.Enabled := HaveUserTemplate;
Act_ExportStampTemplateToFile.Enabled := HaveUserStampTemplate;
Act_EditSimpleTemplate.Enabled := HaveUserTemplate;
Act_EditStampTemplate.Enabled := HaveUserStampTemplate;
Act_DeleteSimpleTemplate.Enabled := HaveUserTemplate;
Act_DeleteStampTemplate.Enabled := HaveUserStampTemplate;
btExportTemplateToFile.Enabled := ExistsActiveTemplate or Not (rkMarkPages in FReportUseKind);
Act_ImportTemplateFromFile.Enabled := CanHaveTemplateBool;
btEditTemplate.Enabled := ExistsActiveTemplate or Not (rkMarkPages in FReportUseKind);
btDelTemplate.Enabled := ExistsActiveTemplate or Not (rkMarkPages in FReportUseKind);
Act_ExportTemplateToFile.Enabled := btExportTemplateToFile.Enabled;
Act_EditTemplate.Enabled := btEditTemplate.Enabled;
Act_DeleteTemplate.Enabled := btDelTemplate.Enabled;
Act_EditReportSortInfo.Enabled := (ReportItemParams <> nil) and (ReportItemParams.FReportSortInfo.FAllFieldNames.Count > 0);
Act_ExportToBc3.Visible := (ReportItemParams <> nil) and (ReportItemParams.Mode = fmCommerceInvoice);
end;
procedure TF_ResourceReport.DefineReportNodeActiveShablonText(ARepNode: TFlyNode);
var
ReportItemParams: TReportItemParams;
begin
ReportItemParams := nil;
if (ARepNode <> nil) and (ARepNode.Data <> nil) then
ReportItemParams := ARepNode.Data;
if ReportItemParams <> nil then
begin
ARepNode.Cells[rciSimple] := ReportItemParams.FSimpleShablons.GetActiveShablonName;
ARepNode.Cells[rciStamp] := ReportItemParams.FStampShablons.GetActiveShablonName;
end;
end;
procedure TF_ResourceReport.AddSortFieldsToReportItemParams(AReportItemParams: TReportItemParams);
function GetCaptFrom(ACaptCode: String): String;
var
Res: Variant;
begin
Result := '';
ReportUserFunction('GETCAPT', ACaptCode, '', '', Res);
if Res <> null then
Result := Res;
end;
begin
if AReportItemParams <> nil then
case AReportItemParams.RepType of
rtResources:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticulProducer, cRepMsg48);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticulDistributor, cRepMsg49);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnProducerName, cRepMsg50);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnKolvo, cRepMsg51);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPrice, cRepMsg30);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCost, cRepMsg31);
end;
rtCable:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg163);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameBeginFull, cRepMsg38); //CONNECTBEGINSH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameEndFull, cRepMsg39); //CONNECTENDSH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg154); //LENGTH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLengthReserv, cRepMsg155); //RESERVE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPrice, cRepMsg30); //PRICE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCost, cRepMsg31); //COST
end;
rtCableCanal:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg163);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFilling, cRepMsg27); //FULLNESSPERC
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg154); //LENGTH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLengthReserv, cRepMsg155); //RESERVE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPrice, cRepMsg30); //PRICE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCost, cRepMsg31); //COST
end;
rtCableJournal:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameList, cRepMsg83); //ROOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameCable, cRepMsg84); //CABLE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg163);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCategory, cRepMsg85); //CATEGORY
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg154); //LENGTH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg86+'.'+cRepMsg88); //FROM WORKPLACE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameFrom, cRepMsg86+'.'+cRepMsg89); //FROM PORT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortTypeFrom, cRepMsg86+'.'+cRepMsg90); //FROM TYPE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg87+'.'+cRepMsg88); //TO WORKPLACE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameTo, cRepMsg87+'.'+cRepMsg89); //TO PORT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortTypeTo, cRepMsg87+'.'+cRepMsg90); //TO TYPE
end;
rtCableJournalExt:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNumCable, cRepMsg58); //NUMCABLE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCableData, cRepMsg59); //CABLEDATA
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFromBuilding, cRepMsg61+'.'+cRepMsg63); //GOFROM BUILDING
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFromDevice+';'+fnFromDeviceSecond+';'+fnFromDeviceThird+';'+fnFromDeviceFourth, cRepMsg61+'.'+cRepMsg64); //GOFROM DEVICE_RACK
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFromElement, cRepMsg61+'.'+cRepMsg65); //GOFROM ELEMENT_PANEL
AReportItemParams.FReportSortInfo.AddFieldInfo(fnToBuilding, cRepMsg62+'.'+cRepMsg63); //GOWHERE BUILDING
AReportItemParams.FReportSortInfo.AddFieldInfo(fnToDevice+';'+fnToDeviceSecond+';'+fnToDeviceThird+';'+fnToDeviceFourth, cRepMsg62+'.'+cRepMsg64); //GOWHERE DEVICE_RACK
AReportItemParams.FReportSortInfo.AddFieldInfo(fnToElement, cRepMsg62+'.'+cRepMsg65); //GOWHERE ELEMENT_PANEL
AReportItemParams.FReportSortInfo.AddFieldInfo(fnTraceCabling, cRepMsg70); //CABLINGTRACE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnSign, cRepMsg07); //INDICATION
AReportItemParams.FReportSortInfo.AddFieldInfo(fnKolvo, cRepMsg51); //QUANTITY
AReportItemParams.FReportSortInfo.AddFieldInfo(fnDiameter, cRepMsg156); //CABLEDIAMETER
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg157+' '+cRepMsg158); //CABLELEN BUILDING_S
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNote, cRepMsg74); //NOTE
end;
rtSpecification:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameShort, cRepMsg07); //INDICATION
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticulProducer, cRepMsg48); //PRODMARKNUMSH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticulDistributor, cRepMsg49); //DISTRIBMARKNUMSH
AReportItemParams.FReportSortInfo.AddFieldInfo(fnProducerName, cRepMsg94); //VENDOR
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnKolvo, cRepMsg51); //QUANTITY
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPrice, cRepMsg30); //PRICEWITHVAT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCost, cRepMsg31); //COSTWITHVAT
end;
rtGOSTSpecification:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameShort, cRepMsg103); //DOCTYPEMARKINDICAT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticulProducer, cRepMsg104); // CODEOFEQUIPMMATERIAL
AReportItemParams.FReportSortInfo.AddFieldInfo(fnProducerName, cRepMsg105); //FACTORYPRODUCER
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg106); //UNITOFMEASURE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnKolvo, cRepMsg51); //QUANTITY
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNotice, cRepMsg74); //NOTE
end;
rtNorms:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCypher, cRepMsg45); //CODE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnIzm, cRepMsg26); //UOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnExpense, cRepMsg46); //VOLUME
end;
rtExplanatoryReport:
begin
end;
rtLegendObjectIcons:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
end;
rtGOSTCableJournal:
begin
// Tolik
{ AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameMark, cRepMsg58); //AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg58); //NUMCABLE //AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg58); //NUMCABLE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnComponentIndex, cResourceReport_Msg42); // индекс кабеля
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameCable, cRepMsg77); //CABLETYPE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg78); //NUMSWITCHBOARD
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameTo, cRepMsg79); //NUMSWITCHBOARDPORT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameList, cRepMsg80); //COMESFROM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg81); //NUMOUTLETORSWITCHBOARD
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameFrom, cRepMsg82); //NUMOUTLETORSWITCHBOARDPORT
}
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg247);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg250);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg251);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnTraceCabling, cRepMsg249);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameMark, cRepMsg256);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnTotalKolvo, cRepMsg255);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg154);
end;
rtPriorCostOfProject:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnArticul, cRepMsg161); //ARTICUL
AReportItemParams.FReportSortInfo.AddFieldInfo(fnKolvo, cRepMsg51); //QUANTITY
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPrice, cRepMsg30); //PRICE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCost, cRepMsg31); //COST
end;
rtCommerceInvoice:
begin
end;
rtMarkRoomTS: RzGroupBox2.Visible:=false;
rtMarkPathPanel: RzGroupBox2.Visible:=false;
rtMarkPathPanelPorts: RzGroupBox2.Visible:=false;
rtMarkSocket: RzGroupBox2.Visible:=false;
rtMarkSocketPanel: RzGroupBox2.Visible:=false;
rtMarkCable: RzGroupBox2.Visible:=false;
rtExplicationRoom:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnRoomNum, cRepMsg128); //ROOMNUM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameShort, cRepMsg07); //INDICATION
AReportItemParams.FReportSortInfo.AddFieldInfo(fnAppointmentRoom, cRepMsg129); //APPOINTMENTROOM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnSquareInside, cRepMsg130); //SQUAREINSIDE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnHeightRoom, cRepMsg138); //HEIGHT
end;
rtExplicationComponent:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFloor, cRepMsg126); //FLOOR
AReportItemParams.FReportSortInfo.AddFieldInfo(fnRoomNum, cRepMsg128); //ROOMNUM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg141); //COMPONNUM
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06); //NAME
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameMark, cRepMsg142); //NAMEMARK
end;
rtCrossJournal, rtGOSTCrossJournal:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameList+';'+fnRoomNum, cRepMsg80); //COMESFROM
//05.02.2011 AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg81); //NUMOUTLETORSWITCHBOARD
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNumFrom, cRepMsg81); //NUMOUTLETORSWITCHBOARD
//05.02.2011 AReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg78); //NUMSWITCHBOARD
AReportItemParams.FReportSortInfo.AddFieldInfo(fnNumTo, cRepMsg78); //NUMSWITCHBOARD
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameTo, cRepMsg79); //NUMSWITCHBOARDPORT
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCableNameShort, cRepMsg77); //CABLETYPE
//05.02.2011 AReportItemParams.FReportSortInfo.AddFieldInfo(fnCableNameMark, cRepMsg58); //NUMCABLE
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCableNum, cRepMsg58); //05.02.2011 NUMCABLE
end;
rtHouse:
begin
AReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg06);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg141);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnBoxInstalled, cRepMsg186);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnPresencePower200WFromNetwork, cRepMsg187);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnCableSetToBox, cRepMsg188);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnFiberOpticWelded, cRepMsg189);
AReportItemParams.FReportSortInfo.AddFieldInfo(fnEquipmentInstalled, cRepMsg190);
end;
rtDefectAct:
begin
end;
end;
end;
procedure TF_ResourceReport.CorrectReport(AResourceReportFormMode: TResourceReportFormMode);
var
i, j: Integer;
FrPage: TfrPage;
FrObject: TObject;
FrView: TfrView;
//FrMemoView: TfrMemoView;
//frBandView: TfrBandView;
FracDelimetrCode: Integer;
begin
for i := 0 to Report.Pages.Count - 1 do
begin
FrPage := Report.Pages[i];
for j := 0 to FrPage.Objects.Count - 1 do
begin
FrObject := TObject(FrPage.Objects[j]);
if FrObject is TFrView then
begin
FrView := TfrView(FrObject);
case AResourceReportFormMode of
fmRCableCanal:
begin
ReplaceTextInStringList('MemTable_RCableGroup', 'FmtCableChannelGrp', FrView.Memo, true);
ReplaceTextInStringList('MemTable_RCableGroup', 'FmtCableChannelGrp', FrView.Script, true);
ReplaceTextInStringList('MemTable_RCable', 'FmtCableChannel', FrView.Memo, true);
ReplaceTextInStringList('MemTable_RCable', 'FmtCableChannel', FrView.Script, true);
end;
fmRGOSTCableJournal:
begin
ReplaceTextInStringList(fnMarkID, fnNameMark, FrView.Memo, true);
ReplaceTextInStringList(fnMarkID, fnNameMark, FrView.Script, true);
end;
fmRCrossJournal, fmRGOSTCrossJournal:
begin
ReplaceTextInStringList('mtReport', 'FmtCrossJournal', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtCrossJournal', FrView.Script, true);
end;
fmRExplicationRoom:
begin
ReplaceTextInStringList('mtReport', 'FmtExplicationRoom', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtExplicationRoom', FrView.Script, true);
ReplaceTextInStringList('mtReportDetail', 'FmtExplicationRoomDetail', FrView.Memo, true);
ReplaceTextInStringList('mtReportDetail', 'FmtExplicationRoomDetail', FrView.Script, true);
end;
fmRExplicationComponent:
begin
ReplaceTextInStringList('mtReport', 'FmtExplicationCompon', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtExplicationCompon', FrView.Script, true);
ReplaceTextInStringList('mtReportDetail', 'FmtExplicationComponDetail', FrView.Memo, true);
ReplaceTextInStringList('mtReportDetail', 'FmtExplicationComponDetail', FrView.Script, true);
ReplaceTextInStringList('mtReportSubDetail', 'FmtExplicationComponSubDetail', FrView.Memo, true);
ReplaceTextInStringList('mtReportSubDetail', 'FmtExplicationComponSubDetail', FrView.Script, true);
end;
fmRMarkRoomTS:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkRoomTS', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkRoomTS', FrView.Script, true);
end;
fmRMarkPathPanel:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkPathPanel', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkPathPanel', FrView.Script, true);
end;
fmRMarkPathPanelPorts:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkPathPanelPorts', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkPathPanelPorts', FrView.Script, true);
end;
fmRMarkSocket:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkSocket', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkSocket', FrView.Script, true);
end;
fmRMarkSocketPanel:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkSocketPanel', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkSocketPanel', FrView.Script, true);
end;
fmRMarkCable:
begin
ReplaceTextInStringList('mtReport', 'FmtMarkCable', FrView.Memo, true);
ReplaceTextInStringList('mtReport', 'FmtMarkCable', FrView.Script, true);
end;
{fmCommerceInvoice:
begin
end;}
end;
end;
end;
end;
end;
procedure TF_ResourceReport.ClearTVReportTemplates;
begin
//*** Шаблон
tvReports.Columns[rciSimple].EditorStyle.Sections[0].Items.Clear;
//*** Шаблон со штампом
tvReports.Columns[rciStamp].EditorStyle.Sections[0].Items.Clear;
end;
procedure TF_ResourceReport.CreateControls;
begin
try
//Tolik 17/10/2023 -- подключение портов шкафа ...
FmtPortReport := TkbmMemTable.create(self);
FmtPortReport.Name := 'FmtPortReport';
FmtPortReportDetail := TkbmMemTable.Create(self);
FmtPortReportDetail.Name :='FmtPortReportDetail';
FdsrcPortReport := TDataSource.Create(self);
FdsrcPortReport.Name := 'FdsrcPortReport';
FdsrcPortReport.DataSet := FmtPortReport;
FdsrcPortReportDetail := TDataSource.Create(self);
FdsrcPortReportDetail.Name := 'FdsrcPortReportDetail';
FdsrcPortReportDetail.DataSet := FmtPortReportDetail;
FmtPortReport.FieldDefs.Clear;
FmtPortReport.FieldDefs.Add(fnID, ftAutoInc);
FmtPortReport.FieldDefs.Add(fnName, ftString, 255);
FmtPortReportDetail.FieldDefs.Clear;
FmtPortReportDetail.FieldDefs.Add(fnID, ftAutoInc);
FmtPortReportDetail.FieldDefs.Add(fnPortNameFrom, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnConnected, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnPortNameTo, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnIDMaster, ftInteger);
//
// Ведомость кабелей
MemTable_RCable.FieldDefs.Clear;
MemTable_RCable.FieldDefs.Add(fnID, ftInteger);
MemTable_RCable.FieldDefs.Add(fnName, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameSimple, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameMark, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnMarkID, ftInteger);
MemTable_RCable.FieldDefs.Add(fnIzm, ftString, 20);
MemTable_RCable.FieldDefs.Add(fnNameBegin, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameBeginCompon, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameBeginFull, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameEnd, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameEndCompon, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnNameEndFull, ftString, 255);
MemTable_RCable.FieldDefs.Add(fnFilling, ftFloat);
MemTable_RCable.FieldDefs.Add(fnLength, ftFloat);
MemTable_RCable.FieldDefs.Add(fnLengthReserv, ftFloat);
MemTable_RCable.FieldDefs.Add(fnMaxLength, ftFloat);
MemTable_RCable.FieldDefs.Add(fnPrice, ftFloat);
MemTable_RCable.FieldDefs.Add(fnCost, ftFloat);
MemTable_RCable.FieldDefs.Add(fnExceedLength, ftBoolean);
MemTable_RCable.FieldDefs.Add(fnIDGroup, ftInteger);
MemTable_RCable.FieldDefs.Add(fnReelName, ftString, 255);
//24.09.2010
MemTable_RNorms.FieldDefs.Clear;
MemTable_RNorms.FieldDefs.Add(fnCypher, ftString, 255);
MemTable_RNorms.FieldDefs.Add(fnName, ftString, 255);
MemTable_RNorms.FieldDefs.Add(fnExpense, ftFloat); // Объем/расход
MemTable_RNorms.FieldDefs.Add(fnIzm, ftString, 255);
MemTable_RNorms.FieldDefs.Add(fnPrice, ftFloat); // Цена
MemTable_RNorms.FieldDefs.Add(fnTotalCost, ftFloat); // Стоимость
//19.11.2013
MemTable_RNorms.FieldDefs.Add(fnLaborTime, ftString, 255); // Время выполнения работы (из НБ)
MemTable_RNorms.FieldDefs.Add(fnPricePerTime, ftFloat); // Время выполнения работы (из НБ)
MemTable_RNorms.FieldDefs.Add(fnTotalLaborTime, ftString, 255); // Время выполнения работы
// Для каб каналов
FmtCableChannelGrp := TkbmMemTable.Create(Self);
FmtCableChannelGrp.Name := 'FmtCableChannelGrp';
//FmtCableChannelGrp.FieldDefs.Assign(MemTable_RCableGroup.FieldDefs);
FmtCableChannelGrp.FieldDefs.Add(fnID, ftAutoInc);
FmtCableChannelGrp.FieldDefs.Add(fnGUID, ftString, cnstGUIDLength);
FmtCableChannelGrp.FieldDefs.Add(fnName, ftString, 255);
FmtCableChannelGrp.FieldDefs.Add(fnLength, ftFloat);
FmtCableChannelGrp.FieldDefs.Add(fnLengthReserv, ftFloat);
FmtCableChannelGrp.FieldDefs.Add(fnCost, ftFloat);
FmtCableChannel := TkbmMemTable.Create(Self);
FmtCableChannel.Name := 'FmtCableChannel';
FmtCableChannel.FieldDefs.Assign(MemTable_RCable.FieldDefs);
FdsrcCableChannelGrp := TDataSource.Create(Self);
FdsrcCableChannelGrp.Name := 'FdsrcCableChannelGrp';
FdsrcCableChannelGrp.DataSet := FmtCableChannelGrp;
FdsrcCableChannel := TDataSource.Create(Self);
FdsrcCableChannel.Name := 'FdsrcCableChannel';
FdsrcCableChannel.DataSet := FmtCableChannel;
// для Кроссового журнала
FmtCrossJournal := TkbmMemTable.Create(Self);
FmtCrossJournal.Name := 'FmtCrossJournal';
FdsrcCrossJournal := TDataSource.Create(Self);
FdsrcCrossJournal.Name := 'FdsrcCrossJournal';
FdsrcCrossJournal.DataSet := FmtCrossJournal;
// Экспликация кабинетов
FmtExplicationRoom := TkbmMemTable.Create(Self);
FmtExplicationRoom.Name := 'FmtExplicationRoom';
FdsrcExplicationRoom := TDataSource.Create(Self);
FdsrcExplicationRoom.Name := 'FdsrcExplicationRoom';
FdsrcExplicationRoom.DataSet := FmtExplicationRoom;
FmtExplicationRoomDetail := TkbmMemTable.Create(Self);
FmtExplicationRoomDetail.Name := 'FmtExplicationRoomDetail';
FdsrcExplicationRoomDetail := TDataSource.Create(Self);
FdsrcExplicationRoomDetail.Name := 'FdsrcExplicationRoomDetail';
FdsrcExplicationRoomDetail.DataSet := FmtExplicationRoomDetail;
// Экспликация компонентов
FmtExplicationCompon := TkbmMemTable.Create(Self);
FmtExplicationCompon.Name := 'FmtExplicationCompon';
FdsrcExplicationCompon := TDataSource.Create(Self);
FdsrcExplicationCompon.Name := 'FdsrcExplicationCompon';
FdsrcExplicationCompon.DataSet := FmtExplicationCompon;
FmtExplicationComponDetail := TkbmMemTable.Create(Self);
FmtExplicationComponDetail.Name := 'FmtExplicationComponDetail';
FdsrcExplicationComponDetail := TDataSource.Create(Self);
FdsrcExplicationComponDetail.Name := 'FdsrcExplicationComponDetail';
FdsrcExplicationComponDetail.DataSet := FmtExplicationComponDetail;
FmtExplicationComponSubDetail := TkbmMemTable.Create(Self);
FmtExplicationComponSubDetail.Name := 'FmtExplicationComponSubDetail';
FdsrcExplicationComponSubDetail := TDataSource.Create(Self);
FdsrcExplicationComponSubDetail.Name := 'FdsrcExplicationComponSubDetail';
FdsrcExplicationComponSubDetail.DataSet := FmtExplicationComponSubDetail;
// Дом.подъезд
FmtHouse := TkbmMemTable.Create(Self);
FmtHouse.Name := 'FmtHouse';
FdsrcHouse := TDataSource.Create(Self);
FdsrcHouse.Name := 'FdsrcHouse';
FdsrcHouse.DataSet := FmtHouse;
FmtApproach := TkbmMemTable.Create(Self);
FmtApproach.Name := 'FmtApproach';
FdsrcApproach := TDataSource.Create(Self);
FdsrcApproach.Name := 'FdsrcApproach';
FdsrcApproach.DataSet := FmtApproach;
FmtHouse.FieldDefs.Add(fnID, ftInteger);
FmtHouse.FieldDefs.Add(fnName, ftString, 255);
FmtHouse.FieldDefs.Add(fnMarkID, ftInteger);
FmtHouse.FieldDefs.Add(fnCooperative, ftString, 255);
FmtHouse.FieldDefs.Add(fnHEO, ftString, 255);
FmtHouse.FieldDefs.Add(fnAgreed, ftInteger);
FmtApproach.FieldDefs.Add(fnID, ftInteger);
FmtApproach.FieldDefs.Add(fnIDComponent, ftInteger);
FmtApproach.FieldDefs.Add(fnName, ftString, 255);
FmtApproach.FieldDefs.Add(fnMarkID, ftInteger);
FmtApproach.FieldDefs.Add(fnBoxInstalled, ftInteger);
FmtApproach.FieldDefs.Add(fnPresencePower200WFromNetwork, ftInteger);
FmtApproach.FieldDefs.Add(fnCableSetToBox, ftInteger);
FmtApproach.FieldDefs.Add(fnFiberOpticWelded, ftInteger);
FmtApproach.FieldDefs.Add(fnEquipmentInstalled, ftInteger);
// Дефектный акт
FmtDefectAct := TkbmMemTable.Create(Self);
FmtDefectAct.Name := 'FmtDefectAct';
FdsrcDefectAct := TDataSource.Create(Self);
FdsrcDefectAct.Name := 'FdsrcDefectAct';
FdsrcDefectAct.DataSet := FmtDefectAct;
FmtDefectAct.FieldDefs.Add(fnName, ftString, 255);
FmtDefectAct.FieldDefs.Add(fnFindDefectChecked, ftBoolean);
FmtDefectAct.FieldDefs.Add(fnFindDefectAdress, ftMemo);
FmtDefectAct.FieldDefs.Add(fnFindDefectDescription, ftMemo);
FmtDefectAct.FieldDefs.Add(fnLinkTransportChecked, ftBoolean);
FmtDefectAct.FieldDefs.Add(fnLinkTransportPointA, ftMemo);
FmtDefectAct.FieldDefs.Add(fnLinkTransportPointB, ftMemo);
FmtDefectAct.FieldDefs.Add(fnLinkTransportCable, ftFloat);
FmtDefectAct.FieldDefs.Add(fnLinkTransportMaterials, ftMemo);
FmtDefectAct.FieldDefs.Add(fnSetEquipmentChecked, ftBoolean);
FmtDefectAct.FieldDefs.Add(fnSetEquipmentAddress, ftMemo);
FmtDefectAct.FieldDefs.Add(fnSetEquipmentEqipm, ftMemo);
FmtDefectAct.FieldDefs.Add(fnSetEquipmentMaterial, ftMemo);
FmtDefectAct.FieldDefs.Add(fnMoveEquipmentChecked, ftBoolean);
FmtDefectAct.FieldDefs.Add(fnMoveEquipmentPointA, ftMemo);
FmtDefectAct.FieldDefs.Add(fnMoveEquipmentPointB, ftMemo);
FmtDefectAct.FieldDefs.Add(fnMoveEquipmentEqipm, ftMemo);
FmtDefectAct.FieldDefs.Add(fnMoveEquipmentMaterial, ftMemo);
FmtDefectAct.FieldDefs.Add(fnContractorName, ftMemo);
FmtDefectAct.FieldDefs.Add(fnDateGetting, ftDateTime);
FmtDefectAct.FieldDefs.Add(fnDateExecution, ftDateTime);
// Маркировочные листы
FmtMarkRoomTS := TkbmMemTable.Create(Self);
FmtMarkRoomTS.Name := 'FmtMarkRoomTS';
FdsrcMarkRoomTS := TDataSource.Create(Self);
FdsrcMarkRoomTS.Name := 'FdsrcMarkRoomTS';
FdsrcMarkRoomTS.DataSet := FmtMarkRoomTS;
FmtMarkPathPanel := TkbmMemTable.Create(Self);
FmtMarkPathPanel.Name := 'FmtMarkPathPanel';
FdsrcMarkPathPanel := TDataSource.Create(Self);
FdsrcMarkPathPanel.Name := 'FdsrcMarkPathPanel';
FdsrcMarkPathPanel.DataSet := FmtMarkPathPanel;
FmtMarkPathPanelPorts := TkbmMemTable.Create(Self);
FmtMarkPathPanelPorts.Name := 'FmtMarkPathPanelPorts';
FdsrcMarkPathPanelPorts := TDataSource.Create(Self);
FdsrcMarkPathPanelPorts.Name := 'FdsrcMarkPathPanelPorts';
FdsrcMarkPathPanelPorts.DataSet := FmtMarkPathPanelPorts;
FmtMarkSocket := TkbmMemTable.Create(Self);
FmtMarkSocket.Name := 'FmtMarkSocket';
FdsrcMarkSocket := TDataSource.Create(Self);
FdsrcMarkSocket.Name := 'FdsrcMarkSocket';
FdsrcMarkSocket.DataSet := FmtMarkSocket;
FmtMarkSocketPanel := TkbmMemTable.Create(Self);
FmtMarkSocketPanel.Name := 'FmtMarkSocketPanel';
FdsrcMarkSocketPanel := TDataSource.Create(Self);
FdsrcMarkSocketPanel.Name := 'FdsrcMarkSocketPanel';
FdsrcMarkSocketPanel.DataSet := FmtMarkSocketPanel;
FmtMarkCable := TkbmMemTable.Create(Self);
FmtMarkCable.Name := 'FmtMarkCable';
FdsrcMarkCable := TDataSource.Create(Self);
FdsrcMarkCable.Name := 'FdsrcMarkCable';
FdsrcMarkCable.DataSet := FmtMarkCable;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.CreateControls', E.Message);
end;
end;
procedure TF_ResourceReport.DefineRepSortInfo;
var
RepSortInfoList: TObjectList;
RepNode: TFlyNode;
ReportItemParams: TReportItemParams;
ReportSortInfo: TReportSortInfo;
i, j: Integer;
begin
try
RepSortInfoList := TF_Main(GForm).DM.GetReportSortInfoList;
for i := 0 to tvReports.Items.Count - 1 do
begin
RepNode := tvReports.Items[i];
ReportItemParams := TReportItemParams(RepNode.Data);
for j := 0 to RepSortInfoList.Count - 1 do
begin
ReportSortInfo := TReportSortInfo(RepSortInfoList[j]);
if ReportSortInfo.RepKind = ReportItemParams.RepType then
begin
ReportItemParams.FReportSortInfo.Assign(ReportSortInfo);
FreeAndNil(ReportSortInfo);
RepSortInfoList[j] := nil;
end;
end;
RepSortInfoList.Pack;
end;
RepSortInfoList.OwnsObjects := true;
FreeAndNil(RepSortInfoList);
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.DefineRepSortInfo', E.Message);
end;
end;
procedure TF_ResourceReport.DefineRepTemplates;
var
RepNode: TFlyNode;
TemplateNode: TFlyNode;
ReportItemParams: TReportItemParams;
ActualReportShablons: TReportShablons;
UserReportsInfo: TList;
ptrUserReportInfo: PUserReportInfo;
i, j: Integer;
begin
ClearTVReportTemplates;
TemplateNode := tvReports.Columns[rciSimple].EditorStyle.Sections[0].Items.Add(nil, cResourceReport_Msg9);
TemplateNode.Data := Pointer(10);
//*** Шаблон со штампом
TemplateNode := tvReports.Columns[rciStamp].EditorStyle.Sections[0].Items.Add(nil, cResourceReport_Msg9);
TemplateNode.Data := Pointer(10);
//*** Определить все шаблоны отчетов
UserReportsInfo := TF_Main(GForm).DM.GetUserReportsInfo;
//*** Определить активные шаблоны отчетов для отобрадения
for i := 0 to tvReports.Items.Count - 1 do
begin
RepNode := tvReports.Items[i];
ReportItemParams := TReportItemParams(RepNode.Data);
ReportItemParams.FSimpleShablons.ClearRepShablons;
ReportItemParams.FStampShablons.ClearRepShablons;
//Внести стандартные наблоны
if (rkProject in FReportUseKind) or
//24.02.2011 (rkCalc in FReportUseKind)
IsSimpleReportKind(FReportUseKind)
then
begin
if ReportItemParams.CanHaveTemplate = biTrue then
begin
ReportItemParams.FSimpleShablons.AddShablonToList(0, cResourceReport_Msg9, true);
if ReportItemParams.CanHaveStamp = biTrue then
ReportItemParams.FStampShablons.AddShablonToList(0, cResourceReport_Msg9, true);
end;
end;
//*** Вкинуть все шаблоны в тек. отчет
j := 0;
while j <= UserReportsInfo.Count - 1 do
begin
ptrUserReportInfo := UserReportsInfo[j];
if ptrUserReportInfo.RepKind = ReportItemParams.RepType then
begin
//*** Определить тип шаблона - простой или со штампом
ActualReportShablons := ReportItemParams.GetShablonsByTemplateType(ptrUserReportInfo.TemplateType);
if ActualReportShablons <> nil then
begin
ActualReportShablons.AddShablonToList(ptrUserReportInfo.ID,
ptrUserReportInfo.Name, ptrUserReportInfo.UseAsShablon = biTrue);
FreeMem(ptrUserReportInfo);
UserReportsInfo.Delete(j);
end;
end
else
Inc(j);
end;
// Если шаблон не определен (-1), а всписке еще есть, то определяем из списка
ReportItemParams.FSimpleShablons.DefineActiveShablonIfNoDefined;
ReportItemParams.FStampShablons.DefineActiveShablonIfNoDefined;
DefineReportNodeActiveShablonText(RepNode);
//RepNode.Cells[1] := ReportItemParams.FSimpleShablons.GetActiveShablonName;
//RepNode.Cells[2] := ReportItemParams.FStampShablons.GetActiveShablonName;
end;
DefineReportNodeControls(tvReports.Selected, true);
FreeList(UserReportsInfo);
end;
procedure TF_ResourceReport.DelReportTemplate(ARepNode: TFlyNode; ATemplateType: Integer);
var
ReportItemParams: TReportItemParams;
ReportShablons: TReportShablons;
TemplateName: String;
begin
TemplateName := '';
ReportItemParams := nil;
ReportShablons := nil;
if (ARepNode <> nil) and (ARepNode.Data <> nil) then
ReportItemParams := ARepNode.Data;
if ReportItemParams <> nil then
begin
ReportShablons := ReportItemParams.GetShablonsByTemplateType(ATemplateType);
if (ReportShablons <> nil) and (ReportShablons.FActiveShablonID > 0) then
begin
TemplateName := ReportShablons.GetActiveShablonName;
if MessageModal(cResourceReport_Msg16 + TemplateName+'?', ApplicationName, MB_ICONQUESTION or MB_YESNO) = IDYES then
begin
if tvReports.EditorMode then
tvReports.EditorMode := false; //tvReports.UpdateControlState Refresh; //tvReports.Update;
TF_Main(GForm).DM.DeleteRecordFromTableByID(tnUserReports, ReportShablons.FActiveShablonID, qmPhisical);
ReportShablons.RemoveShablonNameByID(ReportShablons.FActiveShablonID);
if ARepNode.Cells[rciIsOn] = bsTrue then
if TReportItemParams(ARepNode.Data).FSimpleShablons.FActiveShablonID = -1 then
ARepNode.Cells[rciIsOn] := bsFalse;
DefineReportNodeControls(ARepNode, true);
end;
end;
end;
end;
procedure TF_ResourceReport.ExportTemplateToFile(ATemplateType: Integer);
var
Node: TFlyNode;
ReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
ReportFileName: String;
ReportFilePath: String;
IniPath: String;
SaveDialog: TSaveDialog;
IniFile: TIniFile;
IniFileStream: TFileStream;
FrfFileStream: TFileStream;
ReportTemplateStream: TFileStream;
// Tolik 24/06/2019 --
//RepTemplateSignature: string;
RepTemplateSignature: AnsiString;
//
begin
try
Node := tvReports.Selected;
if Node <> nil then
ReportItemParams := TReportItemParams(Node.Data);
if ReportItemParams <> nil then
begin
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(ATemplateType);
ReportFileName := GetReportFileNameByType(ReportItemParams.RepType, ATemplateType, false);
if (ReportFileName <> '') and (CurrReportShablons <> nil) then
begin
SaveDialog := TSaveDialog.Create(Self);
try
SaveDialog.Title := cResourceReport_Msg32;
SaveDialog.InitialDir := ExtractDirToReportTemplate(Node.Text);
SaveDialog.DefaultExt := '*.'+enSrt;
SaveDialog.FileName := FileNameCorrect(CurrReportShablons.GetActiveShablonName);
SaveDialog.Filter := GetDialogFilter(exdSbk, enSrt); //ExtName+' ('+FullExtName+')|'+FullExtName;
SaveDialog.Options := SaveDialog.Options - [ofNoChangeDir] + [ofOverwritePrompt];
if SaveDialog.Execute then
begin
//*** Определить имя файла пользовательского отчета
ReportFilePath := GetPathToSCSTmpDir + '\' + ReportFileName;
if FileExists(ReportFilePath) then
if Not DeleteFile(ReportFilePath) then
ReportFilePath := GetNoExistsFileNameForCopy(ReportFilePath);
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.SaveUserReportByIDToFile(CurrReportShablons.FActiveShablonID, ReportFilePath);
if FileExists(ReportFilePath) then
begin
IniPath := GetNoExistsFileNameForCopy(GetPathToSCSTmpDir + '\' + fnRepTemplateTmp);
IniFile := TIniFile.Create(IniPath);
FrfFileStream := TFileStream.Create(ReportFilePath, fmOpenRead);
IniFile.WriteInteger(seRepTemplate, idtRepType, ReportItemParams.RepType);
IniFile.WriteInteger(seRepTemplate, idtReportUseKind, Ord(ReportItemParams.ReportUseKind));
IniFile.WriteString(seRepTemplate, idtName, CurrReportShablons.GetActiveShablonName);
IniFile.WriteInteger(seRepTemplate, idtTemplateType, ATemplateType);
IniFile.WriteBinaryStream(seRepTemplate, idtTemplate, FrfFileStream);
FreeAndNil(FrfFileStream);
FreeAndNil(IniFile);
PakFile(IniPath);
IniFileStream := TFileStream.Create(IniPath, fmOpenRead);
ReportTemplateStream := TFileStream.Create(SaveDialog.FileName, fmCreate);
//RepTemplateSignature := PChar(guidRepTemplateSignature);
//ReportTemplateStream.WriteBuffer(RepTemplateSignature^, Length(guidRepTemplateSignature));
// Tolik 20/102/2019 --
//ReportTemplateStream.WriteBuffer(PChar(guidRepTemplateSignature)^, Length(guidRepTemplateSignature));
ReportTemplateStream.WriteBuffer(PAnsiChar(AnsiString(guidRepTemplateSignature))^, Length(guidRepTemplateSignature));
//
ReportTemplateStream.CopyFrom(IniFileStream, 0);
RepTemplateSignature := '111111111111111111111111111111111111111111111111111';
RepTemplateSignature := '';
SetLength(RepTemplateSignature, 32);
ReportTemplateStream.Position := 0;
ReportTemplateStream.ReadBuffer(RepTemplateSignature[1], Length(guidRepTemplateSignature));
FreeAndNil(ReportTemplateStream);
FreeAndNil(IniFileStream);
DeleteFile(ReportFilePath);
DeleteFile(IniPath);
end;
end;
finally
FreeAndNil(SaveDialog);
end;
end;
end;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ExportTemplateToFile', E.Message);
end;
end;
function TF_ResourceReport.GetCurrReportItemParamValues: TReportItemParams;
begin
Result := TReportItemParams.Create(fmUnsign, -1, rkProject);
if cbReportWithStamp.Enabled then
Result.CanHaveStamp := BoolToInt(cbReportWithStamp.Checked);
if FcbCanHaveActiveComponentsCurr.Enabled then
Result.CanHaveActiveComponents := BoolToInt(FcbCanHaveActiveComponentsCurr.Checked);
if FcbCanHaveDismountAccountCurr.Enabled then
Result.CanHaveDismountAccount := BoolToInt(FcbCanHaveDismountAccountCurr.Checked);
if cbCanHaveZeroPriceComponents.Enabled then
Result.CanHaveZeroPriceComponents := BoolToInt(cbCanHaveZeroPriceComponents.Checked);
if cbFullPathInCableJournal.Enabled then
Result.FullPathInCableJournal := BoolToInt(cbFullPathInCableJournal.Checked);
if cbCanRoundValue.Enabled then
Result.CanRoundValue := BoolToInt(cbCanRoundValue.Checked);
if cbCanHaveSupplyValue.Enabled then
Result.CanHaveSupplyValue := BoolToInt(cbCanHaveSupplyValue.Checked);
if gbPageSize.Enabled then
begin
if rbPageSizeA4.Checked then
Result.CanHavePageSize := 0;
if rbPageSizeA3.Checked then
Result.CanHavePageSize := 1;
end;
if gbReportMode.Enabled then
begin
if rbRepModeDocument.Checked then
Result.CanHaveFormMode := 0;
if rbRepModeForm.Checked then
Result.CanHaveFormMode := 1;
end;
if cbAsPlacingInProj.Enabled then
Result.CanAsPlacingInProj := BoolToInt(cbAsPlacingInProj.Checked);
if cbGroupByCompType.Enabled then
Result.CanGroupByCompType := BoolToInt(cbGroupByCompType.Checked);
if cbCanResources.Enabled then
Result.CanResources := BoolToInt(cbCanResources.Checked);
if cbFloorNppWithRoom.Enabled then
Result.CanFloorNppWithRoom := BoolToInt(cbFloorNppWithRoom.Checked);
if cbInTwoCopies.Enabled then
Result.CanInTwoCopies := BoolToInt(cbInTwoCopies.Checked);
if rbGroupByComponType.Checked then
Result.GroupMode := gmComponType
else if rbGroupByGroupName.Checked then
Result.GroupMode := gmGroupName;
// added by Tolik
if (cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled) then
Result.CanShowKabinet := BoolToInt(cbCanShowKabinet.Checked);
if (cbCanShowObjHierarchy.Checked and cbCanShowObjHierarchy.Enabled) then
Result.CanShowObjHierarchy := BoolToInt(cbCanShowObjHierarchy.Checked);
if (cbCanGroupByName.Checked and cbCanGroupByName.Enabled) then
Result.CanGroupByName := BoolToInt(cbCanGroupByName.Checked);
if cbCanShowResources.Enabled then
Result.CanShowResources := BoolToInt(cbCanShowResources.Checked);
if cbCanShowWorks.Enabled then
Result.CanShowWorks := BoolToInt(cbCanShowWorks.Checked);
if (cbGroupByHeightOfPlacing.Checked and cbGroupByHeightOfPlacing.Enabled) then
Result.GroupByHeightOfPlacing := BoolToInt(cbGroupByHeightOfPlacing.Checked)
end;
function TF_ResourceReport.GetReportFileNameByType(AReportType: Integer; ATemplateType: Integer; ACanA3: Boolean): String;
begin
Result := '';
case AReportType of
rtResources:
begin
if ATemplateType = ttSimple then
Result := Result + fnReportResources
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPResources;
end;
rtCable:
begin
if ATemplateType = ttSimple then
Result := Result + fnReportCable
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPCable;
end;
rtCableCanal:
begin
if ATemplateType = ttSimple then
Result := Result + fnReportCableCanal
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPCableCanal;
end;
rtCableJournal:
begin
if ATemplateType = ttSimple then
Result := Result + fnRCableJournal
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPCableJournal;
end;
rtCableJournalExt:
begin
if ATemplateType = ttSimple then
Result := Result + fnRCableJournalExt
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPCableJournalExt;
end;
rtCablePaths:
begin
Result := Result + fnRCablePaths;
end;
rtCrossConnection:
Result := Result + fnRCrossConnection;
rtGOSTCableJournal:
begin
Result := Result + fnRGOSTCableJournal;
end;
rtSpecification:
Result := Result + fnRSpecification;
rtGOSTSpecification:
begin
//Tolik 24/01/2020
{if ATemplateType = ttSimple then
Result := Result + fnRGOSTSpecification
else
if (ATemplateType = ttA3) or ACanA3 then
Result := Result + fnRGOSTSpecificationA3;}
//if ATemplateType = ttSimple then
if (ATemplateType = ttA3) or ACanA3 then
Result := Result + fnRGOSTSpecificationA3
else
Result := Result + fnRGOSTSpecification;
//
end;
rtNorms:
begin
if ATemplateType = ttSimple then
Result := Result + fnRNorms
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPNorms;
end;
rtExplanatoryReport:
begin
if ATemplateType = ttSimple then
Result := Result + fnRExplanatoryReport
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPExplanatoryReport;
end;
rtExplicationRoom:
begin
if ATemplateType = ttSimple then
Result := Result + fnRExplicationRoom
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPExplicationRoom;
end;
rtExplicationComponent:
begin
if ATemplateType = ttSimple then
Result := Result + fnRExplicationComponent
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPExplicationComponent;
end;
rtCrossJournal:
Result := Result + fnRCrossJournal;
rtGOSTCrossJournal:
begin
Result := Result + fnRGOSTCrossJournal;
end;
rtLegendObjectIcons:
begin
if ATemplateType = ttSimple then
Result := Result + fnRLegendObjectIcons
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPLegendObjectIcons;
end;
rtHouse:
begin
if ATemplateType = ttSimple then
Result := Result + fnRHouse
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPHouse;
end;
rtDefectAct:
begin
if ATemplateType = ttSimple then
Result := Result + fnRDefectAct
else
if ATemplateType = ttStamp then
Result := Result + fnRSTAMPDefectAct;
end;
rtPriorCostOfProject:
begin
Result := Result + fnRPriorCostOfProject;
end;
rtCommerceInvoice:
begin
Result := Result + fnRCommerceInvoice;
end;
rtMarkRoomTS:
Result := Result + fnRMarkRoomTS;
rtMarkPathPanel:
Result := Result + fnRMarkPathPanel;
rtMarkPathPanelPorts:
Result := Result + fnRMarkPathPanelPorts;
rtMarkSocket:
Result := Result + fnRMarkSocket;
rtMarkSocketPanel:
Result := Result + fnRMarkSocketPanel;
rtMarkCable:
Result := Result + fnRMarkCable;
rtWACoordinates:
Result := Result + fnRWACoordinates;
rtPortReport: // Tolik 23/08/2023 --
Result := Result + fnRPortReport;
end;
end;
function TF_ResourceReport.GetReportItemParamByRepType(AReportType: Integer): TReportItemParams;
var
Node: TFlyNode;
ReportItemParams: TReportItemParams;
begin
Result := nil;
Node := GetFirstNodeFromFlyTree(tvReports);
while Node <> nil do
begin
ReportItemParams := TReportItemParams(Node.Data);
if ReportItemParams.RepType = AReportType then
begin
Result := ReportItemParams;
Break; //// BREAK ////
end;
Node := Node.GetNext;
end;
end;
function TF_ResourceReport.GetTemplateTypeByColumnIndex(AColIndex: Integer): Integer;
begin
Result := 0;
case AColIndex of
rciSimple:
Result := ttSimple;
rciStamp:
Result := ttStamp;
end;
end;
function TF_ResourceReport.GetTemplateTypeByCurrOptions: Integer;
begin
Result := 0;
if Not cbReportWithStamp.Checked then
Result := ttSimple
else
Result := ttStamp;
end;
function TF_ResourceReport.ImportTemplateFromFile: Boolean;
var
OpenDialog: TOpenDialog;
ReportTemplateStream: TfileStream;
ReportTemplateStreamSize: Integer;
RepTemplateSignature: string;
IniPath: String;
IniFileStream: TFileStream;
IniFile: TMemIniFile;
ReportFilePath: String;
FrfFileStream: TFileStream;
IsNoReportTemplate: Boolean;
CurrReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
DestReportItemParams: TReportItemParams;
DestReportShablons: TReportShablons;
RepType: Integer;
TemplateType: Integer;
NewTemplateName: String;
NewUserReportInfo: TUserReportInfo;
begin
Result := false;
try
OpenDialog := TOpenDialog.Create(Self);
try
OpenDialog.Title := cResourceReport_Msg33;
OpenDialog.InitialDir := ExtractDirToReportTemplate('');
OpenDialog.DefaultExt := '*.'+enSrt;
//OpenDialog.FileName := FileNameCorrect(CurrReportShablons.GetActiveShablonName);
OpenDialog.Filter := GetDialogFilter(exdSbk, enSrt); //ExtName+' ('+FullExtName+')|'+FullExtName;
OpenDialog.Options := SaveDialog.Options - [ofNoChangeDir];
if OpenDialog.Execute then
begin
CurrReportItemParams := nil;
CurrReportShablons := nil;
if tvReports.Selected <> nil then
CurrReportItemParams := TReportItemParams(tvReports.Selected.Data);
ReportTemplateStream := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
ReportTemplateStreamSize := ReportTemplateStream.Size;
IsNoReportTemplate := false;
if ReportTemplateStreamSize > Length(guidRepTemplateSignature) then
begin
RepTemplateSignature := '';
SetLength(RepTemplateSignature, Length(guidRepTemplateSignature));
ReportTemplateStream.ReadBuffer(RepTemplateSignature[1], Length(guidRepTemplateSignature));
//Tolik 24/06/2019 --
//if RepTemplateSignature = guidRepTemplateSignature then
if String(RepTemplateSignature) = guidRepTemplateSignature then
//
begin
IniPath := GetNoExistsFileNameForCopy(GetPathToSCSTmpDir + '\' + fnRepTemplateTmp);
IniFileStream := TFileStream.Create(IniPath, fmCreate);
IniFileStream.CopyFrom(ReportTemplateStream, ReportTemplateStreamSize - ReportTemplateStream.Position);
FreeAndNil(IniFileStream);
UnPakFile(IniPath);
IniFile := TMemIniFile.Create(IniPath);
// Сохранить frf файл
ReportFilePath := GetNoExistsFileNameForCopy(GetPathToSCSTmpDir + '\' + fnReport);
FrfFileStream := TFileStream.Create(ReportFilePath, fmCreate);
IniFile.ReadBinaryStream(seRepTemplate, idtTemplate, FrfFileStream);
FreeAndNil(FrfFileStream);
RepType := IniFile.ReadInteger(seRepTemplate, idtRepType, -1);
TemplateType := IniFile.ReadInteger(seRepTemplate, idtTemplateType, -1);
NewTemplateName := IniFile.ReadString(seRepTemplate, idtName, '');
if (RepType <> -1) and (TemplateType <> -1) then
begin
DestReportItemParams := GetReportItemParamByRepType(RepType);
DestReportShablons := nil;
if DestReportItemParams <> nil then
DestReportShablons := DestReportItemParams.GetShablonsByTemplateType(TemplateType);
if DestReportShablons <> nil then
begin
if NewTemplateName = '' then
NewTemplateName := ExtractFileNameOnly(OpenDialog.FileName);
while (DestReportShablons.FRepShablons.IndexOf(NewTemplateName) <> -1) and (NewTemplateName <> '') do
begin
MessageModal(cResourceReport_Msg17_1 +' '+ NewTemplateName +' '+ cResourceReport_Msg17_2, ApplicationName, MB_ICONINFORMATION or MB_OK);
NewTemplateName := InputForm(GForm, cResourceReport_Msg33, cResourceReport_Msg10_2,
NewTemplateName, dtString);
end;
if NewTemplateName <> '' then
begin
//*** Внести шаблон в базу
ZeroMemory(@NewUserReportInfo, SizeOf(TUserReportInfo));
NewUserReportInfo.Name := NewTemplateName;
NewUserReportInfo.RepKind := RepType;
NewUserReportInfo.TemplateType := TemplateType;
NewUserReportInfo.UseAsShablon := BoolToInt(DestReportItemParams = CurrReportItemParams);
NewUserReportInfo.RepFileName := ReportFilePath;
NewUserReportInfo.ID := TF_Main(GForm).DM.InsertUserReportToBase(NewUserReportInfo);
DestReportShablons.AddShablonToList(NewUserReportInfo.ID, NewUserReportInfo.Name, IntToBool(NewUserReportInfo.UseAsShablon));
if NewUserReportInfo.UseAsShablon = biTrue then
DefineReportNodeControls(tvReports.Selected, true);
Result := true;
end;
end;
end;
DeleteFile(ReportFilePath);
DeleteFile(IniPath);
FreeAndNil(IniFile);
end
else
IsNoReportTemplate := true;
end
else
IsNoReportTemplate := true;
if IsNoReportTemplate then
MessageModal(cFileOf + OpenDialog.FileName +' '+cResourceReport_Msg36, ApplicationName, MB_ICONINFORMATION or MB_OK);
FreeAndNil(ReportTemplateStream);
end;
finally
FreeAndNil(OpenDialog);
end;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ImportTemplateFromFile', E.Message);
end;
end;
function TF_ResourceReport.IsSimpleReportKind(AReportUseKinds: TReportUseKinds): Boolean;
begin
//Tolik 31/08/2023 --
//Result := (rkCalc in AReportUseKinds) or (rkCablePath in AReportUseKinds) or (rkCrossConnection in AReportUseKinds);
Result := (rkCalc in AReportUseKinds) or (rkCablePath in AReportUseKinds) or (rkCrossConnection in AReportUseKinds) or (rkPortReport in AReportUseKinds);
//
end;
procedure TF_ResourceReport.MakeEditReportTemplate(AMakeEdit: TMakeEdit; AMakeFromStandart: Boolean; ATemplateType: Integer);
var
StandartReportDir: String;
UserReportDir: string;
ReportFileName: String;
ReportFilePath: String;
SrcReportFilePath: String;
NewTemplateName: String;
SrcUserTemplateName: TStringItem;
ReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
CanContinueMake: Boolean;
NewUserReportInfo: TUserReportInfo;
FileAttrib: Integer;
Node: TFlyNode;
begin
ReportFileName := '';
ReportFilePath := '';
SrcReportFilePath := '';
NewTemplateName := '';
ReportItemParams := nil;
CurrReportShablons := nil;
Node := tvReports.Selected;
if Node <> nil then
ReportItemParams := TReportItemParams(Node.Data);
if ReportItemParams <> nil then
begin
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(ATemplateType);
ReportFileName := GetReportFileNameByType(ReportItemParams.RepType, ATemplateType, false);
if (ReportFileName <> '') and (CurrReportShablons <> nil) then
begin
//*** Определить имя файла пользовательского отчета
ReportFilePath := GetPathToUserReportFile(ReportFileName);
//*** Определить стандартную папку с отчетами
{$if Defined(ES_GRAPH_SC)}
StandartReportDir := ExeDir + '\' + dnReports;
{$else}
StandartReportDir := ExtractFileDir(ParamStr(0))+'\'+dnReports;
{$ifend}
//*** Определить папку User В папке Reports
UserReportDir := ExtractFileDir(ReportFilePath);
if Not DirectoryExists(UserReportDir) then
if Not CreateDir(UserReportDir) then
raise Exception.Create(cResourceReport_Msg11 + UserReportDir);
if FileExists(ReportFilePath) then
if Not DeleteFile(ReportFilePath) then
ReportFilePath := GetNoExistsFileNameForCopy(ReportFilePath);
//*** Определить редактируемый файл
if AMakeEdit = meMake then
begin
CanContinueMake := true;
//*** Если исходный шаблон - не стандартный, то выбрать такой из списка
SrcUserTemplateName.FString := '';
SrcUserTemplateName.FObject := nil;
//if Not AMakeFromStandart then
//begin
// SrcUserTemplateName := InputFormCombo(GForm, cResourceReport_Msg12_1, cResourceReport_Msg12_2,
// CurrReportShablons.GetActiveShablonName, CurrReportShablons.FRepShablons);
// if Integer(SrcUserTemplateName.FObject) <> 0 then
// CanContinueMake := false;
//end;
//*** продолжаем создание
if CanContinueMake then
begin
//*** Определить имя нового шаблона отчета
while True do
begin
NewTemplateName := InputForm(GForm, cResourceReport_Msg10_1, cResourceReport_Msg10_2,
cResourceReport_Msg14 +' '+ DateTimeToStr(Now), dtString);
if CurrReportShablons.FRepShablons.IndexOf(NewTemplateName) <> -1 then
MessageModal(cResourceReport_Msg17_1 +' '+ NewTemplateName +' '+ cResourceReport_Msg17_2, ApplicationName, MB_ICONINFORMATION or MB_OK)
else
Break; //// BREAK ////
end;
if NewTemplateName <> '' then
begin
if AMakeFromStandart then
begin
SrcReportFilePath := StandartReportDir + '\' + ReportFileName;
if FileExists(SrcReportFilePath) then
begin
CopyFileToByName(SrcReportFilePath, ReportFilePath);
FileAttrib := FileGetAttr(ReportFilePath);
if (FileAttrib and fatrReadOnly) = fatrReadOnly then
FileSetAttr(ReportFilePath, FileAttrib - fatrReadOnly);
end;
end
else
begin
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.SaveUserReportByIDToFile(CurrReportShablons.FActiveShablonID, ReportFilePath);
end;
end;
end;
end
else
if AMakeEdit = meEdit then
begin
//SrcUserTemplateName := InputFormCombo(GForm, cResourceReport_Msg13_1, cResourceReport_Msg13_2,
// CurrReportShablons.GetActiveShablonName, CurrReportShablons.FRepShablons);
//if Integer(SrcUserTemplateName.FObject) <> 0 then
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.SaveUserReportByIDToFile(CurrReportShablons.FActiveShablonID, ReportFilePath);
end;
if (ReportFilePath <> '') and FileExists(ReportFilePath) then
begin
RepDesigner.OnSaveReport := RepDesignerSaveReport;
try
if ShowReportFromFile(fmUnsign, ReportItemParams, ReportFilePath, pdDesign, true, AMakeEdit) then
begin
//*** Если был создан новый шаблон
if AMakeEdit = meMake then
begin
//*** деактивировать старый
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, CurrReportShablons.FActiveShablonID, biFalse, qmPhisical);
//*** Внести шаблон в базу
ZeroMemory(@NewUserReportInfo, SizeOf(TUserReportInfo));
NewUserReportInfo.Name := NewTemplateName;
NewUserReportInfo.RepKind := ReportItemParams.RepType;
NewUserReportInfo.TemplateType := ATemplateType;
NewUserReportInfo.UseAsShablon := biTrue;
NewUserReportInfo.RepFileName := ReportFilePath;
NewUserReportInfo.ID := TF_Main(GForm).DM.InsertUserReportToBase(NewUserReportInfo);
CurrReportShablons.AddShablonToList(NewUserReportInfo.ID, NewUserReportInfo.Name, true);
DefineReportNodeControls(Node, true);
end
else
//*** Вгнести отредактированный шаблон
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.UpdateBlobTableFieldByID(tnUserReports, fnRepBlob, CurrReportShablons.FActiveShablonID, nil, ReportFilePath);
end
else
begin
DeleteFile(ReportFilePath);
end;
finally
RepDesigner.OnSaveReport := nil;
end;
end;
end;
end;
end;
function TF_ResourceReport.MakeNewReportTemplateWizard: Boolean;
var
Node: TFlyNode;
ReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
ReportFilePath: String;
NewUserReportInfo: TUserReportInfo;
frPage: TfrPage;
frView: TfrView;
frMemoView: TfrMemoView;
frBandView: TfrBandView;
MilimetrKoeff: Double;
MarginLeft: Integer;
MarginRight: Integer;
MarginTop: Integer;
MarginBottom: Integer;
TitleCellHeight: integer;
CellHeight: Integer;
CellWidth: Integer;
CellGap: Integer;
RegionWitdh: Integer;
IndexOfPaperSize: integer;
PageFooterHeight: Integer;
PageFooterBandTop: Integer;
function AddPage: TfrPage;
begin
Report.Pages.Add;
Result := Report.Pages[Report.Pages.Count - 1];
Result.UseMargins := true;
Result.pgMargins.Left := MarginLeft;
Result.pgMargins.Right := MarginRight;
Result.pgMargins.Top := MarginTop;
Result.pgMargins.Bottom := MarginBottom;
end;
procedure SetfrMemoAligments(AFrMemoView: TfrMemoView);
begin
// Центрировать текст по горизонтали
AFrMemoView.Alignment := (AFrMemoView.Alignment and $FC) + (13 - 11);
// Центрировать текст по вертикали
AFrMemoView.Alignment := (AFrMemoView.Alignment and $E7) + Word(true) * 8 + Word(false) * $10;
end;
begin
Result := false;
TF_Main(GForm).CreateFMakeMarkPage; //04.01.2011
Node := tvReports.Selected;
if Node <> nil then
ReportItemParams := TReportItemParams(Node.Data);
if ReportItemParams <> nil then
begin
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(ttSimple);
//*** Определить имя файла пользовательского отчета
ReportFilePath := GetNoExistsFileNameForCopy(GetPathToUserReportFile('ReportTemplate.frf'));
if (ReportFilePath <> '') and Not FileExists(ReportFilePath) then
if TF_Main(GForm).F_MakeMarkPage.Execute(ReportItemParams.RepType) then
begin
Report.Clear;
// Настроить размеры страници
MilimetrKoeff := 3.6;
with TF_Main(GForm).F_MakeMarkPage do
begin
MarginLeft := Round(GetSpinEditValueMM(seMarginLeft) * MilimetrKoeff);
MarginRight := Round(GetSpinEditValueMM(seMarginRight) * MilimetrKoeff);
MarginTop := Round(GetSpinEditValueMM(seMarginTop) * MilimetrKoeff);
MarginBottom := Round(GetSpinEditValueMM(seMarginBottom) * MilimetrKoeff);
CellHeight := Round(GetSpinEditValueMM(seCellHeight) * MilimetrKoeff);
CellWidth := Round(GetSpinEditValueMM(seCellWidth) * MilimetrKoeff);
CellGap := Round(GetSpinEditValueMM(seCellGap) * MilimetrKoeff);
end;
// Титулка
if TF_Main(GForm).F_MakeMarkPage.cbCreateTitlePage.Checked then
begin
frPage := AddPage;
IndexOfPaperSize := Prn.PaperNames.IndexOf('A4');
if IndexOfPaperSize <> -1 then
frPage.ChangePaper(Prn.PaperSizes[IndexOfPaperSize], 0, 0, -1, poPortrait);
RegionWitdh := frPage.PrnInfo.Pgw - MarginLeft - MarginRight;
TitleCellHeight := 40;
frMemoView := TfrMemoView(frCreateObject(gtMemo, ''));
frPage.Objects.Add(frMemoView);
//frMemoView.SetBounds(MarginLeft, MarginTop*5, RegionWitdh, CellHeight);
//frMemoView.SetBounds(
// MarginLeft,
// Round((frPage.PrnInfo.Pgh/2) - (TitleCellHeight/2)), //Top
// RegionWitdh, TitleCellHeight);
frMemoView.SetBounds(
MarginLeft, MarginTop,
RegionWitdh, frPage.PrnInfo.Pgh - MarginTop - MarginBottom);
SetfrMemoAligments(frMemoView);
frMemoView.Font.Name := TF_Main(GForm).F_MakeMarkPage.FResFont.Name;
frMemoView.Font.Size := 28;
frMemoView.Font.Style := frMemoView.Font.Style + [fsBold, fsItalic];
frMemoView.Memo.Add(tvReports.Selected.Text);
end;
// Страница с данными
frPage := AddPage;
IndexOfPaperSize := Prn.PaperNames.IndexOf(TF_Main(GForm).F_MakeMarkPage.cbPageSize.Text);
if IndexOfPaperSize <> -1 then
frPage.ChangePaper(Prn.PaperSizes[IndexOfPaperSize], 0, 0, -1, TF_Main(GForm).F_MakeMarkPage.FResPrinterOrientation);
RegionWitdh := frPage.PrnInfo.Pgw - MarginLeft - MarginRight;
frBandView := TfrBandView(frCreateObject(gtBand, ''));
frPage.Objects.Add(frBandView);
frBandView.SetBounds(0, MarginTop, 0, CellHeight);
frBandView.BandType := btMasterData;
frBandView.DataSet := frDBDataSet_Master.Name;
//frBandView.Flags := flStretched;
//frBandView.FrameStyle := Ord(psDashDot);
// Ширина печатаемой области
if CellWidth < RegionWitdh then
begin
frBandView.Columns := Trunc(RegionWitdh / (CellWidth + CellGap));
frBandView.ColumnWidth := CellWidth;
frBandView.ColumnGap := CellGap;
end;
frMemoView := TfrMemoView(frCreateObject(gtMemo, ''));
frPage.Objects.Add(frMemoView);
frMemoView.SetBounds(MarginLeft, MarginTop, CellWidth, CellHeight);
SetfrMemoAligments(frMemoView);
frMemoView.Memo.Add('[mtReport."Name_Mark"]');
frMemoView.FillColor := clWhite;
frMemoView.Font.Name := TF_Main(GForm).F_MakeMarkPage.FResFont.Name;
frMemoView.Font.Size := TF_Main(GForm).F_MakeMarkPage.FResFont.Size;
frMemoView.Font.Style := TF_Main(GForm).F_MakeMarkPage.FResFont.Style;
frMemoView.FrameColor := TF_Main(GForm).F_MakeMarkPage.ceLineColor.SelectedColor;
frMemoView.FrameStyle := TF_Main(GForm).F_MakeMarkPage.FResFrameStyle; //Ord(psDashDot);
frMemoView.FrameTyp := TF_Main(GForm).F_MakeMarkPage.FResFrameTyp;
frMemoView.FrameWidth := TF_Main(GForm).F_MakeMarkPage.FResFrameWidth;
frMemoView.Flags := flStretched {+ flWordWrap};
// Номера страниц
if TF_Main(GForm).F_MakeMarkPage.cbShowPageNumber.Checked then
begin
PageFooterHeight := 18;
PageFooterBandTop := frPage.PrnInfo.Pgh - MarginBottom - PageFooterHeight;
// Бєнд внизу страници
frBandView := TfrBandView(frCreateObject(gtBand, ''));
frPage.Objects.Add(frBandView);
frBandView.SetBounds(0, PageFooterBandTop, 0, PageFooterHeight);
frBandView.BandType := btPageFooter;
frMemoView := TfrMemoView(frCreateObject(gtMemo, ''));
frPage.Objects.Add(frMemoView);
frMemoView.SetBounds(MarginLeft, PageFooterBandTop, frPage.PrnInfo.Pgw - MarginLeft - MarginRight, PageFooterHeight);
SetfrMemoAligments(frMemoView);
frMemoView.Font.Name := TF_Main(GForm).F_MakeMarkPage.FResFont.Name;
frMemoView.Font.Size := 10;
frMemoView.Memo.Add('-[PAGE#]-');
end;
Report.SaveToFile(ReportFilePath);
if FileExists(ReportFilePath) then
begin
//*** деактивировать старый
if CurrReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, CurrReportShablons.FActiveShablonID, biFalse, qmPhisical);
//*** Внести шаблон в базу
ZeroMemory(@NewUserReportInfo, SizeOf(TUserReportInfo));
NewUserReportInfo.Name := cResourceReport_Msg14 +' '+ DateTimeToStr(Now);
NewUserReportInfo.RepKind := ReportItemParams.RepType;
NewUserReportInfo.TemplateType := ttSimple;
NewUserReportInfo.UseAsShablon := biTrue;
NewUserReportInfo.RepFileName := ReportFilePath;
NewUserReportInfo.ID := TF_Main(GForm).DM.InsertUserReportToBase(NewUserReportInfo);
CurrReportShablons.AddShablonToList(NewUserReportInfo.ID, NewUserReportInfo.Name, true);
DefineReportNodeControls(Node, true);
Result := True;
if TF_Main(GForm).F_MakeMarkPage.cbOpenInDesigner.Checked then
MakeEditReportTemplate(meEdit, false, ttSimple);
//ShowReport(fmUnsign, ReportFilePath, pdDesign);
end;
DeleteFile(ReportFilePath);
end;
end;
end;
procedure TF_ResourceReport.SortMemTableByParams(AMemTable: TkbmMemTable;
AReportItemParams, AReportItemParamValues: TReportItemParams);
var
StrSortFields: String;
i, j: Integer;
MemTableCompareOptions: TkbmMemTableCompareOptions;
Stream : TStream;
FieldNamesDivided: TStringList;
begin
StrSortFields := '';
if AReportItemParamValues <> nil then
begin
// Если в порядке размещения на проекте, то не выполняем сортировку
if (AReportItemParams.CanAsPlacingInProj = biTrue) and
(AReportItemParamValues.CanAsPlacingInProj = biTrue) then
Exit; ///// EXIT /////
end;
for i := 0 to AReportItemParams.FReportSortInfo.FUsedFieldNames.Count - 1 do
begin
if AMemTable.FieldDefs.IndexOf(AReportItemParams.FReportSortInfo.FUsedFieldNames[i]) <> -1 then
begin
if StrSortFields <> '' then
StrSortFields := StrSortFields + ';';
StrSortFields := StrSortFields + AReportItemParams.FReportSortInfo.FUsedFieldNames[i];
end
else
begin
FieldNamesDivided := GetStringsFromStr(AReportItemParams.FReportSortInfo.FUsedFieldNames[i], ';', false);
for j := 0 to FieldNamesDivided.Count - 1 do
if AMemTable.FieldDefs.IndexOf(FieldNamesDivided[j]) <> -1 then
begin
if StrSortFields <> '' then
StrSortFields := StrSortFields + ';';
StrSortFields := StrSortFields + FieldNamesDivided[j];
end;
FreeAndNil(FieldNamesDivided);
end;
end;
if StrSortFields <> '' then
begin
MemTableCompareOptions := [];
if AReportItemParams.FReportSortInfo.CaseSensitive = biFalse then
MemTableCompareOptions := MemTableCompareOptions + [mtcoCaseInsensitive];
if AReportItemParams.FReportSortInfo.Descending = biTrue then
MemTableCompareOptions := MemTableCompareOptions + [mtcoDescending];
//AMemTable.SortOn(StrSortFields, MemTableCompareOptions);
AMemTable.SortOn(StrSortFields, []);
end;
end;
function TF_ResourceReport.PrepareCommerceInvoiceObjects(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams): TSCSCatalog;
const
// Position Type
ptGroup = 1;
ptEndGroup = 2;
ptCompon = 3;
ptGroupTotal = 4;
ptBreak = 5;
var
i, j: integer;
//NBPath: TStringList;
CatalogOwnerPathID: TIntList;
Compon: TSCSComponent;
ComponIDNB: Integer;
RootCatalog: TSCSCatalog; // Корневой объект
ComponCatalog: TSCSCatalog; // Объект для компонента
CatalogWithNoDefined: TSCSCatalog; // Объект с компонентами, которых нету в БД
MaxPathLen: Integer; // Минимальная длина пути
//ptrComponTotalQt: PDouble; // переменная из списка, в которой хранится общее кол-во
//ComponentQt: Double; // Колво одной компоненты
GroupCompon: TSCSComponent;
GroupComponList: TSCSComponents;
LookedWholeID: TIntList;
Catalogs: TSCSCatalogs;
LevelColors: TIntList;
GenCatalogNum: Integer;
//Tolik 24/10/2020 -- для теста --
f: TextFile;
//
// Создаст объект каталога
function CreateCatalogContainer(ANBID: Integer=0; AParentContainer: TSCSCatalog=nil): TSCSCatalog;
begin
Result := TSCSCatalog.Create(GForm);
//Result.Level := ALevel;
//Result.SCSComponents.OwnsObjects := false;
if ANBID <> 0 then
begin
Result.ID := ANBID;
Result.Name := TF_Main(GForm).FNormBase.DM.GetStringFromTableByID(tnCatalog, fnName, Result.ID, qmPhisical);
end;
if AParentContainer <> nil then
AParentContainer.AddChildCatalogToList(Result);
end;
// Строит структуру (путь) объектов из пути ID, вернет самый внутренний каталог
function CatalogPathIDToObject(ACatalogPathID: TIntList): TSCSCatalog;
var
i: Integer;
CurrCatalog: TSCSCatalog;
ChildCatalog: TSCSCatalog;
begin
CurrCatalog := RootCatalog;
for i := 0 to ACatalogPathID.Count - 1 do
begin
ChildCatalog := CurrCatalog.ChildCatalogs.GetByID(ACatalogPathID[i]);
if ChildCatalog = nil then
ChildCatalog := CreateCatalogContainer(ACatalogPathID[i], CurrCatalog);
CurrCatalog := ChildCatalog;
//if (i+1) > MaxCatalogLevel then
// MaxCatalogLevel := i+1;
end;
if (MaxPathLen = 0) or (MaxPathLen < ACatalogPathID.Count) then
MaxPathLen := ACatalogPathID.Count;
Result := CurrCatalog;
end;
// Убирает общие верхние объекты - те у которых один дочерний подобъект
// смотрим чтобы для компонентов был хотя бы один уровень
// и для самого глубокого по возможности - минимкм три уровня
procedure RemoveTopCommonObjects;
var
CurrTopCatalog: TSCSCatalog;
//CatalogToRemove: TSCSCatalog;
RemovedCount: Integer;
begin
CurrTopCatalog := RootCatalog;
RemovedCount := 0;
//while (MaxPathLen - RemovedCount) >= 3 do
while true do
begin
// Проверки для выхода из цыкла
if (CurrTopCatalog.ChildCatalogs.Count > 1) or // если несколько объектов, товыходим
(CurrTopCatalog.SCSComponents.Count > 0) or // если есть компоненты, то выходим
(CurrTopCatalog.ChildCatalogs.Count = 0) or // на всякий случай
//((MaxPathLen-RemovedCount) <= 3) then
((MaxPathLen-RemovedCount) <= 3) then
begin
EmptyProcedure;
Break; //// BREAK ////
end;
RootCatalog := CurrTopCatalog.ChildCatalogs[0];
//RootCatalog.Parent := nil;
CurrTopCatalog.RemoveChildCatalogFromList(RootCatalog);
CurrTopCatalog.Free;
CurrTopCatalog := RootCatalog;
RemovedCount := RemovedCount + 1;
end;
end;
procedure DefineCatalogCodes(AParentCatalogs: TSCSCatalogs; ALevel: Integer=-1);
var
i, j: Integer;
ChildLevelCatalogs: TSCSCatalogs;
Catalog: TSCSCatalog;
begin
ChildLevelCatalogs := TSCSCatalogs.Create(false);
// Определяем номера Каталогов
for i := 0 to AParentCatalogs.Count - 1 do
begin
Catalog := AParentCatalogs[i];
Catalog.Level := ALevel;
GenCatalogNum := GenCatalogNum + 1;
Catalog.MarkID := GenCatalogNum;
Catalog.NameMark := IntToStrF(Catalog.MarkID, 2);
// Определяем список каталогов уровнем ниже
for j := 0 to Catalog.ChildCatalogs.Count - 1 do
ChildLevelCatalogs.Add(Catalog.ChildCatalogs[j]);
end;
if ChildLevelCatalogs.Count > 0 then
DefineCatalogCodes(ChildLevelCatalogs, ALevel+1);
FreeAndNil(ChildLevelCatalogs);
end;
function GetGrpCompon(AProjCompon: TSCSComponent): TSCSComponent;
var
Compon: TSCSComponent;
Izm: String;
i: Integer;
begin
Result := nil;
Izm := AProjCompon.Izm;
if CheckPriceTransformToUOMByCompType(@AProjCompon.ComponentType) then
Izm := GetNameUOM(umMetr, true);
for i := 0 to GroupComponList.Count - 1 do
begin
Compon := GroupComponList[i];
if (Compon.ArticulProducer = AProjCompon.ArticulProducer) and
(Abs(Compon.Price - AProjCompon.Price) < cnstCmpPriceDelta) and
(Compon.Izm = Izm) and
(Compon.GUIDProducer = AProjCompon.GUIDProducer) and
(Compon.Name = AProjCompon.Name) and
(Compon.IsLine = AProjCompon.IsLine) then
begin
Result := Compon;
Break; //// BREAK ////
end;
end;
end;
begin
Result := nil;
try
RootCatalog := CreateCatalogContainer;
RootCatalog.Name := '';
LookedWholeID := TIntList.Create;
GroupComponList := TSCSComponents.Create(false); // групповые кобъекты будут удаляться из каталогов
//LevelColors := TIntList.Create;
try
CatalogWithNoDefined := nil;
MaxPathLen := 0;
{
assignFile(f, 'c:\InvoiceCable.txt');
rewrite(f);
}
for i := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
Compon := ACatalog.ComponentReferences[i];
// Tolik
// по типу сети
if (AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(Compon.GUIDNetType) <> -1))) then
begin
//
// Можем ли использовать этот компонент по параметрам
if ((Compon.Isline = biFalse) or (LookedWholeID.IndexOf(Compon.Whole_ID) = -1)) and
CheckCanLookComponInReportRsrc(Compon, AReportItemParamValues.CanHaveActiveComponents=biTrue,
AReportItemParamValues.CanHaveDismountAccount=biTrue) then
begin
GroupCompon := GetGrpCompon(Compon);
if GroupCompon = nil then
begin
GroupCompon := TSCSComponent.Create(GForm);
GroupCompon.AssignOnlyComponent(Compon);
GroupCompon.Length := 0;
if CheckPriceTransformToUOMByCompType(@GroupCompon.ComponentType) then
GroupCompon.Izm := GetNameUOM(umMetr, true);
//Tolik 03/04/2022 --
{
CatalogOwnerPathID := nil;
ComponIDNB := TF_Main(GForm).FNormBase.DM.GetIntFromTableByGUID(tnComponent, fnID, Compon.GuidNB, qmPhisical);
if ComponIDNB <> 0 then
CatalogOwnerPathID := GetComponCatalogOwnerPathIDByLevel(ComponIDNB, 0, TF_Main(GForm).FNormBase.DM.Query_Select);
// Если есть папка в НБ, то кидаем в объект этой папки
if (CatalogOwnerPathID <> nil) and (CatalogOwnerPathID.Count > 0) then
begin
ComponCatalog := CatalogPathIDToObject(CatalogOwnerPathID);
//ComponCatalog.SCSComponents.Add(Compon);
ComponCatalog.AddComponentToList(GroupCompon);
end
else
// Иначе кидаем в спец. папку с компонентами которых нету в НБ
begin
if CatalogWithNoDefined = nil then
begin
CatalogWithNoDefined := CreateCatalogContainer;
CatalogWithNoDefined.Name := cResourceReport_Msg43;
//08.08.2012 CatalogWithNoDefined.AddComponentToList(GroupCompon);
end;
CatalogWithNoDefined.AddComponentToList(GroupCompon);
end;
}
if CatalogWithNoDefined = nil then
begin
CatalogWithNoDefined := CreateCatalogContainer;
CatalogWithNoDefined.Name := cResourceReport_Msg43;
//08.08.2012 CatalogWithNoDefined.AddComponentToList(GroupCompon);
end;
CatalogWithNoDefined.AddComponentToList(GroupCompon);
//
GroupComponList.Add(GroupCompon);
end;
GroupCompon.Length := GroupCompon.Length + GetComponQuantityByParams(Compon, AReportItemParamValues.CanHaveDismountAccount=biTrue);
{
if isCableComponent(Compon) then
begin
writeln(f, 'i = ' + inttostr(i) + Compon.Name + ' GroupCompon.Length = ' + FloatToStr(GroupCompon.Length) + ' Page = ' + Compon.GetListOwner.Name + ' Compon.ID = ' + IntToStr(Compon.ID));
end;
}
// Запоминаем кабель
//02.08.2012 if (Compon.Isline = biTrue) and (Compon.Whole_ID <> 0) then
//02.08.2012 LookedWholeID.Add(Compon.Whole_ID);
end;
end;
end;
//CloseFile(f);
RemoveTopCommonObjects;
RootCatalog.AddChildCatalogToList(CatalogWithNoDefined);
// Определяем коды (номера папок) по уровням
GenCatalogNum := -1;
Catalogs := TSCSCatalogs.Create(false);
Catalogs.Add(RootCatalog);
DefineCatalogCodes(Catalogs);
FreeAndNil(Catalogs);
// Цвета BGR - blue green red
//LevelColors.Add($FFCC99);
//LevelColors.Add($CCFFCC);
////LevelColors.Add($CCFFFF);
// насыпаем MemTable
//ObjectstsToMT(RootCatalog);
Result := RootCatalog;
finally
//FreeAndNil(LevelColors);
FreeAndNil(GroupComponList);
FreeAndNil(LookedWholeID);
//FreeAndNil(RootCatalog);
end;
except
on E: Exception do AddExceptionToLogExt(ClassName, 'PrepareCommerceInvoiceObjects', E.Message);
end;
end;
procedure TF_ResourceReport.PrepareReportFormats;
var
i, j: Integer;
FrPage: TfrPage;
FrObject: TObject;
FrMemoView: TfrMemoView;
FracDelimetrCode: Integer;
begin
for i := 0 to Report.Pages.Count - 1 do
begin
FrPage := Report.Pages[i];
for j := 0 to FrPage.Objects.Count - 1 do
begin
FrObject := TObject(FrPage.Objects[j]);
if FrObject is TFrMemoView then
begin
FrMemoView := TfrMemoView(FrObject);
// Проверить разделитель
// Код разделителя хранится в 2-х первых байтах
if FrMemoView.Format <> 0 then
begin
FracDelimetrCode := (FrMemoView.Format and $FF);
if Chr(FracDelimetrCode) <> DecimalSeparator then
begin
// Убераем старый код разделителя
FrMemoView.Format := FrMemoView.Format - FracDelimetrCode;
// Добавляем новый код разделителя
FrMemoView.Format := FrMemoView.Format + Ord(DecimalSeparator);
end;
end;
// currenct charset
FrMemoView.Font.Charset := F_LNG.GetActiveCharset;
end;
end;
end;
end;
procedure TF_ResourceReport.RepListWrite(AName: String; AObjCount,
AComponCount: Integer; AWorkCost: Double);
begin
{RichEdit_Report.SelAttributes.Size := 15;
RichEdit_Report.Lines.Add('Лист "'+AName+'" ');
RichEdit_Report.SelAttributes.Size := 14;
RichEdit_Report.Lines.Add(' Объектов '+IntToStr(AObjCount)+'; Компонент '+IntToStr(AComponCount)+'; Стоимость ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
}
end;
procedure TF_ResourceReport.RepObjWrite(AName: String;
AItemType: TItemType; AComponCount: Integer; AWorkCost: Double);
begin
{
RichEdit_Report.SelAttributes.Size := 13;
RichEdit_Report.Lines.Add('');
RichEdit_Report.Lines.Add(' Объект "'+AName+'" ');
RichEdit_Report.SelAttributes.Size := 12;
RichEdit_Report.Lines.Add(' Компонент '+IntToStr(AComponCount)+'; Стоимость ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
}
end;
procedure TF_ResourceReport.RepComponWrite(AName: String;
AisCompon: Boolean; AWorkCost: Double; Apref: Integer);
var BeforeName: String;
begin
{
BeforeName := '';
if AisCompon then
BeforeName := 'Компонент';
RichEdit_Report.SelAttributes.Size := 12;
RichEdit_Report.Lines.Add(DupStr(' ', APref)+ BeforeName +'"'+AName+'" (Стоимость всех ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief+')');
//RichEdit_Report.Lines.Add(' Компонент "'+AName+'" (Стоимость всех ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief+')');
//RichEdit_Report.SelAttributes.Size := 11;
//RichEdit_Report.Lines.Add(' Стоимость всех ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
}
end;
procedure TF_ResourceReport.RepResourcesWrite(AResourcesCost: Double; APref: Integer);
begin
{
RichEdit_Report.SelAttributes.Size := 12;
RichEdit_Report.Lines.Add(DupStr(' ', APref) + 'Ресурсы: (Стоимость '+FloatToStr(RoundIBD(AResourcesCost, 2))+' '+GCurrency.Name_Brief+') ');
//RichEdit_Report.SelAttributes.Size := 11;
//RichEdit_Report.Lines.Add(' Стоимость всех ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
}
end;
procedure TF_ResourceReport.RepResourceWrite(AName: String; AWorkCost: Double; APref: Integer);
begin
{
RichEdit_Report.SelAttributes.Size := 12;
RichEdit_Report.Lines.Add(DupStr(' ', APref) + '"'+AName+'", стоимость '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
//RichEdit_Report.SelAttributes.Size := 11;
//RichEdit_Report.Lines.Add(' Стоимость всех ресурсов '+FloatToStr(RoundIBD(AWorkCost, 2))+' '+GCurrency.Name_Brief);
}
end;
procedure TF_ResourceReport.RepComplectsWrite(AComplCost: Double);
begin
{
RichEdit_Report.SelAttributes.Size := 12;
RichEdit_Report.Lines.Add(DupStr(' ', 15) + 'Комплектующие: (Стоимость '+FloatToStr(RoundIBD(AComplCost, 2))+' '+GCurrency.Name_Brief+') ');
}
end;
procedure TF_ResourceReport.LoadPortName(AIDPointComponent, AIDLineComponent: Integer; var ANppPort: Integer; var APortName: String;
aPort: Pointer=nil; aPortFromPos: PInteger=nil; aPortToPos: PInteger=nil);
var //SCSComponent: TSCSComponent;
i, j: Integer;
Interfac: TSCSInterface;
InterfacLineComponent: TSCSInterface;
InterfLists: TInterfLists;
Interfaces: TList;
PointComponent: TSCSComponent;
LineComponent: TSCSComponent;
Port: TSCSInterface;
//RelInterfConnPositions: TList;
PortFromPos, PortToPos: Integer;
begin
//SCSComponent := nil;
//04.10.2013
if aPort <> nil then
TObject(aPort^) := nil;
if aPortFromPos <> nil then
aPortFromPos^ := 0;
if aPortToPos <> nil then
aPortToPos^ := 0;
ANppPort := 0;
APortName := '';
with F_ProjMan do
begin
PointComponent := GSCSBase.CurrProject.GetComponentFromReferences(AIDPointComponent);
LineComponent := GSCSBase.CurrProject.GetComponentFromReferences(AIDLineComponent);
if Assigned(PointComponent) and
Assigned(LineComponent) then
begin
Interfaces := Tlist.Create;
try
InterfLists := PointComponent.GetInterfacesThatConnectComponent(LineComponent);
if Assigned(InterfLists.InterfList1) then
Interfaces.Assign(InterfLists.InterfList1, laOr);
if Assigned(InterfLists.InterfList2) then
Interfaces.Assign(InterfLists.InterfList2, laOr);
// Tolik 11/03/2017 --
InterfLists.InterfList1.Free;
InterfLists.InterfList2.Free;
//
for i := 0 to Interfaces.Count - 1 do
begin
Interfac := TSCSInterface(Interfaces[i]);
if Interfac.ComponentOwner = PointComponent then
begin
Port := nil;
if Interfac.IsPort = biTrue then
Port := Interfac
else
Port := Interfac.PortOwner;
//*** Найти интерфейс от линейной компоненты
InterfacLineComponent := nil;
for j := 0 to LineComponent.Interfaces.Count - 1 do
if Interfac.ConnectedInterfaces.IndexOf(LineComponent.Interfaces[j]) <> -1 then
begin
InterfacLineComponent := LineComponent.Interfaces[j];
Break; //// BREAK ////
end;
if InterfacLineComponent <> nil then
begin
//RelInterfConnPositions :=
if Assigned(Port) then
begin
ANppPort := GetNppPortByConnected(Port, Interfac, InterfacLineComponent, -1, @PortFromPos, @PortToPos); //Port.NppPort;
APortName := Port.LoadName;
//05.10.2013 - если подключены кабелем к интерфейсу, то вернем его порт с позициямиs
if Interfac.IsPort = biFalse then
begin
if aPort <> nil then
TObject(aPort^) := Port;
if aPortFromPos <> nil then
aPortFromPos^ := PortFromPos;
if aPortToPos <> nil then
aPortToPos^ := PortToPos;
end;
Break; ///// BREAK /////
end;
//FreeAndNil(RelInterfConnPositions);
end;
end;
end;
finally
Interfaces.Free;
end;
end;
//SCSComponent := GSCSBase.CurrProject.GetComponentFromReferences(AIDPointComponent);
{if Assigned(SCSComponent) then
for i := 0 to SCSComponent.Interfaces.Count - 1 do
begin
Interfac := SCSComponent.Interfaces[i];
if Interfac.IsPort = biTrue then
begin
ANppPort := Interfac.NppPort;
APortName := DM.GetInterfName(Interfac.ID_Interface);
end;
end;}
end;
end;
function TF_ResourceReport.GetMultiPortNameMark(APointComponent: TSCSComponent; ARetIndexIfNoMark: Boolean): String;
var
CurrParentComponent: TSCSComponent;
ResComponent: TSCSComponent;
begin
Result := '';
if APointComponent <> nil then
begin
ResComponent := APointComponent;
CurrParentComponent := APointComponent;
while CurrParentComponent <> nil do
begin
if CurrParentComponent.ComponentType.PortKind = pkMultiPort then
begin
ResComponent := CurrParentComponent;
Break; //// BREAK ////
end;
CurrParentComponent := CurrParentComponent.GetParentComponent;
end;
if ResComponent.NameMark <> '' then
Result := ResComponent.NameMark
else
if ARetIndexIfNoMark then
Result := ResComponent.NameMark; //IntToStr(ResComponent.MarkID);
end;
end;
function TF_ResourceReport.GetParallelInterfaces(AFirstConnCompon, AFirstLineCompon, ALastConnCompon, ALastLineCompon: TSCSComponent): TInterfLists;
var InterfacesFirst: TList;
InterfacesLast: TList;
ConnectedInterfFirst: TInterfLists;
ConnectedInterfLast: TInterfLists;
ptrInterfFirst: TSCSInterface;
ptrInterfLast: TSCSInterface;
i, j: Integer;
begin
Result.InterfList1 := nil;
Result.InterfList2 := nil;
Result.InterfList1 := TList.Create;
Result.InterfList2 := TList.Create;
ConnectedInterfFirst := AFirstConnCompon.GetConnectedInterfacesToCompon(AFirstLineCompon);
ConnectedInterfLast := ALastConnCompon.GetConnectedInterfacesToCompon(ALastLineCompon);
//*** Порты в первую очередь
for i := 0 to ConnectedInterfFirst.InterfList1.Count - 1 do
begin
ptrInterfFirst := ConnectedInterfFirst.InterfList1[i];
if Result.InterfList1.IndexOf(ptrInterfFirst) = -1 then
if ptrInterfFirst.IDConnected <> 0 then
for j := 0 to ConnectedInterfLast.InterfList1.Count - 1 do
if TSCSInterface(ConnectedInterfLast.InterfList1[j]).ID = ptrInterfFirst.IDConnected then
if Result.InterfList2.IndexOf(ConnectedInterfLast.InterfList1[j]) = -1 then
begin
Result.InterfList1.Add(ptrInterfFirst);
Result.InterfList2.Add(ConnectedInterfLast.InterfList1[j]);
Break; ///// BREAK /////
end;
end;
for i := 0 to ConnectedInterfFirst.InterfList1.Count - 1 do
begin
ptrInterfFirst := ConnectedInterfFirst.InterfList1[i];
if Result.InterfList1.IndexOf(ptrInterfFirst) = -1 then
if ptrInterfFirst.IDConnected = 0 then
for j := 0 to ConnectedInterfLast.InterfList1.Count - 1 do
if TSCSInterface(ConnectedInterfLast.InterfList1[j]).ID_Interface = ptrInterfFirst.ID_Interface then
if Result.InterfList2.IndexOf(ConnectedInterfLast.InterfList1[j]) = -1 then
begin
Result.InterfList1.Add(ptrInterfFirst);
Result.InterfList2.Add(ConnectedInterfLast.InterfList1[j]);
Break; ///// BREAK /////
end;
end;
//*** Добавить интерфейсы которые не занесены в списки
for i := 0 to ConnectedInterfFirst.InterfList1.Count - 1 do
if Result.InterfList1.IndexOf(ConnectedInterfFirst.InterfList1[i]) = -1 then
Result.InterfList1.Add(ConnectedInterfFirst.InterfList1[i]);
for i := 0 to ConnectedInterfLast.InterfList1.Count - 1 do
if Result.InterfList2.IndexOf(ConnectedInterfLast.InterfList1[i]) = -1 then
Result.InterfList2.Add(ConnectedInterfLast.InterfList1[i]);
// Tolik 11/03/2017 --
{
ConnectedInterfFirst.InterfList1.Free;
ConnectedInterfFirst.InterfList2.Free;
ConnectedInterfLast.InterfList1.Free;
ConnectedInterfLast.InterfList2.Free;
}
FreeAndNil(ConnectedInterfFirst.InterfList1);
FreeAndNil(ConnectedInterfFirst.InterfList2);
FreeAndNil(ConnectedInterfLast.InterfList1);
FreeAndNil(ConnectedInterfLast.InterfList2);
//
end;
function TF_ResourceReport.GetUOMLengthMin: String;
begin
Result := '';
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
Result := GetNameUOM(umInch, true)
else
Result := GetNameUOM(umMillimetr, true);
end;
function TF_ResourceReport.GetUOMWithOrthographMarks: String;
begin
Result := ', ('+GetNameUOM(TF_Main(GForm).FUOM, true)+')';
end;
function TF_ResourceReport.GetUOMWeight: String;
begin
Result := '';
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
Result := GetNameUOM(umPound, true)
else
Result := GetNameUOM(umKg, true);
end;
function TF_ResourceReport.GetUOMWeightOrthographMarks: String;
begin
Result := ', '+GetUOMWeight;
end;
procedure TF_ResourceReport.FormMdiClose(Sender: TObject; var Action: TCloseAction);
begin
FormList.Remove(Sender);
//if Report.Preview = TF_Preview(Sender).frPreview1 then
// Report.Preview := nil;
Action := caFree;
end;
procedure TF_ResourceReport.ApplMinimize(Sender: TObject);
var
i: integer;
//SavedOnAppMinimize: TNotifyEvent;
begin
for i := 0 to FormList.Count - 1 do
begin
TF_Preview(FormList.Items[i]).Hide; // WindowState := wsMinimized;
end;
//SavedOnAppMinimize := Application.OnMinimize;
//Application.OnMinimize := nil;
try
if Assigned(FSavedOnAppMinimize) then
FSavedOnAppMinimize(nil);
except
end;
//Application.OnMinimize := SavedOnAppMinimize;
end;
procedure TF_ResourceReport.ApplRestore(Sender: TObject);
var
i: integer;
//SavedOnAppRestore: TNotifyEvent;
begin
for i := 0 to FormList.Count - 1 do
begin
TF_Preview(FormList.Items[i]).Show; // WindowState := wsMinimized;
end;
//SavedOnAppRestore := Application.OnRestore;
//Application.OnRestore := nil;
try
if Assigned(FSavedOnAppRestore) then
FSavedOnAppRestore(nil);
except
end;
//Application.OnRestore := SavedOnAppRestore;
end;
procedure TF_ResourceReport.DefinePrecisions;
begin
FPricePrecision := 3;
FKolvoPrecision := 3;
if nePricePrecision.Enabled then
FPricePrecision := nePricePrecision.IntValue;
if neKolvoPrecision.Enabled then
FKolvoPrecision := neKolvoPrecision.IntValue;
end;
procedure TF_ResourceReport.DefineRepDesignLanguage;
begin
if FileExists(GetPathToRepDesignLang) then
begin
FFrLocale.UnloadDll;
FFrLocale.LoadDll(GetPathToRepDesignLang);
end;
end;
function TF_ResourceReport.ExtractDirToNewReport(ADateTime: TDateTime): String;
var
CurrDateTime: TDateTime;
begin
Result := '';
try
CurrDateTime := ADateTime;
if CurrDateTime = 0 then
CurrDateTime := Now;
// Tolik --25/09/2020 --
//if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) or (rkCablePath in FReportUseKind) then
//
begin
//Tolik 25/09/2020 --
//if (rkProject in FReportUseKind) or
if ((rkProject in FReportUseKind) or (rkCablePath in FReportUseKind)) then
//
Result := ExtractSaveDir + '\'+cResourceReport_Msg28
else
if rkMarkPages in FReportUseKind then
Result := ExtractSaveDir + '\'+cResourceReport_Msg37;
if Not DirectoryExists(Result) then
CreateDir(Result);
end
else
//24.02.2011 if rkCalc in FReportUseKind then
if IsSimpleReportKind(FReportUseKind) then
begin
Result := ExtractSaveDirSimple +'\!'+cResourceReport_Msg1_12;
if Not DirectoryExists(Result) then
CreateDir(Result);
if DirectoryExists(Result) then
begin
Result := Result +'\'+ FileNameCorrect(DateToStr(CurrDateTime));
if Not DirectoryExists(Result) then
CreateDir(Result);
end;
end;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ExtractDirToNewReport', E.Message);
end;
end;
function TF_ResourceReport.ExtractDirToReportTemplate(AReportName: String): String;
var
DirNameFromUseKind: String;
begin
Result := '';
Result := ExtractSaveDirSimple;
DirNameFromUseKind := '';
if (rkProject in FReportUseKind) or
//24.02.2011 (rkCalc in FReportUseKind)
IsSimpleReportKind(FReportUseKind)
then
DirNameFromUseKind := cResourceReport_Msg31
else
if rkMarkPages in FReportUseKind then
DirNameFromUseKind := cResourceReport_Msg35;
DirNameFromUseKind := FileNameCorrect(DirNameFromUseKind);
if DirNameFromUseKind <> '' then
begin
Result := Result + '\!'+DirNameFromUseKind;
if Not DirectoryExists(Result) then
CreateDir(Result);
if DirectoryExists(Result) then
if AReportName <> '' then
begin
Result := Result + '\' + FileNameCorrect(AReportName);
if Not DirectoryExists(Result) then
CreateDir(Result);
end;
end;
end;
function TF_ResourceReport.GetTargetFolder: TSCSCatalog;
begin
Result := nil;
if Assigned(tvReportTarget.Selected) then
Result := TSCSCatalog(tvReportTarget.Selected.Data)
end;
procedure TF_ResourceReport.ShowWizard(AReportUseKind: TReportUseKinds; AShow: Boolean=true);
var
CanReport: Boolean;
ProjectNode: TFlyNode;
NodeToSelect: TFlyNode;
ListNode: TFlyNode;
SCSObject: TSCSCatalog;
SCSList: TSCSList;
i: Integer;
SelItemType: Integer;
SelObjectID: Integer;
ProjManNode: TTreeNode;
ProjManNodeDat: PObjectData;
FlyNodes: TFlyNodes;
ReportNode: TFlyNode;
RepObjects: TSCSCatalogs;
// Tolik
NetTypeCount: Integer;
RootNode, Node: TTreeNode;
function AddObjectToTree(AParentNode: TFlyNode; AObject: TSCSCatalog): TFlyNode;
var
SCSList: TSCSList;
begin
Result := tvReportTarget.Items.AddChild(AParentNode, AObject.GetNameForVisible(false));
//Result.ImageIndex := tciiList;
Result.ImageIndex := TF_Main(GForm).GetImageIndexByObjectData(nil, AObject.ItemType, ekNone, AObject);
Result.SelectedIndex := Result.ImageIndex;
Result.Data := AObject;
Result.Cells[tciCAD] := bsTrue;
SCSList := nil;
if AObject is TSCSList then
SCSList := TSCSList(AObject);
if Assigned(SCSList) {and CheckListNormalType(SCSList.CurrID)} then
begin
SCSList.IsNormalType := CheckListNormalType(SCSList.CurrID);
if Not SCSList.IsNormalType then
Result.Cells[tciReport] := bsGray;
//Result.Hidden := SCSList.IsNormalType;
end;
// Для папки лочим печать лита
if AObject.ItemType = itDir then
Result.Cells[tciCAD] := bsGray;
// Если объект добавляем в папку, то делаем его отключенным по умолчанию для пакетной печати
//if TObject(AParentNode.Data) is TSCSCatalog then
// if TSCSCatalog(AParentNode.Data).ItemType = itDir then
// Result.Cells[tciReport] := bsFalse;
if (AObject.ItemType = SelItemType) and (AObject.ID = SelObjectID) then
NodeToSelect := Result;
if Not AParentNode.Expanded then
AParentNode.Expanded := true;
end;
procedure AddChildObjectsToTree(AObjectNode: TFlyNode; AObject: TSCSCatalog; ALevel: Integer);
var
ChildCatalogs: TSCSCatalogs;
ChildCatalog: TSCSCatalog;
ChildCatalogNode: TFlyNode;
i: Integer;
begin
ChildCatalogs := TSCSCatalogs.Create(false);
TF_Main(GForm).LoadCatalogs(AObject.ID, ALevel, ChildCatalogs, qmMemory);
for i := 0 to ChildCatalogs.Count - 1 do
begin
ChildCatalog := ChildCatalogs[i];
if (ChildCatalog.ItemType = itList) or (ChildCatalog.ItemType = itDir) then
begin
ChildCatalogNode := AddObjectToTree(AObjectNode, ChildCatalog);
AddChildObjectsToTree(ChildCatalogNode, ChildCatalog, ALevel+1);
end;
end;
FreeAndNil(ChildCatalogs);
end;
begin
FReportUseKind := AReportUseKind;
// Form Caption
if (rkProject in AReportUseKind) or
//24.02.2011 (rkCalc in AReportUseKind)
IsSimpleReportKind(AReportUseKind)
then
begin
Caption := cResourceReport_Msg28;
tvReports.Columns[rciStamp].Visible := true;
btExportTemplateToFile.Style := ComCtrls.tbsDropDown;
btEditTemplate.Style := ComCtrls.tbsDropDown;
btDelTemplate.Style := ComCtrls.tbsDropDown;
pmnuiExportTemplates.Visible := true;
pmnuiEdit.Visible := true;
pmnuiDel.Visible := true;
Act_ExportTemplateToFile.Visible := false;
Act_EditTemplate.Visible := false;
Act_DeleteTemplate.Visible := false;
Act_EditReportSortInfo.Visible := true;
Act_NewSimpleTemplateFromStandart.Visible := true;
Act_NewSimpleTemplateFromUser.Visible := true;
Act_NewStampTemplateFromStandart.Visible := true;
Act_NewStampTemplateFromUser.Visible := true;
Act_ExportSimpleTemplateToFile.Visible := true;
Act_ExportStampTemplateToFile.Visible := true;
Act_EditSimpleTemplate.Visible := true;
Act_EditStampTemplate.Visible := true;
Act_DeleteSimpleTemplate.Visible := true;
Act_DeleteStampTemplate.Visible := true;
Act_NewMarkPage.Visible := false;
Act_NewMarkPageFromUser.Visible := false;
//pmnuiImportTemplate.MenuIndex := pmnuiNewTemplate.MenuIndex + 1;
if rkCablePath in AReportUseKind then
pcRepParams.ActivePage := tsCablePathParams
else
pcRepParams.ActivePage := tsProjRepParams;
FcbCanHaveActiveComponentsCurr := cbCanHaveActiveComponents;
FcbCanHaveDismountAccountCurr := cbCanHaveDismountAccount;
//tvReports.Options := tvReports.Options - [goRowSizing];
//tvReports.WordWrap := false;
//tvReports.FitToHeight := false;
//tvReports.WordWrap := false;
end
else
if rkMarkPages in AReportUseKind then
begin
Caption := cResourceReport_Msg29;
tvReports.Columns[rciStamp].Visible := false;
btExportTemplateToFile.Style := tbsButton;
btEditTemplate.Style := tbsButton;
btDelTemplate.Style := tbsButton;
pmnuiExportTemplates.Visible := false;
pmnuiEdit.Visible := false;
pmnuiDel.Visible := false;
Act_ExportTemplateToFile.Visible := true;
Act_EditTemplate.Visible := true;
Act_DeleteTemplate.Visible := true;
Act_EditReportSortInfo.Visible := false;
Act_NewSimpleTemplateFromStandart.Visible := false;
Act_NewSimpleTemplateFromUser.Visible := false;
Act_NewStampTemplateFromStandart.Visible := false;
Act_NewStampTemplateFromUser.Visible := false;
Act_ExportSimpleTemplateToFile.Visible := false;
Act_ExportStampTemplateToFile.Visible := false;
Act_EditSimpleTemplate.Visible := false;
Act_EditStampTemplate.Visible := false;
Act_DeleteSimpleTemplate.Visible := false;
Act_DeleteStampTemplate.Visible := false;
Act_NewMarkPage.Visible := true;
Act_NewMarkPageFromUser.Visible := true;
//pmnuiImportTemplate.MenuIndex := pmnuiExportTemplate.MenuIndex - 1;
pcRepParams.ActivePage := tsMarkPagesParams;
FcbCanHaveActiveComponentsCurr := cbCanHaveActiveComponentsMarkPages;
FcbCanHaveDismountAccountCurr := cbCanHaveDismountAccountMarkPages;
//tvReports.Options := tvReports.Options + [goRowSizing];
//tvReports.WordWrap := true;
//tvReports.FitToHeight := true;
//tvReports.WordWrap := true;
end;
rbModeView.Checked := true;
FReportCaption := '';
CanReport := true;
if (rkProject in AReportUseKind) or (rkMarkPages in AReportUseKind) then
begin
//*** Нати более подходящий объект для отчета, в зависисмости, где выделение в МП
SelItemType := -1;
SelObjectID := -1;
with TF_Main(GForm) do
begin
SelItemType := itProject;
SelObjectID := GSCSBase.CurrProject.ID;
ProjManNode := nil;
ProjManNode := GetParentNodeByItemType(Tree_Catalog.Selected, [itList]);
ProjManNodeDat := nil;
if ProjManNode <> nil then
ProjManNodeDat := ProjManNode.Data;
if ProjManNodeDat <> nil then
if ProjManNodeDat.ItemType = itList then
begin
SelItemType := ProjManNodeDat.ItemType;
SelObjectID := ProjManNodeDat.ObjectID;
end;
end;
CanReport := false;
//ClearTreeView(tvReportTarget);
tvReportTarget.Items.Clear;
with F_ProjMan do
if Assigned(GSCSBase) then
if Assigned(GSCSBase.CurrProject) then
if GSCSBase.CurrProject.Active then
begin
ProjectNode := tvReportTarget.Items.Add(nil, GSCSBase.CurrProject.GetNameForVisible(false));
ProjectNode.ImageIndex := tciiProject;
ProjectNode.SelectedIndex := ProjectNode.ImageIndex;
ProjectNode.Data := GSCSBase.CurrProject;
ProjectNode.Cells[tciCAD] := bsGray;
ProjectNode.Cells[tciReport] := bsTrue;
NodeToSelect := ProjectNode;
{RepObjects := GetChildCatalogsInPlacingOrder(GSCSBase.CurrProject, [itDir, itList]);
for i := 0 to RepObjects.Count - 1 do
begin
SCSObject := RepObjects[i]; //GSCSBase.CurrProject.ProjectLists[i];
ListNode := tvReportTarget.Items.AddChild(ProjectNode, SCSObject.GetNameForVisible(false));
ListNode.ImageIndex := tciiList;
ListNode.SelectedIndex := ListNode.ImageIndex;
ListNode.Data := SCSObject;
ListNode.Cells[tciCAD] := bsTrue;
SCSList := nil;
if SCSObject is TSCSList then
SCSList := TSCSList(SCSObject);
if Assigned(SCSList) //and CheckListNormalType(SCSList.CurrID) then
begin
SCSList.IsNormalType := CheckListNormalType(SCSList.CurrID);
if Not SCSList.IsNormalType then
ListNode.Cells[tciReport] := bsGray;
//ListNode.Hidden := SCSList.IsNormalType;
end;
if (SCSObject.ItemType = SelItemType) and (SCSObject.ID = SelObjectID) then
NodeToSelect := ListNode;
end;
FreeAndNil(RepObjects);}
AddChildObjectsToTree(ProjectNode, GSCSBase.CurrProject, 0);
ProjectNode.Expanded := true;
tvReportTarget.Selected := NodeToSelect;
CanReport := true;
// Tolik
// типы сетей
NetTypeCount := F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes.Count;
NetTypeGuidList.Clear;
NetTypeGuidListSelected.Clear;
NetTypeTree.Items.Clear;
INeedNormsRecources := False;
RootNode := NetTypeTree.Items.Add( nil, cexdAll);
if NetTypeCount > 0 then
begin
for i := 0 to NetTypeCount - 1 do
begin
Node := NetTypeTree.Items.AddChild(RootNode, TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[i]).Name);
NetTypeGuidList.Add(TNBNetType(F_ProjMan.GSCSBase.CurrProject.Spravochnik.NetTypes[i]).GUID);
end;
end;
NetTypeTree.DropTarget := RootNode;
NetTypeTree.DropTarget.Expand(false);
// чекаем все типы сетей по умолчанию
if NetTypeTree.Items.Count > 1 then
begin
for i := 0 to NetTypeTree.Items.Count - 1 do
begin
Node := NetTypeTree.Items[i];
if Node.AbsoluteIndex <> 0 then
NetTypeTree.Itemstate[Node.AbsoluteIndex] := csChecked;
end;
end
else
begin
if NetTypeTree.Items.Count = 1 then
NetTypeTree.Itemstate[0] := csChecked;
end;
end;
end;
gbTarget.Visible := (rkProject in AReportUseKind) or (rkMarkPages in AReportUseKind);
splitTarget.Visible := gbTarget.Visible;
//gbParams.Enabled := (rkProject in AReportUseKind);
gbParams.Enabled := (rkProject in AReportUseKind) or (rkMarkPages in AReportUseKind) or (rkCablePath in AReportUseKind) or (rkCrossConnection in AReportUseKind);
nePricePrecision.IntValue := GSCSIni.PM.RepPricePrecision;
neKolvoPrecision.IntValue := GSCSIni.PM.RepKolvoPrecision;
if CanReport then
begin
// Определить шаблоны отчетов
DefineRepTemplates;
// Подгрузить инфу для сортировки данных в отчетах
if Not (rkMarkPages in AReportUseKind) then
DefineRepSortInfo;
DefineReportModeControls;
// Настроить видимость отчетов
tvReports.OnSelectedChanged := nil;
try
for i := 0 to tvReports.Items.Count - 1 do
begin
ReportNode := tvReports.Items[i];
if TReportItemParams(ReportNode.Data).ReportUseKind in AReportUseKind then
begin
ReportNode.Show(false);
// Если отчет отмечен и без шаблона, то снять отметку
if ReportNode.Cells[rciIsOn] = bsTrue then
if TReportItemParams(ReportNode.Data).FSimpleShablons.FActiveShablonID = -1 then
ReportNode.Cells[rciIsOn] := bsFalse;
end
else
ReportNode.Hide;
{$IF Defined(NORMSCS_PE) or Defined(SCS_SPA)}
case TReportItemParams(ReportNode.Data).RepType of
rtNorms:
ReportNode.Hide;
end;
{$IFEND}
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT) or Defined(SCS_SPA)}
case TReportItemParams(ReportNode.Data).RepType of
rtHouse, rtDefectAct:
ReportNode.Hide;
end;
{$IFEND}
end;
finally
tvReports.OnSelectedChanged := tvReportsSelectedChanged;
end;
DefineReportNodeControls(tvReports.Selected, true);
if AShow then
ShowModal
else
Act_ShowWizardReport.Execute;
end
else
ShowMessageByType(Self.Handle, smtDisplay, cResourceReport_Msg3, Application.Title, MB_OK or MB_ICONINFORMATION);
end;
procedure TF_ResourceReport.ShowPreparedReport(AParams: TReportItemParams);
var
ReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
TemplateType: Integer;
ReportFileName: String;
ReportFilePath: String;
IsTemplate: Boolean;
begin
ReportFileName := '';
ReportFilePath := '';
//*** Определить шаблон отчета
ReportItemParams := nil;
//if tvReports.Selected <> nil then
// ReportItemParams := TReportItemParams(tvReports.Selected.Data);
ReportItemParams := AParams;
IsTemplate := false;
if ReportItemParams <> nil then
begin
//*** Опреелить текущий тип шаблона
TemplateType := ttSimple;
if cbReportWithStamp.Enabled and cbReportWithStamp.Checked then
TemplateType := ttStamp;
//*** Определить параметры текщего шаблона
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(TemplateType);
// Tolik 03/10/2020 -- вот тут проебчик... при пакетной печати галочки можно поставить как угодно...
// а у некоторых отчетов просто нет шаблона для отчета со штампом...
// тогда программа возьмет вместо текущего шаблона отчета -- стандартный, что не есть гут...
if CurrReportShablons.FRepShablons.Count = 0 then
begin
if (rbModePacketPrint.Checked or rbModePacketPrintToExcel.Checked) then
if TemplateType = ttStamp then
begin
TemplateType := ttSimple;
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(TemplateType);
end;
end;
//
//*** Если шаблон не стандартный, то извлеч его в файл
if (CurrReportShablons <> nil) and (CurrReportShablons.FActiveShablonID > 0) then
begin
IsTemplate := true;
ReportFileName := GetReportFileNameByType(ReportItemParams.RepType, TemplateType, false);
//showmessage(ReportFileName);
if ReportFileName <> '' then
ReportFilePath := GetPathToUserReportFile(ReportFileName);
if ReportFilePath <> '' then
begin
if FileExists(ReportFilePath) then
if Not DeleteFile(ReportFilePath) then
ReportFilePath := GetNoExistsFileNameForCopy(ReportFilePath);
if ReportFilePath <> '' then
TF_Main(GForm).DM.SaveUserReportByIDToFile(CurrReportShablons.FActiveShablonID, ReportFilePath);
end;
end;
end;
//ShowReport(GFormMode, ReportFilePath, pdScreen);
ShowReportFromFile(GFormMode, AParams, ReportFilePath, FPrintDevice, IsTemplate, meNone);
end;
procedure TF_ResourceReport.ShowReportByParams(AFolder: TSCSCatalog; AParams: TReportItemParams);
var
CanHaveActiveComponents: Boolean;
CanHaveZeroPriceComponents: Boolean;
CanHaveDismountAccount: Boolean;
ComponsWithZeroPrice: Boolean;
CanRoundValue: Boolean;
CanHaveSupplyValue: Boolean;
CanShowKabinet : Boolean;
//ShowHeightOfPlacing: Boolean; // Tolik 06/03/2018 --
GroupByHeightOfPlacing: Boolean; // Tolik 06/03/2018 -
CanShowObjHierarchy : Boolean;
CanGroupByName : Boolean;
CanShowResources : Boolean;
CanShowworks : Boolean;
FormMode: TResourceReportFormMode;
FullPathInCableJournal: Boolean;
CurrReportItemParamValues: TReportItemParams;
TestRep: Boolean;
begin
//Tolik 15/02/2022--
try
if AFolder is TSCSProject then
TSCSProject(AFolder).NotifyBeforeReport;
except
on E: Exception do;
end;
CanHaveActiveComponents := FcbCanHaveActiveComponentsCurr.Checked; //ptrReportItemParams^.CanHaveActiveComponents = biTrue;
CanHaveZeroPriceComponents := cbCanHaveZeroPriceComponents.Checked; //ptrReportItemParams^.CanHaveZeroPriceComponents = biTrue;
CanHaveDismountAccount := FcbCanHaveDismountAccountCurr.Checked;
ComponsWithZeroPrice := cbCanHaveZeroPriceComponents.Checked;
CanRoundValue := cbCanRoundValue.Checked;
CanHaveSupplyValue := cbCanHaveSupplyValue.Checked;
// added by Tolik
CanShowKabinet := (cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled);
CanShowObjHierarchy :=(cbCanShowObjHierarchy.Checked and cbCanShowObjHierarchy.Enabled);
CanGroupByName := (cbCanGroupByName.Checked and cbCanGroupByName.Enabled);
CanShowResources := cbCanShowResources.Checked;
CanShowWorks := cbCanShowWorks.Checked;
//ShowHeightOfPlacing := cbShowHeightOfPlacing.Checked;
GroupByHeightOfPlacing := cbGroupByHeightOfPlacing.Checked;
/////////
CurrReportItemParamValues := GetCurrReportItemParamValues;
if (AParams <> nil) and (Assigned(AFolder) or
//24.02.2011 (rkCalc in FReportUseKind)
IsSimpleReportKind(FReportUseKind)) then
begin
FormMode := AParams.Mode;
FullPathInCableJournal := cbFullPathInCableJournal.Checked; //ptrReportItemParams.FullPathInCableJournal = biTrue;
case AParams.Mode of
fmRResources:
if rbRepModeDocument.Checked then
ShowFolderResourceReport(AFolder, AParams, CanHaveActiveComponents, CanHaveDismountAccount,
ComponsWithZeroPrice, CanRoundValue, CanHaveSupplyValue)
else
if rbRepModeForm.Checked then
begin
TF_Main(GForm).CreateFReportForm;
TF_Main(GForm).F_ReportForm.Execute(AFolder, FReportCaption,
AParams.Mode, true, true, true);
end;
fmRCable, fmRCableExceedLength, fmRCableCanal:
ShowFolderCableReport(AFolder, AParams , AParams.Mode, CanHaveActiveComponents, CanHaveDismountAccount, CurrReportItemParamValues);
//fmRDisparityComponColor, fmRDisparityComponProducer:
//ShowFolderDisparityComponReport(SCSCatalog, ptrReportItemParams.Mode);
fmRCableJournal:
begin
ShowFolderCableJournal(AFolder, AParams, FormMode, CanHaveActiveComponents, CanHaveDismountAccount, FullPathInCableJournal);
end;
fmRCableJournalExt:
ShowFolderCableJournalExt(AFolder, AParams, CanHaveActiveComponents, CanHaveDismountAccount, FullPathInCableJournal);
fmRGOSTCableJournal:
ShowFolderCableJournal(AFolder, AParams, FormMode, CanHaveActiveComponents, CanHaveDismountAccount, false);
fmRSpecification, fmRGOSTSpecification:
begin
if FormMode = fmRGOSTSpecification then
if rbPageSizeA3.Checked then
FormMode := fmRGOSTSpecificationA3
else
if rbPageSizeA4.Checked then
FormMode := fmRGOSTSpecification;
ShowFolderSpecificationReport(AFolder, AParams, CurrReportItemParamValues, FormMode,
CanHaveActiveComponents, CanHaveZeroPriceComponents, CanHaveDismountAccount, CanRoundValue, CanHaveSupplyValue);
end;
//fmRTypeComponents:
//ShowFolderTypeComponenetsReport(SCSCatalog);
fmRNorms:
ShowFolderNormReport(AFolder, AParams, CanHaveActiveComponents);
fmRExplanatoryReport:
ShowFolderExplanatoryReport(AFolder, AParams);
fmRLegendObjectIcons:
ShowFolderLegendObjectIcons(AFolder, AParams, CanHaveActiveComponents);
fmRExplicationRoom:
ShowExplicationRoom(AFolder, AParams, CurrReportItemParamValues);
fmRExplicationComponent:
begin
// Добавлены параметры отчета (флаги для пересчета стоимости компонент и вывода иерархии объектов) Tolik
TestRep := False;
if TestRep then
ShowExplicationComponentOLD(AFolder, AParams, CurrReportItemParamValues)
else
ShowExplicationComponent(AFolder, AParams, CurrReportItemParamValues,CanHaveActiveComponents, CanHaveDismountAccount,
ComponsWithZeroPrice,CanRoundValue, CanHaveSupplyValue, CanShowKabinet, CanShowObjHierarchy, CanGroupByName, {ShowHeightOfPlacing,} GroupByHeightOfPlacing);
end;
fmRCrossJournal, fmRGOSTCrossJournal:
ShowCrossJournal(AFolder, AParams, CurrReportItemParamValues, AParams.Mode);
fmCommerceInvoice:
ShowCommerceInvoice(AFolder, AParams, CurrReportItemParamValues);
fmRHouse:
ShowHouse(AFolder, AParams, CurrReportItemParamValues);
fmRDefectAct:
ShowDefectAct(AFolder, AParams, CurrReportItemParamValues, AParams.Mode);
fmRPriorCostOfProject:
ShowPriorCostOfProjectReport(AParams);
fmCompoSpecification:
ShowComponSpecifications(AFolder, AParams, CurrReportItemParamValues);
fmRCablePaths:
ShowCablePaths(AParams);
fmRCrossConnection:
ShowCrossConnection(AParams);
fmRMarkRoomTS, fmRMarkPathPanel, fmRMarkPathPanelPorts, fmRMarkSocket, fmRMarkSocketPanel, fmRMarkCable:
ShowMarkPages(AFolder, AParams, AParams.Mode, CurrReportItemParamValues);
fmPortReport:
ShowPortConnections(AParams);
end;
end;
FreeAndNil(CurrReportItemParamValues);
end;
function TF_ResourceReport.ShowReportFromFile(AReportMode: TResourceReportFormMode; AParams: TReportItemParams;
AReportFile: String; APrintDevice: TPrintDevice; AIsTemplate: Boolean; AMakeEditTemplate: TMakeEdit): Boolean;
var
SCSDir: String;
ReportFile: String;
DocName: String;
i: Integer;
//frOLEExcelExport: TMyfrOleExl;
frExport: TfrBasicExpFilter;
ProgressCaption: String;
ExtensionName: String;
begin
Result := false;
try
frExport := nil;
ReportFile := '';
if (AReportFile <> '') and FileExists(AReportFile) then
ReportFile := AReportFile
else
begin
{$if Defined(ES_GRAPH_SC)}
SCSDir := ExeDir + '\';
{$else}
SCSDir := ExtractFilePath(paramstr(0));
{$ifend}
ReportFile := GetReportFileNameByType(AParams.RepType, GetTemplateTypeByCurrOptions, rbPageSizeA3.Checked);
ReportFile := SCSDir + dnReports + '\'+ReportFile;
end;
if FileExists(ReportFile) then
begin
frDBDataSet_Detail.DataSource := nil;
case GFormMode of
//added by Tolik
fmWACoordinates:
FReportCaption := cResourceReport_Msg1_29;
fmRResources:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnReportResources
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPResources;
frDBDataSet_Master.DataSource := DataSource_MT_RResources;
end;
fmRCable:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnReportCable
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPCable;
frDBDataSet_Master.DataSource := DataSource_MT_RCable;
end;
fmRCableExceedLength:
begin
//29.01.2009 ReportFile := ReportFile + fnReportCableExceedLength;
frDBDataSet_Master.DataSource := DataSource_MT_RCable;
end;
fmRCableCanal:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnReportCableCanal
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPCableCanal;
frDBDataSet_Master.DataSource := FdsrcCableChannelGrp; //DataSource_MT_RCableGroup;
frDBDataSet_Detail.DataSource := FdsrcCableChannel; //DataSource_MT_RCable;
end;
fmRDisparityComponColor:
begin
//29.01.2009 ReportFile := ReportFile + fnReportDisparityComponColor;
frDBDataSet_Master.DataSource := DataSource_MT_RDisparityCompColor;
end;
fmRDisparityComponProducer:
begin
//29.01.2009 ReportFile := ReportFile + fnRDisparityComponProducer;
frDBDataSet_Master.DataSource := DataSource_MT_RDisparityCompColor;
end;
fmRCableJournal:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRCableJournal
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPCableJournal;
frDBDataSet_Master.DataSource := DataSource_MT_RCableJournal;
end;
fmRCableJournalExt:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRCableJournalExt
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPCableJournalExt;
frDBDataSet_Master.DataSource := DataSource_MT_RCableJournalExt;
frDBDataSet_Detail.DataSource := dsrcRCableJournalInterfaces;
end;
fmRGOSTCableJournal:
begin
//29.01.2009 ReportFile := ReportFile + fnRGOSTCableJournal;
frDBDataSet_Master.DataSource := DataSource_MT_RCableJournal;
end;
fmRTypeComponents:
begin
//29.01.2009 ReportFile := ReportFile + fnRTypeComponents;
frDBDataSet_Master.DataSource := DataSource_MT_RTypeComponents;
frDBDataSet_Detail.DataSource := DataSource_MT_RTypeComponentsDetail;
end;
fmRSpecification, fmRGOSTSpecification, fmRGOSTSpecificationA3:
begin
//29.01.2009 if GFormMode = fmRSpecification then
//29.01.2009 ReportFile := ReportFile + fnRSpecification;
//29.01.2009 if GFormMode = fmRGOSTSpecification then
//29.01.2009 ReportFile := ReportFile + fnRGOSTSpecification;
//29.01.2009 if GFormMode = fmRGOSTSpecificationA3 then
//29.01.2009 ReportFile := ReportFile + fnRGOSTSpecificationA3;
//29.01.2009 if ReportFile <> '' then
begin
frDBDataSet_Master.DataSource := DataSource_MT_RSpecifTypeCompon;
frDBDataSet_Detail.DataSource := DataSource_MT_RSpecification;
end;
end;
fmRNorms:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRNorms
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPNorms;
frDBDataSet_Master.DataSource := DataSource_MT_RNorms;
end;
fmRExplanatoryReport:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRExplanatoryReport
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPExplanatoryReport;
frDBDataSet_Master.DataSource := dsrcExplanatoryProj;
frDBDataSet_Detail.DataSource := dsrcExplanatoryList;
end;
fmRLegendObjectIcons:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRLegendObjectIcons
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPLegendObjectIcons;
frDBDataSet_Master.DataSource := dsrcRLegendObjectIcons;
end;
fmRExplicationRoom:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRExplicationRoom
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPExplicationRoom;
frDBDataSet_Master.DataSource := FdsrcExplicationRoom; //dsrcReport;
frDBDataSet_Detail.DataSource := FdsrcExplicationRoomDetail; //dsrcReportDetail;
end;
fmRExplicationComponent:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRExplicationComponent
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPExplicationComponent;
frDBDataSet_Master.DataSource := FdsrcExplicationCompon; //dsrcReport;
frDBDataSet_Detail.DataSource := FdsrcExplicationComponDetail; //dsrcReportDetail;
frDBDataSet_SubDetail.DataSource := FdsrcExplicationComponSubDetail; //dsrcReportSubDetail;
end;
fmRCrossJournal, fmRGOSTCrossJournal:
begin
//29.01.2009 if GFormMode = fmRCrossJournal then
//29.01.2009 ReportFile := ReportFile + fnRCrossJournal
//29.01.2009 else
//29.01.2009 if GFormMode = fmRGOSTCrossJournal then
//29.01.2009 ReportFile := ReportFile + fnRGOSTCrossJournal;
frDBDataSet_Master.DataSource := FdsrcCrossJournal; //dsrcReport;
end;
fmCommerceInvoice:
begin
frDBDataSet_Master.DataSource := FdsrcCommerceInvoice;
frDBDataSet1.DataSource := DataSource_MT_RNorms;
frDBDataSet2.DataSource := DataSource_MT_RResources;
end;
fmRCablePaths:
begin
frDBDataSet_Master.DataSource := FdsrcCablePaths;
frDBDataSet_Detail.DataSource := FdsrcCablePathsInfo;
end;
fmRCrossConnection:
frDBDataSet_Master.DataSource := FdsrcCrossConnection;
fmRHouse:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRHouse
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPHouse;
frDBDataSet_Master.DataSource := FdsrcHouse;
frDBDataSet_Detail.DataSource := FdsrcApproach;
end;
fmRDefectAct:
begin
//29.01.2009 if Not cbReportWithStamp.Checked then
//29.01.2009 ReportFile := ReportFile + fnRDefectAct
//29.01.2009 else
//29.01.2009 ReportFile := ReportFile + fnRSTAMPDefectAct;
frDBDataSet_Master.DataSource := FdsrcDefectAct;
end;
fmRPriorCostOfProject:
begin
//29.01.2009 ReportFile := ReportFile + fnRPriorCostOfProject;
frDBDataSet_Master.DataSource := dsrcReport;
frDBDataSet_MasterFirst.DataSource := dsrcReportFirst;
end;
fmRMarkRoomTS, fmRMarkPathPanel, fmRMarkPathPanelPorts,
fmRMarkSocket, fmRMarkSocketPanel, fmRMarkCable:
begin
//frDBDataSet_Master.DataSource := dsrcReport;
case GFormMode of
fmRMarkRoomTS:
frDBDataSet_Master.DataSource := FdsrcMarkRoomTS;
fmRMarkPathPanel:
frDBDataSet_Master.DataSource := FdsrcMarkPathPanel;
fmRMarkPathPanelPorts:
frDBDataSet_Master.DataSource := FdsrcMarkPathPanelPorts;
fmRMarkSocket:
frDBDataSet_Master.DataSource := FdsrcMarkSocket;
fmRMarkSocketPanel:
frDBDataSet_Master.DataSource := FdsrcMarkSocketPanel;
fmRMarkCable:
frDBDataSet_Master.DataSource := FdsrcMarkCable;
end;
end;
fmPortReport:
begin
frDBDataSet_Master.DataSource := FdsrcPortReport;
frDBDataSet_Detail.DataSource := FdsrcPortReportDetail;
end;
//else
// Exit; //// EXIT ////
end;
frDBDataSet_MasterFirst.DataSource := dsrcReportFirst;
end;
//if (AReportFile <> '') and FileExists(AReportFile) then
// ReportFile := AReportFile;
if FileExists(ReportFile) then
begin
Application.ProcessMessages;
FMasterOldRecNo := 0;
FDetailOldRecNo := 0;
FOldRecNo := 0;
FCurrRecNo := 0;
FPassNum := 1;
FModifiedReportTemplate := false;
DocName := FReportCaption;
//DocName := ApplicationName + ' - ['+lvReports.Selected.Caption+']';
Report.Title := DocName;
Report.LoadFromFile(ReportFile);
CorrectReport(GFormMode);
if (Not AIsTemplate) or (AMakeEditTemplate = meMake) then
begin
PrepareReportFormats;
// Если идет создание шаблона, то сохранить в файл после коррекции разделителя запятой
if AMakeEditTemplate = meMake then
if ReportFile <> '' then
Report.SaveToFile(ReportFile);
end;
//Report.Pages[0].ColWidth
//Report.Preview.col
if APrintDevice <> pdDesign then
begin
if ExtractFileName(Report.FileName)='RExplicationComponent.frf' then
begin
// if (cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled) then
if (((cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled)) or (cbGroupByHeightOfPlacing.Checked and cbGroupByHeightOfPlacing.Enabled)) then
begin
if Report.Pages.Count > 1 then
begin
Report.CanRebuild := true;
Report.Pages.Pages[0].Visible := false;
Report.Pages.Pages[1].Visible := true;
frDbDataset_master.First;
end
else
begin
ShowMessage(cMain_Mes142);
end;
end
else
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[0].Visible := true;
Report.Pages.Pages[1].Visible := false;
end;
end;
end;
// Tolik
if ExtractFileName(Report.FileName)='RGOSTCableJournal.frf' then
begin
if Report.Pages.Count > 2 then
begin
if cbOldReportForm.Checked then
begin
Report.CanRebuild := true;
Report.Pages.Pages[0].Visible := true;
Report.Pages.Pages[1].Visible := true;
Report.Pages.Pages[2].Visible := false;
Report.Pages.Pages[3].Visible := false;
end
else
begin
Report.CanRebuild := true;
Report.Pages.Pages[0].Visible := false;
Report.Pages.Pages[1].Visible := false;
Report.Pages.Pages[2].Visible := true;
Report.Pages.Pages[3].Visible := true;
end;
end
end;
//
if ExtractFileName(Report.FileName)='RSTAMPExplicationComponent.frf' then
begin
if (cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled) then
begin
if Report.Pages.Count > 2 then
begin
Report.CanRebuild := true;
Report.Pages.Pages[0].Visible := true;
Report.Pages.Pages[1].Visible := false;
Report.Pages.Pages[2].Visible := true;
frDbDataset_master.First;
end
else
begin
ShowMessage(cMain_Mes142);
end;
end
else
begin
if Report.Pages.Count > 2 then
begin
Report.Pages.Pages[0].Visible := true;
Report.Pages.Pages[1].Visible := true;
Report.Pages.Pages[2].Visible := false;
end;
end;
end;
// added by Tolik
if ExtractFileName(Report.FileName)='RCableJournal.frf' then
begin
if cbShowCablePath.Checked then
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[0].Visible := false;
Report.Pages.Pages[1].Visible := true;
end
end
else
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[1].Visible := false;
Report.Pages.Pages[0].Visible := true;
end
end;
//
end;
if ExtractFileName(Report.FileName)='RCableJournalExt.frf' then
begin
if cbShowCablePath.Checked then
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[0].Visible := false;
Report.Pages.Pages[1].Visible := true;
end
end
else
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[1].Visible := false;
Report.Pages.Pages[0].Visible := true;
end
end;
//
end;
if ExtractFileName(Report.FileName)='RCablePaths.frf' then
begin
if AParams.PageToShow = 0 then
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[0].Visible := True;
Report.Pages.Pages[1].Visible := False;
end
end
else
begin
if Report.Pages.Count > 1 then
begin
Report.Pages.Pages[1].Visible := True;
Report.Pages.Pages[0].Visible := False;
end
end;
//
end;
end;
case APrintDevice of
pdDesign:
begin
FModifiedReportTemplate := true;
//RepDesigner.CloseQuery := false;
Report.DesignReport;
Result := FModifiedReportTemplate;
end;
pdScreen{, pdPrinter}:
with TF_Main(GForm) do
begin
if FormList.Count + 1 > 5 then
begin
try
F_Preview := TF_Preview(FormList.First);
F_Preview.Free;
FormList.Remove(FormList.First);
except
end;
for i := 0 to FormList.Count-1 do
begin
F_Preview := TF_Preview(FormList.Items[i]);
F_Preview.Caption := Copy(F_Preview.Caption, 0, pos('№', F_Preview.Caption));
F_Preview.Caption := F_Preview.Caption + IntToStr(i+1);
end;
end;
F_Preview := TF_Preview.Create(Application, GForm);
i := FormList.Add(F_Preview);
Report.Preview := F_Preview.frPreview1;
Report.ShowReport;
if APrintDevice = pdPrinter then
F_Preview.frPreview1.Print;
//CurentReport := ReportKind;
F_Preview.Caption := ConcatStrWithDefis(DocName, cResourceReport_Msg4 + IntToStr(i+1), 1);
F_Preview.OnClose := {F_FR.}FormMdiClose;
F_Preview.ReportFileName := {F_FR.}Report.FileName;
F_Preview.ReportCaption := DocName;
if Assigned(F_Preview.frPreview1.OnMouseDown) then
EmptyProcedure;
//Report.PrintPreparedReportDlg;
case APrintDevice of
pdScreen:
begin //Screen.ActiveForm
F_Preview.Show;
//SetActiveWindow(F_Preview.Handle);
//ShowWindow(F_Preview.Handle, SW_MINIMIZE);
//ShowWindow(F_Preview.Handle, SW_RESTORE);
//SetForegroundWindow(F_Preview.Handle);
end;
pdPrinter:
F_Preview.Close;
end;
Result := true;
end;
pdExcel, pdExcel2007, pdWord2007, pdPdf:
begin
{if FReportCountPrinted = 0 then
begin
frOLEExcelExportStartExportPageEvent(nil, cResourceReport_Msg21, 1);
TF_Main(GForm).F_ProgressExp.HideGauges;
TF_Main(GForm).F_ProgressExp.Message1.Caption := cProgressExp_Msg5;
TF_Main(GForm).F_ProgressExp.Message1.Visible := True;
Application.ProcessMessages;
end;
Report.Preview := nil;
Report.PrepareReport;
if FfrOLEExcelExport = nil then
begin
FfrOLEExcelExport := TF_Main(GForm).F_ProgressExp.CreateMyfrOleExl;
FfrOLEExcelExport.Caption := cResourceReport_Msg21;
FfrOLEExcelExport.OnStartExportPageEvent := frOLEExcelExportStartExportPageEvent;
FfrOLEExcelExport.OnProgressExportPageEvent := frOLEExcelExportProgressExportPageEvent;
FfrOLEExcelExport.OnEndExportPageEvent := frOLEExcelExportEndExportPageEvent;
end;
try
Report.ExportTo(FfrOLEExcelExport,
GetNoExistsFileNameForCopy(FPackgeDir + FileNameCorrect(FReportCaption)+' ('+FObjectName+').'+enXls));
finally
FreeAndNil(FfrOLEExcelExport);
end;}
ProgressCaption := '';
ExtensionName := '';
if APrintDevice = pdExcel then
begin
ProgressCaption := cResourceReport_Msg21;
ExtensionName := enXls;
end
// Tolik 12/03/2020 --
else
if APrintDevice = pdExcel2007 then
begin
ProgressCaption := cResourceReport_Msg21;
ExtensionName := 'xlsx';
//TF_Main(GForm).F_ProgressExp.Hide;
end
else
if APrintDevice = pdWord2007 then
begin
ProgressCaption := cResourceReport_Msg21;
ExtensionName := 'docx';
//TF_Main(GForm).F_ProgressExp.Hide;
end
//
else
if APrintDevice = pdPdf then
begin
ProgressCaption := cResourceReport_Msg39;
ExtensionName := enPdf;
end;
if FReportCountPrinted = 0 then
begin
frOLEExcelExportStartExportPageEvent(nil, ProgressCaption, 1);
TF_Main(GForm).F_ProgressExp.HideGauges;
TF_Main(GForm).F_ProgressExp.Message1.Caption := cProgressExp_Msg5;
TF_Main(GForm).F_ProgressExp.Message1.Visible := True;
Application.ProcessMessages;
end;
Report.Preview := nil;
// Tolik 31/03/2020 -- сохранить видимость страниц шаблона проекта. PrepareReport -- сохранит проект в стрим
// и поднимет из него же... ни при записи ни при чтении видимость страниц не учитывается и устанавливается при
// подъеме со стрима по умолчанию в true.... что не есть хорошо, т.к.
//для експорта в другие форматы -- уже не понятно, какие страницы отображать, а какие -- нет
SaveRopPagesVisibility(Report);
//
Report.PrepareReport;
if frExport = nil then
begin
if ((APrintDevice = pdExcel) or (APrintDevice = pdExcel2007) or (aPrintDevice = pdWord2007)) then
frExport := TF_Main(GForm).F_ProgressExp.CreateMyfrOleExl
else
if APrintDevice = pdPdf then
frExport := TfrPDFExport.Create(Self);
frExport.FileCaption := ProgressCaption;
frExport.Title := DocName;
frExport.OnStartExportPageEvent := frOLEExcelExportStartExportPageEvent;
frExport.OnProgressExportPageEvent := frOLEExcelExportProgressExportPageEvent;
frExport.OnEndExportPageEvent := frOLEExcelExportEndExportPageEvent;
end;
try
if APrintDevice = pdExcel2007 then
begin
//TF_Main(GForm).F_ProgressExp.Close;
ExportReportToXLSX(GetNoExistsFileNameForCopy(FPackgeDir + FileNameCorrect(FReportCaption)+' ('+FObjectName+').'+ExtensionName), Report);
end
else
if APrintDevice = pdWord2007 then
begin
//TF_Main(GForm).F_ProgressExp.Close;
ExportReportToDocX(GetNoExistsFileNameForCopy(FPackgeDir + FileNameCorrect(FReportCaption)+' ('+FObjectName+').'+ExtensionName), Report);
end
else
Report.ExportTo(frExport,
GetNoExistsFileNameForCopy(FPackgeDir + FileNameCorrect(FReportCaption)+' ('+FObjectName+').'+ExtensionName));
finally
FreeAndNil(frExport);
end;
end;
pdPrinter:
begin
Report.Preview := nil;
Report.PrepareReport;
if FFrPrintForm = nil then
Report.PrintPreparedReportDlg
else
begin
Report.PrintPreparedReport('', StrToInt(FFrPrintForm.E1.Text),
FFrPrintForm.CollateCB.Checked, TfrPrintPages(FFrPrintForm.CB2.ItemIndex));
end;
end;
end;
//Report.ShowReport;
end;
except
on E: Exception do
begin
AddExceptionToLog('TF_ResourceReport.ShowReport: '+E.Message);
{ if rbModePacketPrintToExcel.Checked then
begin
Inc(FReportCountPrinted);
if (FReportCountPrinted = FReportCountToPrint) then
begin
if FReportCountPrinted = FReportCountToPrint then
begin
//*** Догнать до 100
for i := TF_Main(GForm).F_ProgressExp.gTotal.Progress + 1 to TF_Main(GForm).F_ProgressExp.gTotal.MaxValue do
begin
TF_Main(GForm).F_ProgressExp.gTotal.Progress := i;
TF_Main(GForm).F_ProgressExp.gTotal.Refresh;
Sleep(500);
end;
if TF_Main(GForm).F_ProgressExp.cbOpen.Checked then
ShellExecute(Handle, nil, PChar(FPackgeDir), nil, nil, SW_SHOW);
end;
FReportCountPrinted := FReportCountToPrint;
TF_Main(GForm).F_ProgressExp.Close;
end;
end;}
IncPaketPrintCounter;
end;
end;
end;
function TF_ResourceReport.CheckCanShowReport(ACAtalog: TSCSCatalog): Boolean;
begin
Result := false;
if CheckIsOpenProject(true) then
if ACatalog.ItemType in [itProject, itList, itDir] then
Result := true
else
ShowMessageByType(Self.Handle, smtDisplay, cResourceReport_Msg5+' "'+ACAtalog.Name+'"', Application.Title, MB_OK or MB_ICONINFORMATION);
end;
procedure TF_ResourceReport.InitRepMsgList;
begin
if FRepMsgList = nil then
begin
FRepMsgList := CreateStringListSorted;
AddStrObjToStrings(FRepMsgList, 'COMMERCEINVOICE', cRepMsg193);
AddStrObjToStrings(FRepMsgList, 'INVOICE_BUDGET', cRepMsg194);
AddStrObjToStrings(FRepMsgList, 'INVOICE_CODE', cRepMsg195);
AddStrObjToStrings(FRepMsgList, 'INVOICE_NAT', cRepMsg196);
AddStrObjToStrings(FRepMsgList, 'INVOICE_UOM', cRepMsg197);
AddStrObjToStrings(FRepMsgList, 'INVOICE_NAME', cRepMsg198);
AddStrObjToStrings(FRepMsgList, 'INVOICE_QT', cRepMsg199);
AddStrObjToStrings(FRepMsgList, 'INVOICE_PRICE', cRepMsg200);
AddStrObjToStrings(FRepMsgList, 'INVOICE_COST', cRepMsg201);
// Cable Paths
AddStrObjToStrings(FRepMsgList, 'CABPATH_REPNAME', cRepMsg202);
AddStrObjToStrings(FRepMsgList, 'CABPATH_NAME', cRepMsg203);
AddStrObjToStrings(FRepMsgList, 'CABPATH_FOR', cRepMsg204);
AddStrObjToStrings(FRepMsgList, 'CABPATH_CABLE', cRepMsg204);
//Cross-connection
AddStrObjToStrings(FRepMsgList, 'CROSSCONNECTION_REPNAME', cRepMsg205);
AddStrObjToStrings(FRepMsgList, 'CROSSCONNECTION_WITH', cRepMsg206);
//19.11.2013 Labor time
AddStrObjToStrings(FRepMsgList, 'LABOR_TIME', cRepMsg207);
AddStrObjToStrings(FRepMsgList, 'PRICE_PER_TIME_BEFORE', cRepMsg208_1);
AddStrObjToStrings(FRepMsgList, 'PRICE_PER_TIME_AFTER', cRepMsg208_2);
AddStrObjToStrings(FRepMsgList, 'TOTAL_LABOR_TIME', cRepMsg209);
AddStrObjToStrings(FRepMsgList, 'VOLUME_QTY', cRepMsg210);
AddStrObjToStrings(FRepMsgList, 'TOTALCOSTTAX', cRepMsg211);
end;
end;
// ##### Показывает отчет ведомости объектов Листа #####
procedure TF_ResourceReport.ShowListObjectReport(AIDComponList: Integer);
(*
var ListSCSObjects: TList;
ptrSCSObject: PSCSCatalog;
SCSList: TSCSCatalog;
ptrSCSNorm: PSCSNorm;
ptrSCSComponent: PSCSComponent;
ptrSCSComplect: PSCSComponent;
i, j, k, l: Integer;
ListWorkCost: Double;
ComponCount: integer;
ObjectLength: Double;
procedure ResourcesWrite(ACompon: PSCSComponent; AIsCompon: Boolean; APref: Integer);
var i, j: integer;
ptrSCSNorm: PSCSNorm;
// ptrResource: PResource;
begin
(* if AIsCompon then
RepComponWrite(ACompon.Name, AIsCompon, ACompon.TotalCost, APref)
else
RepComponWrite(ACompon.Name, AIsCompon, ACompon.ResourcesCost, APref);
RepResourcesWrite(ACompon.ResourcesCost {- ACompon.PRICE_CALC + ACompon.PRICE}, APref + 4);
for i := 0 to ACompon.Norms.Count - 1 do
begin
ptrSCSNorm := ACompon.Norms.Items[i];
if ptrSCSNorm.IsOn = biTrue then
for j := 0 to ptrSCSNorm.Resources.Count - 1 do
begin
ptrResource := ptrSCSNorm.Resources.Items[j];
if ptrResource.IsOn = biTrue then
RepResourceWrite(ptrResource.Name, ptrSCSNorm.Kolvo * ptrResource.Cost, APref + Round(APref / 3) + 4);
end;
end;
if ACompon.Norms.Count > 0 then
RepResourceWrite(ACompon.Name , ACompon.Price * TSCSNorm(ACompon.Norms[0]^).Kolvo, APref + Round(APref / 3) + 4);
end;
*)
begin
(*if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
try
try
with TF_Main(GForm).DM do
begin
SCSList := TSCSCatalog.Create(GForm);
SCSList.LoadCatalogByID(AIDComponList, false);
//*** Отобрать все объекты Листа
SetSQLToQuery(scsQSelect, ' select id from katalog '+
' where (parent_id = '''+IntToStr(AIDComponList)+''') and (( id_item_type = '''+IntToStr(itSCSLine)+''') or ( id_item_type = '''+IntToStr(itSCSConnector)+''') ) ');
ListSCSObjects := TList.Create;
//*** Загрузка объектов в список
while Not scsQSelect.Eof do
begin
New(ptrSCSObject);
ptrSCSObject^ := TSCSCatalog.Create(GForm);
ptrSCSObject.ID := scsQSelect.FN('id').AsInteger;
ptrSCSObject.ItemType := itList;
ListSCSObjects.Add(ptrSCSObject);
scsQSelect.Next;
end;
//*** Загрузить компоненты объектов
ListWorkCost := 0;
ComponCount := 0;
for i := 0 to ListSCSObjects.Count - 1 do
begin
ObjectLength := 0;
ptrSCSObject := ListSCSObjects.Items[i];
//*** Загрузить Объект
ptrSCSObject.LoadCatalogByID(ptrSCSObject.ID, true, false);
if ptrSCSObject.ItemType = itSCSLine then
ObjectLength := TF_Main(GForm).GetPropertyValueAsFloat(tkCatalog, ptrSCSObject.ID, pnLength, -1);
//*** Загрузить Компоненты для этого объекта
for j := 0 to ptrSCSObject.SCSComponents.Count - 1 do
begin
ptrSCSComponent := ptrSCSObject.SCSComponents.Items[j];
if ptrSCSComponent.IsLine = bitrue then
ptrSCSComponent.Length := ObjectLength;
//*** Загрузить Нормы для компоненты и посчитать
// стоимость компоненты, ее комплектующих, и ресурсов
ptrSCSComponent.NormsResources.CalcResourcesCost(true, true);
//*** Загрузить все Комплектующие c нормами этой компоненты
ptrSCSComponent.LoadAllSCSComplects(cdNorms or cdCalcResCost);
ptrSCSComponent.AddToTotalCostComplResourcesCost;
end;
ptrSCSObject.CalcResourcesCost(false, false, false);
ListWorkCost := ListWorkCost + ptrSCSObject.ResourcesCost;
ComponCount := ComponCount + ptrSCSObject.SCSComponents.Count;
end;
//*** Формирование отчета
RichEdit_Report.Lines.Clear; //*** Вывести Лист
RepListWrite(SCSList.Name, ListSCSObjects.Count, ComponCount, ListWorkCost);
for i := 0 to ListSCSObjects.Count - 1 do
begin
ptrSCSObject := ListSCSObjects.Items[i];
//*** Вывести Объекты
RepObjWrite(ptrSCSObject.Name, ptrSCSObject.ItemType, ptrSCSObject.SCSComponents.Count, ptrSCSObject.ResourcesCost);
for j := 0 to ptrSCSObject.SCSComponents.Count - 1 do
begin
ptrSCSComponent := ptrSCSObject.SCSComponents.Items[j];
//*** Вывести компоненты
//RepComponWrite(ptrSCSComponent.Name, true, ptrSCSComponent.TotalCost, 11);
//ResourcesWrite(ptrSCSComponent, 15);
ResourcesWrite(ptrSCSComponent, true, 11);
//*** Вывести комплектующие
//RepComplectsWrite(ptrSCSComponent.PriceComponWithComplects - ptrSCSComponent.Price);
RepComplectsWrite(ptrSCSComponent.ComplResourcesCost);
for k := 0 to ptrSCSComponent.AllSCSComplects.Count - 1 do
begin
ptrSCSComplect := ptrSCSComponent.AllSCSComplects.Items[k];
ResourcesWrite(ptrSCSComplect, false, 19);
end;
{RepResourcesWrite(ptrSCSComponent.ResourcesCost, 15);
for k := 0 to ptrSCSComponent.Norms.Count - 1 do
begin
ptrSCSNorm := ptrSCSComponent.Norms.Items[k];
if ptrSCSNorm.IsOn = biTrue then
for l := 0 to ptrSCSNorm.Resources.Count - 1 do
begin
ptrResource := ptrSCSNorm.Resources.Items[l];
if ptrResource.IsOn = biTrue then
RepResourceWrite(ptrResource.Name, ptrResource.Cost, 19);
end;
end;
RepResourceWrite(ptrSCSComponent.Name , ptrSCSComponent.Price, 19); }
end;
end;
Caption := 'Ведомость объектов';
GFormMode := fmRObject;
ShowModal;
end;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
finally
if ListSCSObjects <> nil then
begin
//FreeAndNil(SCSList);
//SCSList.Destroy;
SCSList.Free;
for i := 0 to ListSCSObjects.Count - 1 do
begin
ptrSCSObject := ListSCSObjects.Items[i];
ptrSCSObject^.Free;
//ptrSCSObject^.Free;
end;
FreeList(ListSCSObjects);
end;
end; *)
end;
// Ведомость ресурсов
procedure TF_ResourceReport.ShowFolderResourceReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
ACanHaveActiveComponents, ACanHaveDismountAccount, AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue: Boolean);
var
NormResources: TSCSNormsResources;
i,j : Integer;
ResourceRel: TSCSResourceRel;
ResourceCompon: TSCSComponent;
SprSuppliesKind: TNBSuppliesKind;
ProjectOwner: TSCSProject;
// Tolik 28/08/2019 --
//OldTick, CurrTick: Cardinal;
OldTick, CurrTick: DWord;
//
TotalCost: Double;
// Added by Tolik
CableTypes : TCableTypeArray;
CableIdsList : TIntList;
SCSComponent : TSCSComponent;
CableTypeFound : boolean;
{const CmpDelta = 0.001;
var //Folder: TSCSCatalog;
SCSCatalog: TSCSCatalog;
SCSComponent: TSCSComponent;
PartComponent: TSCSComponent;
LookedResources: TSCSResources;
GroupList: TList;
GroupListFromNorm: TList;
GroupResource: TSCSResourceRel;
GroupComponentsList: TSCSComponents;
LookedComponents: TSCSComponents;
i, j, k: Integer;
TotalCost: Double;}
{
procedure AddComponentToGroup(AComponent: TSCSComponent);
var GrComponent: TSCSComponent;
i: Integer;
ExistsGroup: Boolean;
begin
GrComponent := nil;
if Assigned(AComponent) then
if LookedComponents.IndexOf(AComponent) = -1 then
if AComponent.Price > 0 then
begin
ExistsGroup := false;
for i := 0 to GroupComponentsList.Count - 1 do
begin
GrComponent := GroupComponentsList[i];
if (GrComponent.GuidNB = AComponent.GuidNB) and
(Abs(GrComponent.Price - AComponent.Price) < CmpDelta) then
begin
if GrComponent.IsLine = biFalse then
GrComponent.Length := GrComponent.Length + 1
else
GrComponent.Length := GrComponent.Length + AComponent.Length;
ExistsGroup := true;
end;
end;
if Not ExistsGroup then
begin
GrComponent := TSCSComponent.Create(GForm);
GrComponent.AssignOnlyComponent(AComponent);
if GrComponent.isLine = biFalse then
GrComponent.Length := 1
else
GrComponent.Length := AComponent.Length;
GroupComponentsList.Add(GrComponent);
end;
end;
end;
procedure AddResourceToGroup(AResourceRel: TSCSResourceRel; AGroupList: Tlist);
var GrResource: TSCSResourceRel;
ExistsGroup: Boolean;
i: integer;
begin
if (AResourceRel = nil) or (AGroupList = nil) then
Exit; //// EXIT ////
if AResourceRel.IsOn = biFalse then
Exit; //// EXIT ////
if AResourceRel.Cost = 0 then
Exit; //// EXIT ////
if LookedResources.IndexOf(AResourceRel) = -1 then
begin
//*** Найти нужную группу
ExistsGroup := false;
GrResource := nil;
for i := 0 to AGroupList.Count - 1 do
begin
GrResource := AGroupList[i];
if (GrResource.GuidNB = AResourceRel.GuidNB) and
(GrResource.TableKindNB = AResourceRel.TableKindNB) and
(Abs(GrResource.Price - AResourceRel.Price) < CmpDelta) then
begin
ExistsGroup := true;
GrResource.Kolvo := GrResource.Kolvo + AResourceRel.Kolvo;
GrResource.Cost := GrResource.Cost + AResourceRel.Cost;
end;
end;
if Not ExistsGroup then
begin
GrResource := TSCSResourceRel.Create(GForm, ntProj);
GrResource.Assign(AResourceRel);
AGroupList.Add(GrResource);
end;
LookedResources.IndexOf(AResourceRel);
end;
end;
procedure AddNormResourcesToGroup(ANormsResources: TSCSNormsResources);
var i, j: Integer;
ResourceRel: TSCSResourceRel;
SCSNorm: TSCSNorm;
begin
if ANormsResources = nil then
Exit; ///// EXIT /////
for i := 0 to ANormsResources.Resources.Count - 1 do
begin
ResourceRel := ANormsResources.Resources[i];
AddResourceToGroup(ResourceRel, GroupList);
end;
for i := 0 to ANormsResources.Norms.Count - 1 do
begin
SCSNorm := ANormsResources.Norms[i];
for j := 0 to SCSNorm.Resources.Count - 1 do
begin
ResourceRel := SCSNorm.Resources[j];
AddResourceToGroup(ResourceRel, GroupListFromNorm);
end;
end;
end;
procedure LoadComponentsToMT(AComponents: TSCSComponents);
var i: Integer;
GrComponent: TSCSComponent;
ComponentCost: Double;
begin
if Assigned(AComponents) then
for i := 0 to AComponents.Count - 1 do
begin
GrComponent := AComponents[i];
ComponentCost := 0;
ComponentCost := GrComponent.Length * GrComponent.Price;
MemTable_RResources.Append;
MemTable_RResources.FieldByName('ID').AsInteger := GrComponent.IDNormBase;
MemTable_RResources.FieldByName('NAME').AsString := GrComponent.Name;
MemTable_RResources.FieldByName(fnIzm).AsString := GrComponent.Izm;
MemTable_RResources.FieldByName('Kolvo').AsFloat := RoundX(GrComponent.Length, 2);
MemTable_RResources.FieldByName('Price').AsFloat := RoundX(GrComponent.Price, 2);
MemTable_RResources.FieldByName('Cost').AsFloat := RoundX(ComponentCost, 2);
MemTable_RResources.Post;
TotalCost := TotalCost + ComponentCost;
end;
end; }
procedure LoadResourcesToMT(AResources: TSCSResources);
var i: Integer;
ResourceRel: TSCSResourceRel;
Kolvo, Price, Cost: Double;
begin
for i := 0 to AResources.Count - 1 do
begin
ResourceRel := AResources[i];
MemTable_RResources.Append;
MemTable_RResources.FieldByName('ID').AsInteger := ResourceRel.ID;
MemTable_RResources.FieldByName(fnName).AsString := ResourceRel.Name;
MemTable_RResources.FieldByName(fnArticulProducer).AsString := ResourceRel.ArtProducer;
MemTable_RResources.FieldByName(fnArticulDistributor).AsString := ResourceRel.ArtDistributor;
MemTable_RResources.FieldByName(fnProducerName).AsString := TF_Main(GForm).FNormBase.DM.GetStringFromTableByGUID(tnProducers, fnName, ResourceRel.GUIDProducer, qmPhisical);
MemTable_RResources.FieldByName(fnIzm).AsString := ResourceRel.Izm;
{//21.03.2012
MemTable_RResources.FieldByName('Kolvo').AsFloat := Round3(ResourceRel.Kolvo);
MemTable_RResources.FieldByName('Price').AsFloat := Round3(ResourceRel.Price);
MemTable_RResources.FieldByName('Cost').AsFloat := Round3(ResourceRel.Cost);
MemTable_RResources.Post;
TotalCost := TotalCost + Round3(ResourceRel.Cost);
//TotalCost := TotalCost + ResourceRel.Cost;
}
Kolvo := RoundX(ResourceRel.Kolvo, FKolvoPrecision);
Price := RoundX(ResourceRel.Price, FPricePrecision);
Cost := RoundX(Kolvo * Price, Max(FKolvoPrecision, FPricePrecision) );
MemTable_RResources.FieldByName('Kolvo').AsFloat := Kolvo;
MemTable_RResources.FieldByName('Price').AsFloat := Price;
MemTable_RResources.FieldByName('Cost').AsFloat := Cost;
MemTable_RResources.Post;
TotalCost := TotalCost + Cost;
end;
MemTable_RResources.SortOn(fnName, []);
end;
begin
CableIdsList := nil;
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
OldTick := GetTickCount;
TotalCost := 0;
if Assigned(AFolder) then
begin
// Added by Tolik
// Расчет расхода кабеля в поставочных величинах
// Если задано вывести отчет в поставочных величинах,
// то посчитаем расход кабеля в поставочных величинах
// Если задан учет поставочных величин, формируем список кабелей
if ACanHaveSupplyValue then
begin
SetLength(CableTypes, 0);
if CableIdsList = nil then
CableIDsList := TIntList.Create;
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
SCSComponent := AFolder.ComponentReferences[i]; // компонент
// если кабель
if (SCSComponent.IsLine = biTrue) and
CheckCanLookComponInReportCable(SCSComponent, ACanHaveDismountAccount)
// Tolik 14/11/22 --
//and CheckSysNameIsCable(SCSComponent.ComponentType.SysName) then
and isCableComponent(SCSComponent) then
//
begin
if AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType)<> -1)) then
begin
SCSComponent.RefreshWholeLengthIfNecessary;
// цепляем к списк кабелей
// CableTypesAdd(SCSComponent, CableTypes, CableIdsList,SCSComponent.ID);
CableTypesAdd(SCSComponent, CableTypes, CableIdsList,SCSComponent.Whole_ID, Self);
end;
end;
end;
// если на проекте есть кабели
if (Length(CableTypes) > 0) And (cbCanHaveSupplyValue.Checked = true) and (not cbNone.Checked) then
// расчет расхода кабеля
// Tolik 03/11/2020 -- тут только если поставочные величины и выбран метод учета бухт,
// иначе - в единицах измерения проекта
//CableReelCalculate(CableTypes, 'MaxScrapRate', ReelsCableFlow, Self)
begin
if cbMaxScrapRate.Checked then
CableReelCalculate(CableTypes, 'MaxScrapRate',ReelsCableFlow, Self);
if cbMaxEfficiency.Checked then
CableReelCalculate(CableTypes, 'MaxEfficiency',ReelsCableFlow, Self);
end
//
// если нет - сбросим результаты предидущих расчетов,
// в случае наличия таковых
else
if ReelsCableFlow <> nil then
begin
ReelsCableFlow.Clear;
if Length(CableTypes) > 0 then
SetLength(CableTypes, 0); // на всякий х
end;
end; // пипец
try
FCatalog := AFolder;
ProjectOwner := AFolder.GetProject;
DefinePrecisions;
NormResources := nil;
BeginProgress(pcPreparingReport);
try
INeedNormsRecources := True;
NormResources := AFolder.GetAllNormsResources([nrResources, nrAccessories, nrComponents], false,
ACanHaveActiveComponents,
ACanHaveDismountAccount,
AComponsWithZeroPrice, false, true, ACanHaveSupplyValue);
//if ACanHaveSupplyValue or ACanRoundValue then
for i := 0 to NormResources.Resources.Count - 1 do
begin
ResourceRel := NormResources.Resources[i];
ResourceCompon := nil;
if Not ResourceRel.ServIsResource then
if TSCSResourceGroup(ResourceRel).ObjectList.Count > 0 then
if TSCSResourceGroup(ResourceRel).ObjectList[0] is TSCSComponent then
begin
ResourceCompon := TSCSComponent(TSCSResourceGroup(ResourceRel).ObjectList[0]);
end;
if ResourceCompon <> nil then
begin
SprSuppliesKind := nil;
if ACanHaveSupplyValue then
if ResourceRel.GUIDSuppliesKind <> '' then
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(ResourceRel.GUIDSuppliesKind);
//*** Учитывать поставочные велечины
//Tolik 09/11/2020 --
//if SprSuppliesKind <> nil then
if ((SprSuppliesKind <> nil) and (not cbNone.Checked)) then
//
begin
{ResourceRel.Izm := SprSuppliesKind.Data.Name_;
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvo;
ResourceRel.CalcCost;}
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
begin
ResourceRel.Izm := SprSuppliesKind.Data.NameTradUOM;
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
// Для кабелей и каналов в традиционной системы США нужно юзать ФУТЫ
{
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := FloatInUOM(ResourceRel.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;}
// Added by Tolik
if Length(Cabletypes) > 0 then
begin
CableTypeFound := false;
for j := 0 to Length(CableTypes) - 1 do
begin
// if ResourceRel.GuidNB = CableTypes[j].GuidNB then
if ResourceCompon.GUIDSuppliesKind = CableTypes[j].TypeName then
// Tolik 02/11/2020 --
if ResourceRel.Cypher = CableTypes[j].CableCypher then
//
begin
if cbCanRoundValue.Checked then
ResourceRel.Kolvo := Length(CableTypes[j].Reels)
else
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
CableTypeFound := true;
end
end;
if not CableTypeFound then
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
//
ResourceRel.Price := FloatInUOM(ResourceRel.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
// Added by Tolik
if Length(Cabletypes) > 0 then
begin
CableTypeFound := false;
for j := 0 to Length(CableTypes) - 1 do
begin
// if ResourceRel.GuidNB = CableTypes[j].GuidNB then
if ResourceCompon.GUIDSuppliesKind = CableTypes[j].TypeName then
// Tolik 02/11/2020 --
if ResourceRel.Cypher = CableTypes[j].CableCypher then
//
begin
if cbCanRoundValue.Checked then
ResourceRel.Kolvo := Length(CableTypes[j].Reels)
else
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
CableTypeFound := true;
end
end;
if not CabletypeFound then
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
//
// ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
end
else
begin
if not cbNone.Checked then // Tolik 09/11/2020 --
ResourceRel.Izm := SprSuppliesKind.Data.Name;
// Added by Tolik
if Length(Cabletypes) > 0 then
begin
CableTypeFound := false;
for j := 0 to Length(CableTypes) - 1 do
begin
// if ResourceRel.GuidNB = CableTypes[j].GuidNB then
if ResourceCompon.GUIDSuppliesKind = CableTypes[j].TypeName then
// Tolik 02/11/2020 --
if ResourceRel.Cypher = CableTypes[j].CableCypher then
if not cbNone.Checked then
begin
if cbCanRoundValue.Checked then
ResourceRel.Kolvo := Length(CableTypes[j].Reels)
else
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
CableTypeFound := true;
end;
end;
if not CabletypeFound then
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
end;
//
// ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
if not cbNone.Checked then
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvo
else
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
end;
//ResourceRel.CalcCost;
end
else
begin
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
ResourceRel.Izm := GetNameUOM(TF_Main(GForm).FUOM, true);
if TF_Main(GForm).FUOM <> umMetr then
begin
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, TF_Main(GForm).FUOM);
ResourceRel.Price := FloatInUOM(ResourceRel.Price, TF_Main(GForm).FUOM, umMetr);
//ResourceRel.CalcCost;
end;
end;
end;
end;
//*** Учитывать флаг округления в большую сторону
if ACanRoundValue then
begin
ResourceRel.Kolvo := RoundUp(ResourceRel.Kolvo);
//ResourceRel.CalcCost;
end;
ResourceRel.CalcCost;
end;
MemTable_RResources.Active := false;
MemTable_RResources.Active := true;
//TotalCost := 0;
LoadResourcesToMT(NormResources.Resources);
//LoadComponentsToMT(GroupComponentsList);
//LoadResourcesToMT(GroupList);
//LoadResourcesToMT(GroupListFromNorm);
//Label_TotalCost.Caption := FloatToStr(RoundX(TotalCost, 2)) +' '+GCurrency.Name_Brief;
//MemTable_RResources.SortOn(fnProducerName+';'+fnIzm, []);
SortMemTableByParams(MemTable_RResources, AParams, nil);
finally
EndProgress;
if NormResources <> nil then
FreeAndNil(NormResources);
FreeCableTypes(CableTypes);
INeedNormsRecources := False;
end;
GFormMode := fmRResources;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
end;
CurrTick := GetTickCount - OldTick;
CurrTick := GetTickCount - OldTick;
(*
if Assigned(AFolder) then
begin
BeginProgress(pcPreparingReport);
try
try
FCatalog := AFolder;
GroupList := TList.Create;
GroupListFromNorm := TList.Create;
GroupComponentsList := TSCSComponents.Create(true);
LookedComponents := TSCSComponents.Create(false);
LookedResources := TSCSResources.Create(false);
//Folder := TSCSCatalog.Create(GForm);
//Folder.LoadCatalogByID(AFolder.ID, false, false);
//LoadFolderResources(Folder);
for i := 0 to AFolder.ChildCatalogReferences.Count - 1 do
begin
SCSCatalog := AFolder.ChildCatalogReferences[i];
if Assigned(SCSCatalog) then
begin
if SCSCatalog.IsLine = biTrue then
SCSCatalog.LoadLength;
SCSCatalog.NormsResources.CalcResourcesCost(true, true);
if SCSCatalog.ItemType in [itSCSConnector, itSCSLine] then
AddNormResourcesToGroup(SCSCatalog.NormsResources);
end;
end;
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
SCSComponent := AFolder.ComponentReferences[i];
if Assigned(SCSComponent) then
begin
if SCSComponent.IsLine = biTrue then
begin
SCSComponent.RefreshWholeLengthIfNecessary;
SCSComponent.Length := SCSComponent.GetPropertyValueAsFloat(pnLength);
end;
SCSComponent.NormsResources.CalcResourcesCost(true, true);
AddComponentToGroup(SCSComponent);
AddNormResourcesToGroup(SCSComponent.NormsResources);
LookedComponents.Add(SCSComponent);
if SCSComponent.IsLine = biTrue then
begin
SCSComponent.LoadWholeComponent(false);
for j := 0 to SCSComponent.WholeComponent.Count - 1 do
begin
PartComponent := AFolder.GetComponentFromReferences(Integer(SCSComponent.WholeComponent[j]^));
if Assigned(PartComponent) then
if PartComponent <> SCSComponent then
LookedComponents.Add(PartComponent);
end;
{for j := 0 to SCSComponent.WholeComponent.Count - 1 do
begin
PartComponent := AFolder.GetComponentFromReferences(Integer(SCSComponent.WholeComponent[j]^));
if Assigned(PartComponent) then
if PartComponent <> SCSComponent then
if PartComponent.NormsResources.Resources.Count > 0 then
LookedResources.Add(PartComponent.NormsResources.Resources[0]);
end; }
end;
end;
end;
MemTable_RResources.Active := false;
MemTable_RResources.Active := true;
TotalCost := 0;
LoadComponentsToMT(GroupComponentsList);
LoadResourcesToMT(GroupList);
LoadResourcesToMT(GroupListFromNorm);
//Label_TotalCost.Caption := FloatToStr(RoundX(TotalCost, 2)) +' '+GCurrency.Name_Brief;
finally
EndProgress;
//Folder.Free;
//*** Удалить Группы
LookedResources.Free;
for i := 0 to GroupList.Count - 1 do
begin
GroupResource := GroupList.Items[i];
GroupResource.Free;
end;
GroupList.Free;
for i := 0 to GroupListFromNorm.Count - 1 do
begin
GroupResource := GroupListFromNorm.Items[i];
GroupResource.Free;
end;
GroupListFromNorm.Free;
GroupComponentsList.Free;
LookedComponents.Free;
//Freelist(ListWithLookedWholeID);
end;
GFormMode := fmRResources;
Act_ShowReport.Execute;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
end; *)
end;
(*
procedure TF_ResourceReport.ShowFolderResourceReport(AFolder: TSCSCatalog);
var Folder: TSCSCatalog;
GroupList: TList;
GroupListFromNorm: TList;
GroupResource: TSCSResourceRel;
ListWithLookedWholeID: TList;
i: Integer;
TotalCost: Double;
procedure AddResourceToGroup(AResourceRel: TSCSResourceRel; AGroupList: Tlist);
const CmpDelta = 0.001;
var GrResource: TSCSResourceRel;
ExistsGroup: Boolean;
i: integer;
begin
if (AResourceRel = nil) or (AGroupList = nil) then
Exit; //// EXIT ////
if AResourceRel.IsOn = biFalse then
Exit; //// EXIT ////
if AResourceRel.Cost = 0 then
Exit; //// EXIT ////
//*** Найти нужную группу
ExistsGroup := false;
GrResource := nil;
for i := 0 to AGroupList.Count - 1 do
begin
GrResource := AGroupList[i];
if (GrResource.IDNB = AResourceRel.IDNB) and
(GrResource.TableKindNB = AResourceRel.TableKindNB) and
(Abs(GrResource.Price - AResourceRel.Price) < CmpDelta) then
begin
ExistsGroup := true;
GrResource.Kolvo := GrResource.Kolvo + AResourceRel.Kolvo;
GrResource.Cost := GrResource.Cost + AResourceRel.Cost;
end;
end;
if Not ExistsGroup then
begin
GrResource := TSCSResourceRel.Create(GForm, ntProj);
GrResource.Assign(AResourceRel);
AGroupList.Add(GrResource);
end;
end;
procedure AddNormResourcesToGroup(ANormsResources: TSCSNormsResources);
var i, j: Integer;
ResourceRel: TSCSResourceRel;
SCSNorm: TSCSNorm;
begin
if ANormsResources = nil then
Exit; ///// EXIT /////
for i := 0 to ANormsResources.Resources.Count - 1 do
begin
ResourceRel := ANormsResources.Resources[i];
AddResourceToGroup(ResourceRel, GroupList);
end;
for i := 0 to ANormsResources.Norms.Count - 1 do
begin
SCSNorm := ANormsResources.Norms[i];
for j := 0 to SCSNorm.Resources.Count - 1 do
begin
ResourceRel := SCSNorm.Resources[j];
AddResourceToGroup(ResourceRel, GroupListFromNorm);
end;
end;
end;
procedure LoadFolderResources(AParentFolder: TSCSCatalog); //Resources
var SCSCatalog: TSCSCatalog;
SCSComponent: TSCSComponent;
i: Integer;
ptrID: ^Integer;
begin
AParentFolder.LoadLength;
AParentFolder.NormsResources.CalcResourcesCost(true, true);
//*** Загрузка ресурсов и норм папки в группы
AddNormResourcesToGroup(AParentFolder.NormsResources);
AParentFolder.LoadAllComponents(AParentFolder.ID, false);
for i := 0 to AParentFolder.SCSComponents.Count - 1 do
begin
SCSComponent := AParentFolder.SCSComponents[i];
if (( SCSComponent.IsLine = biTrue) and
( CheckNoIDinList(SCSComponent.Whole_ID, ListWithLookedWholeID) )) or
(SCSComponent.IsLine = biFalse) then
begin
if SCSComponent.IsLine = biTrue then
begin
New(ptrID);
ptrID^ := SCSComponent.Whole_ID;
ListWithLookedWholeID.Add(ptrID);
SCSComponent.LoadWholeComponent(false);
SCSComponent.LoadWholeLength(true);
end;
SCSComponent.NormsResources.CalcResourcesCost(true, true);
//*** Загрузка ресурсов и норм компоненты в группы
AddNormResourcesToGroup(SCSComponent.NormsResources);
end;
end;
//AParentFolder.ClearListWithObjects(AParentFolder.SCSComponents);
AParentFolder.SCSComponents.Clear;
//*** Пройти по внутренным папкам
AParentFolder.LoadChildCatalogs(false);
for i := 0 to AParentFolder.ChildCatalogs.Count - 1 do
begin
SCSCatalog := AParentFolder.ChildCatalogs[i];
LoadFolderResources(SCSCatalog);
end;
//AParentFolder.ClearListWithObjects(AParentFolder.ChildCatalogs);
AParentFolder.ChildCatalogs.Clear;
end;
procedure LoadResourcesToMT(AResources: TList);
var i: Integer;
ResourceRel: TSCSResourceRel;
begin
for i := 0 to AResources.Count - 1 do
begin
ResourceRel := AResources[i];
MemTable_RResources.Append;
MemTable_RResources.FieldByName('ID').AsInteger := ResourceRel.ID;
MemTable_RResources.FieldByName('NAME').AsString := ResourceRel.Name;
MemTable_RResources.FieldByName('Kolvo').AsFloat := RoundX(ResourceRel.Kolvo, 3);
MemTable_RResources.FieldByName('Price').AsFloat := RoundX(ResourceRel.Price, 3);
MemTable_RResources.FieldByName('Cost').AsFloat := RoundX(ResourceRel.Cost, 3);
MemTable_RResources.Post;
TotalCost := TotalCost + ResourceRel.Cost;
end;
end;
begin
try
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
try
Screen.Cursor := crHourGlass;
try
GroupList := TList.Create;
GroupListFromNorm := TList.Create;
ListWithLookedWholeID := TList.Create;
Folder := TSCSCatalog.Create(GForm);
Folder.LoadCatalogByID(AFolder.ID, false, false);
LoadFolderResources(Folder);
MemTable_RResources.Active := false;
MemTable_RResources.Active := true;
TotalCost := 0;
LoadResourcesToMT(GroupList);
LoadResourcesToMT(GroupListFromNorm);
Label_TotalCost.Caption := FloatToStr(RoundX(TotalCost, 3)) +' '+GCurrency.Name_Brief;
GFormMode := fmRResources;
finally
Screen.Cursor := crDefault;
end;
Act_ShowReport.Execute;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
finally
Folder.Free;
//*** Удалить Группы
for i := 0 to GroupList.Count - 1 do
begin
GroupResource := GroupList.Items[i];
GroupResource.Free;
end;
GroupList.Free;
for i := 0 to GroupListFromNorm.Count - 1 do
begin
GroupResource := GroupListFromNorm.Items[i];
GroupResource.Free;
end;
GroupListFromNorm.Free;
Freelist(ListWithLookedWholeID);
end;
end;
*)
(*
procedure TF_ResourceReport.ShowFolderResourceReport(AFolder: TSCSCatalog);
var FolderIDComponList: TList;
ListWithBusyCompons: TList;
i, j: Integer;
Group: PSCSCatalog;
GroupList: TList;
GroupComponent: PSCSComponent;
GroupLength: Double;
GroupCost: Double;
TotalCost: Double;
strLength: String;
LengthFromStr: Double;
StrToShow: String;
procedure FillFolderComponList(AIDRoot: Integer);
var ChildFolders: TList;
i: Integer;
CurrCatalog: TSCSCatalog;
ptrSCSComponent: PSCSComponent;
ptrNewID: ^Integer;
begin
CurrCatalog := TSCSCatalog.Create(GForm);
CurrCatalog.LoadAllComponents(AIDRoot, false);
for i := 0 to CurrCatalog.SCSComponents.Count - 1 do
begin
ptrSCSComponent := CurrCatalog.SCSComponents.Items[i];
New(ptrNewID);
ptrNewID^ := ptrSCSComponent.ID;
FolderIDComponList.Add(ptrNewID);
end;
CurrCatalog.Free;
ChildFolders := TList.Create;
with TF_Main(GForm).DM do
begin
SetSQLToQuery(scsQSelect, ' select id from katalog where parent_id = '''+IntToStr(AIDRoot)+''' ');
IntFieldToList(ChildFolders, scsQSelect, 'ID');
for i := 0 to ChildFolders.Count - 1 do
FillFolderComponList(Integer(ChildFolders.Items[i]^));
end;
FreeList(ChildFolders);
end;
procedure AddToGroups(AIDComponent: Integer);
var ptrNewSCSComponent: PSCSComponent;
Compon: TSCSComponent;
i: Integer;
ptrGroup: PSCSCatalog;
ptrGroupForReceiveCompon: PSCSCatalog;
WholeLineCompon: TList; //*** Цельный линейный компонент
Length: Double;
strLength: String;
LengthFromStr: Double;
ptrIDBusy: ^Integer;
begin
if CheckNoIDinList(AIDComponent, ListWithBusyCompons) then
begin
New(ptrNewSCSComponent);
ptrNewSCSComponent^ := TSCSComponent.Create(GForm);
ptrNewSCSComponent.LoadComponentByID(AIDComponent, false);
case ptrNewSCSComponent.IsLine of
biTrue:
begin
ptrNewSCSComponent.LoadWholeComponent(true);
ptrNewSCSComponent.LoadWholeLength(true);
//*** Занести в список занятых
for i := 0 to ptrNewSCSComponent.WholeComponent.Count - 1 do
begin
New(ptrIDBusy);
ptrIDBusy^ := Integer(ptrNewSCSComponent.WholeComponent[i]^);
ListWithBusyCompons.Add(ptrIDBusy);
end;
end;
end;
ptrNewSCSComponent.LoadNorms(false);
ptrNewSCSComponent.CalcResourcesCost(true, true);
if ptrNewSCSComponent.ResourcesCost = 0 then
begin
ptrNewSCSComponent.Free;
FreeMem(ptrNewSCSComponent);
Exit; //// EXIT ////
end;
ptrGroupForReceiveCompon := nil;
//*** Найти группу для компоненты
for i := 0 to GroupList.Count - 1 do
begin
ptrGroup := GroupList.Items[i];
if ptrGroup.SCSComponents.Count > 0 then
if TSCSComponent(ptrGroup.SCSComponents.Items[0]^).IDNormBase = ptrNewSCSComponent.IDNormBase then
begin
ptrGroupForReceiveCompon := ptrGroup;
Break;
end;
end;
//*** Создать новую группу
if ptrGroupForReceiveCompon = nil then
begin
New(ptrGroup);
ptrGroup^ := TSCSCatalog.Create(GForm);
GroupList.Add(ptrGroup);
ptrGroupForReceiveCompon := ptrGroup;
end;
//*** Добавить компонент в группу
if ptrGroupForReceiveCompon <> nil then
begin
ptrNewSCSComponent.LoadNorms(false);
ptrNewSCSComponent.CalcResourcesCost(true, true);
if ptrNewSCSComponent.IsLine = biFalse then
begin
New(ptrIDBusy);
ptrIDBusy^ := ptrNewSCSComponent.ID;
ListWithBusyCompons.Add(ptrIDBusy);
end;
//*** Добавление в группу
if ptrNewSCSComponent.ResourcesCost > 0 then
ptrGroupForReceiveCompon.SCSComponents.Add(ptrNewSCSComponent)
else
ptrNewSCSComponent.Free;
end;
end;
end;
begin
try
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
try
FolderIDComponList := Tlist.Create;
ListWithBusyCompons := TList.Create;
GroupList := TList.Create;
//*** Найти все кмопоненты папки
//FillFolderComponList(AFolder.ID);
FolderIDComponList := GetFolderComponList(GForm, AFolder.ID, [itSCSLine, itSCSConnector]);
if FolderIDComponList = nil then
Exit; //// EXIT /////
//*** Разбить компоненты по группам относительно IDNormBase
for i := 0 to FolderIDComponList.Count - 1 do
AddToGroups(Integer(FolderIDComponList.Items[i]^));
//*** Формирование отчета
Caption := 'Ведомость ресурсов для "'+AFolder.Name+'" ';
TotalCost := 0;
MemTable_RResources.Active := false;
MemTable_RResources.Active := true;
for i := 0 to GroupList.Count - 1 do
begin
Group := GroupList.Items[i];
GroupLength := 0;
GroupCost := 0;
if Group.SCSComponents.Count > 0 then
begin
StrToShow := '';
for j := 0 to Group.SCSComponents.Count - 1 do
begin
GroupComponent := Group.SCSComponents.Items[j];
GroupCost := GroupCost + GroupComponent.ResourcesCost;
if GroupComponent.IsLine = biTrue then
begin
{strLength := GroupComponent.GetPropertyValueBySysName('LENGTH');
if strLength <> '' then
begin
LengthFromStr := StrToFloat_My(strLength);
GroupLength := GroupLength + LengthFromStr;
end;}
GroupLength := GroupLength + GroupComponent.Length;
end;
end;
GroupComponent := Group.SCSComponents.Items[0];
MemTable_RResources.Append;
MemTable_RResources.FieldByName('ID').AsInteger := GroupComponent.ID;
MemTable_RResources.FieldByName('NAME').AsString := GroupComponent.Name;
{StrToShow := DupStr(#9, 1);
StrToShow := StrToShow + GroupComponent.Name;}
case GroupComponent.IsLine of
biTrue:
begin
MemTable_RResources.FieldByName('Kolvo').AsFloat := RoundX(GroupLength, 3);
MemTable_RResources.FieldByName('Price').AsFloat := RoundX(GroupComponent.ResourcesCostPerOneNorm, 3);
//StrToShow := StrToShow + DupStr(#9, 2) + 'цена '+FloatToStr(RoundX(GroupComponent.ResourcesCostPerOneNorm, 3)) + ' ' +GCurrency.Name_Brief;
//StrToShow := StrToShow + DupStr(#9, 1) + 'длина '+FloatToStr(GroupLength)+ ' м';
end;
biFalse:
begin
MemTable_RResources.FieldByName('Kolvo').AsFloat := RoundX(Group.SCSComponents.Count, 3);
MemTable_RResources.FieldByName('Price').AsFloat := RoundX(GroupComponent.ResourcesCost, 3);
//StrToShow := StrToShow + DupStr(#9, 2) + 'цена '+FloatToStr(RoundX(GroupComponent.ResourcesCost, 3)) + ' ' +GCurrency.Name_Brief;
//StrToShow := StrToShow + DupStr(#9, 1) + 'количество '+FloatToStr(Group.SCSComponents.Count);
end;
end;
MemTable_RResources.FieldByName('Cost').AsFloat := RoundX(GroupCost, 3);
MemTable_RResources.Post;
TotalCost := TotalCost + GroupCost;
//StrToShow := StrToShow + DupStr(#9, 1) + 'стоимость '+FloatToStr(RoundX(GroupCost, 3)) + ' ' +GCurrency.Name_Brief;
//RichEdit_Report.Lines.Add(StrToShow);
//RichEdit_Report.Lines.Add('');
end;
end;
Label_TotalCost.Caption := FloatToStr(RoundX(TotalCost, 3)) +' '+GCurrency.Name_Brief;
//RichEdit_Report.Lines.Add('Общая стоимость '+FloatToStr(RoundX(TotalCost, 3)) +' '+GCurrency.Name_Brief);
GFormMode := fmRResources;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
finally
//*** Удалить Группы
for i := 0 to GroupList.Count - 1 do
begin
Group := GroupList.Items[i];
Group.Free;
end;
FreeList(GroupList);
FreeList(ListWithBusyCompons);
FreeList(FolderIDComponList);
end;
end; *)
procedure TF_ResourceReport.ShowFolderNormReport(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents: Boolean);
var i, j, k: Integer;
//LookedInterfaces: TList;
InterfaceNormList: TList;
CurrInterfaceNormList: TList;
TempList: TList;
SCSComponent: TSCSComponent;
SCSCatalog: TSCSCatalog;
TraceLength: Double;
Interfac: TSCSInterface;
ptrJoinedInterf: TSCSInterface;
ptrComplectInterf: TSCSInterface;
ptrResultInterface: TSCSInterface;
//IOfIRel: TSCSIOfIRel;
ptrInterfaceNormInfo: PInterfaceNormInfo;
ptrInterfaceNormInfoI: PInterfaceNormInfo;
ptrInterfaceNormInfoJ: PInterfaceNormInfo;
GroupedNorms: TSCSNormsResources;
GroupNorm: TSCSNorm;
NormTotalLaborTime: Integer;
begin
try
FTotalLaborTime := 0;
if Assigned(AFolder) then
begin
//LookedInterfaces := TList.Create;
//InterfaceNormList := TList.Create;
//GroupedNorms := TSCSNorms.Create(true);
FCatalog := AFolder;
BeginProgress(pcPreparingReport);
try
//Tolik
// по типам сетей
INeedNormsRecources := True;
//
//GroupedNorms := AFolder.GetAllNormsResources(nrAll, false, ACanHaveActiveComponents, false, true);
//24.09.2010 GroupedNorms := AFolder.GetAllNormsResources([nrNorms], false, ACanHaveActiveComponents, false, true);
GroupedNorms := AFolder.GetAllNormsResources([nrNorms], false, ACanHaveActiveComponents,
false, true, false, true, false, True); ////24.09.2010 aAllowNormPriceForGroup = True
//*** Засыпать нормы в MemTable
MemTable_RNorms.Active := false;
MemTable_RNorms.Active := true;
for i := 0 to GroupedNorms.Norms.Count - 1 do
begin
GroupNorm := GroupedNorms.Norms[i];
MemTable_RNorms.Append;
MemTable_RNorms.FieldByName(fnCypher).AsString := GroupNorm.Cypher;
MemTable_RNorms.FieldByName(fnName).AsString := GroupNorm.Name;
//Tolik 27/02/2022 --
//MemTable_RNorms.FieldByName(fnExpense).AsFloat := RoundX(GroupNorm.Kolvo, PrecisionNormKolvo);
MemTable_RNorms.FieldByName(fnExpense).AsFloat := RoundX(GroupNorm.Kolvo, 2);
//
MemTable_RNorms.FieldByName(fnIzm).AsString := GroupNorm.Izm_;
//24.09.2010
//Tolik 27/02/2022 --
//MemTable_RNorms.FieldByName(fnPrice).AsFloat := RoundX(GroupNorm.Price, PrecisionNormKolvo);
//MemTable_RNorms.FieldByName(fnTotalCost).AsFloat := RoundX(GroupNorm.TotalCost, PrecisionNormKolvo);
MemTable_RNorms.FieldByName(fnPrice).AsFloat := RoundX(GroupNorm.Price, 2);
MemTable_RNorms.FieldByName(fnTotalCost).AsFloat := RoundX(GroupNorm.TotalCost, 2);
//
//19.11.2013
NormTotalLaborTime := Round(GroupNorm.LaborTime*GroupNorm.Kolvo);
MemTable_RNorms.FieldByName(fnLaborTime).AsString := GetDisplayTextToNORMLaborTime(IntToStr(GroupNorm.LaborTime));
//Tolik 27/02/2022 --
//MemTable_RNorms.FieldByName(fnPricePerTime).AsFloat := RoundX(GroupNorm.PricePerTime, PrecisionNormKolvo);
MemTable_RNorms.FieldByName(fnPricePerTime).AsFloat := RoundX(GroupNorm.PricePerTime, 2);
//
MemTable_RNorms.FieldByName(fnTotalLaborTime).AsString := GetDisplayTextToNORMLaborTime(IntToStr(NormTotalLaborTime));
MemTable_RNorms.Post;
FTotalLaborTime := FTotalLaborTime + NormTotalLaborTime;
end;
//MemTable_RNorms.SortOn(fnCypher, []);
SortMemTableByParams(MemTable_RNorms, AParams, nil);
finally
EndProgress;
FreeAndNil(GroupedNorms);
//Tolik
INeedNormsRecources := False;
//FreeList(InterfaceNormList);
//FreeAndNil(LookedInterfaces);
end;
GFormMode := fmRNorms;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
end;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderNormReport: '+E.Message);
end;
end;
// отчет ведомость кабелей
procedure TF_ResourceReport.ShowFolderCableReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
AFormMode: TResourceReportFormMode; ACanHaveActiveComponents, ACanHaveDismountAccount: Boolean;AReportItemParamValues : TReportItemParams);
//const CmpDelta = 0.01;
var //FolderIDComponList: TList;
List: TSCSList;
ListWithLookedCompons: TList;
CurrIDCompon: Integer;
i, j: Integer;
Component: TSCSComponent;
FirstObjName: String;
FirstComponName: String;
LastObjName: String;
LastComponName: String;
ptrID: ^Integer;
WholeComponent: Tlist; //*** Цельный кабель
TextLine: String;
CableCanalCost: Double;
ComponSignType: Integer;
ComponLength: Double;
ComponMaxLength: Double;
ComponLengthReserv: Double;
ComponPrice: Double;
MemTableOprions: TkbmMemTableCompareOptions;
CurrMTGrp: TKbmMemTable;
CurrMT: TKbmMemTable;
CableTypes : TCableTypeArray;
CableIDsList : TIntList;
//Tolik
currCad : TF_CAD;
Figure : TFigure;
currCatalog : TSCSCatalog;
{function GetNameAndIndexByTCatalog(ACatalog: TCatalog): String;
begin
Result := '';
Result := TF_Main(GForm).GetNameAndIndex(ACatalog.Name, ACatalog.ItemType, ACatalog.IndexPointObj,
ACatalog.IndexConnector,
ACatalog.IndexLine);
end;}
function GetObjNameByIDCompon(AIDComponent: Integer; var AComponName: String): String;
var
SCSComponent: TSCSComponent;
SCSObject: TSCSCatalog;
SCSList: TSCSList;
begin
Result := '';
AComponName := '';
SCSComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(AIDComponent);
if Assigned(SCSComponent) then
if CheckCanLookComponInReportCable(SCSComponent, ACanHaveDismountAccount) then
begin
AComponName := SCSComponent.NameMark;
SCSObject := SCSComponent.GetFirstParentCatalog;
if Assigned(SCSObject) then
begin
SCSList := SCSObject.GetListOwner;
if SCSList <> nil then
begin
Result := SCSList.GetNameForVisible + '/' + SCSObject.GetNameForVisible;
end;
end;
end;
end;
procedure DefineBeginEnd(AComponent: TSCSComponent; var AFirstConObj, AFirstConCompon: string;
var ALastConObj, ALastConCompon: string);
var ConnectedObjFirst: TSCSCatalog;
ConnectedObjLast: TSCSCatalog;
CatalogFirst: TCatalog;
CatalogLast: TCatalog;
Buf: Integer;
WasReplace: Boolean;
i, j, k, FICount, LICount: integer;
s: string;
currCompon, connCompon, FirstCompon, LastCompon : TSCSComponent;
FirstCatalog, LastCatalog : TSCSCatalog;
AllConnectedCompons : TSCSComponents;
IntCounts : TIntList;
tmpstr: string;
begin
try
AFirstConObj := cResourceReport_Msg38;
AFirstConCompon := '';
ALastConObj := AFirstConObj;
ALastConCompon := '';
FICount := 0;
LICount := 0;
FirstCompon := nil;
LastCompon := nil;
IntCounts := TIntList.Create;
AllConnectedCompons := TSCSComponents.Create(false);
if (AComponent.FirstIDConnectedConnCompon <> 0) and (AComponent.FirstIDCompon <> 0) then
AFirstConObj := GetObjNameByIDCompon(AComponent.FirstIDConnectedConnCompon, AFirstConCompon); //TF_Main(GForm).DM.GetNameObjectConnectedToLineCompon(AComponent.FirstIDConnectedConnCompon, AComponent.FirstIDCompon);
if (AComponent.LastIDConnectedConnCompon <> 0) and (AComponent.LastIDCompon <> 0) then
ALastConObj := GetObjNameByIDCompon(AComponent.LastIDConnectedConnCompon, ALastConCompon); //TF_Main(GForm).DM.GetNameObjectConnectedToLineCompon(AComponent.LastIDConnectedConnCompon, AComponent.LastIDCompon);
// added by Tolik
if ((AComponent.IDNetType in [3,{4,}5,7])) then
begin
if (AComponent.FirstIDConnectedConnCompon <> 0) and (AComponent.LastIDConnectedConnCompon <> 0) then
begin
//FirstCompon := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(AComponent.FirstIDConnectedConnCompon);
// все компоненты на кабеле
for i := 0 to AComponent.WholeComponent.Count -1 do
begin
currCompon := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(AComponent.WholeComponent[i]);
// берем все подключенный точечные
// участок Кабеля
///////////currCompon.LoadConections;
for j := 0 to currCompon.JoinedComponents.Count - 1 do
begin
if currCompon.JoinedComponents[j].IsLine = biFalse then
begin
connCompon := currCompon.JoinedComponents[j];
//while not connCompon.IsTop do
// connCompon := connCompon.GetParentComponent;
AllConnectedCompons.Add(connCompon);
end;
end;
end;
// считаем количество интерфейсов на каждом подключенном точечном компоненте
for i := 0 to AllConnectedCompons.Count -1 do
begin
currCompon := AllConnectedCompons[i];
While not currCompon.IsTop do
currCompon := currCompon.GetParentComponent;
FICount := 0;
for j := 0 to currCompon.Interfaces.Count - 1 do
begin
if currCompon.Interfaces[j].TypeI = itFunctional then
begin
// если интерфейс один
if currCompon.Interfaces[j].Kolvo <= 0 then
inc(FICount)
else
// если интерфейсов несколько
FICount := FICount + currCompon.Interfaces[j].Kolvo;
end;
end;
for j := 0 to currCompon.ChildReferences.Count - 1 do
begin
for k := 0 to currCompon.ChildReferences[j].Interfaces.Count - 1 do
begin
if currCompon.ChildReferences[j].Interfaces[k].TypeI = itFunctional then
begin
if currCompon.ChildReferences[j].Interfaces[k].Kolvo <= 0 then
inc(FICount)
else
FICount := FICount + currCompon.ChildReferences[j].Interfaces[k].Kolvo;
end;
end;
end;
IntCounts.Add(FICount);
end;
// Ищем компонент с наибольшим количеством интерфейсов
LICount := 0;
FICount := IntCounts[0];
for i := 1 to AllConnectedCompons.Count - 1 do
begin
if FICount < IntCounts[i] then
begin
FICount := IntCounts[i];
LICount := i;
end;
end;
// первый подключенный
FirstCompon := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(AllConnectedCompons[LICount].ID);
AFirstConObj := GetObjNameByIDCompon(FirstCompon.id, AFirstConCompon);
// второй (или список, если их несколько)
if AllConnectedCompons.Count = 2 then
begin
for i := 0 to AllConnectedCompons.Count - 1 do
if AllConnectedCompons[i] <> FirstCompon then
LastCompon := AllConnectedCompons[i];
ALastConObj := GetObjNameByIDCompon(LastCompon.id, ALastConCompon);
if ALastConCompon <> '' then
ALastConObj := ALastConObj + '/' + ALastConCompon;
end
else
begin
ALastConObj := '';
for i := 0 to AllConnectedCompons.Count -1 do
begin
currCompon := AllConnectedCompons[i];
if currCompon <> FirstCompon then
begin
tmpstr := GetObjNameByIDCompon(currCompon.id, ALastConCompon);
if ALastConCompon <> '' then
tmpstr := tmpstr + '/' + ALastConCompon;
if ALastConObj = '' then
ALastConObj := tmpstr
else
ALastConObj := ALastConObj + #13#10 + tmpstr;
end;
end;
end;
end;
end;
//*******
{CatalogFirst.ID := 0;
CatalogFirst.Name := '';
CatalogLast.ID := 0;
CatalogLast.Name := '';
WasReplace := false;
if AComponent.FirstIDConnectedConnCompon <> -1 then
CatalogFirst := TF_Main(GForm).DM.GetCatalogByCompon(AComponent.FirstIDConnectedConnCompon);
if AComponent.LastIDConnectedConnCompon <> -1 then
CatalogLast := TF_Main(GForm).DM.GetCatalogByCompon(AComponent.LastIDConnectedConnCompon);
ConnectedObjFirst := TSCSCatalog.Create(GForm);
ConnectedObjLast := TSCSCatalog.Create(GForm);
if CatalogFirst.ID <> 0 then
ConnectedObjFirst.LoadAllComponents(CatalogFirst.ID, false);
if CatalogLast.ID <> 0 then
ConnectedObjLast.LoadAllComponents(CatalogLast.ID, false);
if CatalogFirst.Name <> '' then
AFirstConObj := GetNameAndIndexByTCatalog(CatalogFirst);
if CatalogLast.Name <> '' then
ALastConObj := GetNameAndIndexByTCatalog(CatalogLast);
}
{
if ConnectedObjLast.SCSComponents.Count < ConnectedObjFirst.SCSComponents.Count then
begin
Buf := AComponent.FirstIDConnectedConnCompon;
AComponent.FirstIDConnectedConnCompon := AComponent.LastIDConnectedConnCompon;
AComponent.LastIDConnectedConnCompon := Buf;
WasReplace := true;
end;
case WasReplace of
True:
begin
if CatalogLast.Name <> '' then
AFirstConObj := GetNameAndIndexByTCatalog(CatalogLast);
if CatalogFirst.Name <> '' then
ALastConObj := GetNameAndIndexByTCatalog(CatalogFirst);
end;
False:
begin
if CatalogFirst.Name <> '' then
AFirstConObj := GetNameAndIndexByTCatalog(CatalogFirst);
if CatalogLast.Name <> '' then
ALastConObj := GetNameAndIndexByTCatalog(CatalogLast);
end;
end; }
finally
//ConnectedObjFirst.Free;
//ConnectedObjLast.Free;
IntCounts.Free;
FreeAndNil(AllConnectedCompons);
end;
end;
procedure AddTextToLine(AText: String);
const PartLength = 17;
var TextPart: String[PartLength];
TextLength: Integer;
i: Integer;
begin
TextPart := AText;
TextLength := Length(TextPart);
if TextLength < PartLength then
begin
SetLength(TextPart, PartLength);
for i := TextLength + 1 to PartLength do
TextPart[i] := ' ';
end;
TextPart[PartLength] := ' ';
TextLine := TextLine + TextPart;
end;
begin
SetLength(CableTypes,0);
CableIdsList := TintList.Create;
DefinePrecisions; // Tolik 14/11/2020 --
try
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FCatalog := AFolder;
//FolderIDComponList := Tlist.Create;
ListWithLookedCompons := TList.Create;
WholeComponent := nil;
//Component := TSCSComponent.Create(GForm);
//FolderIDComponList := GetFolderComponList(GForm, AFolder, [itSCSLine]);
//if FolderIDComponList = nil then
// Exit; ///// EXIT /////
{RichEdit_Report.Lines.Clear;
RichEdit_Report.DefAttributes.Size := 10;
RichEdit_Report.DefAttributes.Name := 'Courier New';
RichEdit_Report.Lines.Add(DupStr('-', 100));
RichEdit_Report.Lines.Add('Компонент Начало соед. Конец соед. Длина Цена Стоимость ');
RichEdit_Report.Lines.Add(DupStr('-', 100)); }
{CurrMT.MasterSource := nil;
CurrMT.Active := false;
CurrMT.Active := True;
CurrMTGrp.Active := false;
CurrMTGrp.Active := True;
if AFormMode = fmRCableCanal then
begin
CurrMT.MasterSource := DataSource_MT_RCableGroup;
CurrMT.MasterFields := fnID;
CurrMT.DetailFields := fnIDGroup;
end;
}
CurrMTGrp := nil;
CurrMT := nil;
if AFormMode = fmRCable then
begin
CurrMTGrp := MemTable_RCableGroup;
CurrMT := MemTable_RCable;
end
else
if AFormMode = fmRCableCanal then
begin
CurrMTGrp := FmtCableChannelGrp;
CurrMT := FmtCableChannel;
end;
CurrMT.MasterSource := nil;
CurrMT.Active := false;
//CurrMT.Active := True;
CurrMTGrp.Active := false;
//CurrMTGrp.Active := True;
if AFormMode = fmRCableCanal then
begin
CurrMT.MasterSource := FdsrcCableChannelGrp; //DataSource_MT_RCableGroup;
CurrMT.MasterFields := fnID;
CurrMT.DetailFields := fnIDGroup;
end;
CurrMTGrp.Active := True;
CurrMT.Active := True;
BeginProgress(pcPreparingReport);
try
{FExceedLength := 0;
//if AFormMode = fmRCableExceedLength then
begin
List := TF_Main(GForm).GSCSBase.CurrProject.GetListBySCSID(AFolder.ListID);
if Assigned(List) then
FExceedLength := List.Setting.TwistedPairMaxLength;
end; }
with TF_Main(GForm).DM do
//for i := 0 to FolderIDComponList.Count - 1 do
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
Component := AFolder.ComponentReferences[i];
//проверка на тип сети
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(Component.GUIDNetType) <> -1)) then
begin
//CurrIDCompon := Integer(FolderIDComponList.Items[i]^);
if Assigned(Component) and CheckNoIDinList(Component.ID, ListWithLookedCompons) then
begin
ComponSignType := Component.GetPropertyValueAsInteger(pnSignType);
//Component.LoadComponentByID(CurrIDCompon, false);
if ((Component.IsLine = biTrue) and ((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) and
( not ( Component.IDNetType in [3,{4,}5,7])) and CheckCanLookComponInReportCable(Component, ACanHaveDismountAccount)) then
begin
Component.RefreshWholeLengthIfNecessary;
case AFormMode of
fmRCable, fmRCableExceedLength:
// Tolik 14/11/2020 -- CheckSysNameIsCable - не учитывает Wire
//if CheckSysNameIsCable(Component.ComponentType.SysName) then
if isCableComponent(Component) then
//
begin
// Added by Tolik
if not cbNone.Checked then
CableTypesAdd(Component, CableTypes, CableIdsList,Component.ID, Self);
//*** Есть ли функциональные интерфейсы
//if HaveComponFunctionalInterfaces(scsQSelect, CurrIDCompon) then
if Component.HaveInterfaceByType(itFunctional) then
begin
FExceedLength := 0;
List := Component.GetListOwner;
if Assigned(List) then
FExceedLength := List.Setting.TwistedPairMaxLength;
Component.LoadWholeComponent(false);
Component.LoadWholeLength;
//Component.LoadInterfaces;
//if (AFormMode = fmRCable) or
// ((AFormMode = fmRCableExceedLength) and (Component.HaveInterfaceByIDInterface(iidTwistedPair)) and (Component.Length - FExceedLength > CmpDelta)) then
// //((AFormMode = fmRCableExceedLength) and (Component.MaxLength > 0) and (Component.Length - Component.MaxLength > CmpDelta) ) then
if Not ACanHaveDismountAccount or
Not CheckHaveWholeComponentDismounted(FCatalog, Component.WholeComponent) then
begin
DefineBeginEnd(Component, FirstObjName, FirstComponName, LastObjName, LastComponName);
//Component.NormsResources.CalcResourcesCost(true, true);
CurrMT.Append;
CurrMT.FieldByName(fnID).AsInteger := Component.ID;
CurrMT.FieldByName(fnMarkID).AsInteger := Component.MarkID;
CurrMT.FieldByName(fnName).AsString := GetComponNameForVisible(Component.Name, Component.NameMark);
CurrMT.FieldByName(fnNameSimple).AsString := Component.Name;
CurrMT.FieldByName(fnNameMark).AsString := Component.NameMark;
ComponLength := 0;
ComponLengthReserv := 0;
ComponMaxLength := 0;
ComponPrice := 0;
if CheckPriceTransformToUOMByCompType(@Component.ComponentType) then
begin
CurrMT.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
ComponLength := FloatInUOM(Component.Length, umMetr, TF_Main(GForm).FUOM);
ComponLengthReserv := FloatInUOM(Component.LengthReserv, umMetr, TF_Main(GForm).FUOM);
ComponMaxLength := FloatInUOM(Component.MaxLength, umMetr, TF_Main(GForm).FUOM);
ComponPrice := FloatInUOM(Component.Price, TF_Main(GForm).FUOM, umMetr);
end
else
begin
CurrMT.FieldByName(fnIzm).AsString := Component.Izm;
ComponLength := Component.Length;
ComponLengthReserv := Component.LengthReserv;
ComponMaxLength := Component.MaxLength;
ComponPrice := Component.Price;
end;
CurrMT.FieldByName(fnNameBegin).AsString := FirstObjName;
CurrMT.FieldByName(fnNameBeginCompon).AsString := FirstComponName;
// Поле для сортировки
if FirstComponName = '' then
CurrMT.FieldByName(fnNameBeginFull).AsString := FirstObjName
else
CurrMT.FieldByName(fnNameBeginFull).AsString := FirstObjName+'/'+FirstComponName;
CurrMT.FieldByName(fnNameEnd).AsString := LastObjName;
CurrMT.FieldByName(fnNameEndCompon).AsString := LastComponName;
// Поле для сортировки
if LastComponName = '' then
CurrMT.FieldByName(fnNameEndFull).AsString := LastObjName
else
CurrMT.FieldByName(fnNameEndFull).AsString := LastObjName +'/'+LastComponName;
//Tolik 14/11/2020 --
{
CurrMT.FieldByName('Length').AsFloat := RoundCP(ComponLength);
CurrMT.FieldByName('Length_Reserv').AsFloat := RoundCP(ComponLengthReserv);
CurrMT.FieldByName('Max_Length').AsFloat := RoundCP(ComponMaxLength);
CurrMT.FieldByName('Price').AsFloat := RoundCP(ComponPrice); //RoundX(Component.NormsResources.ResourcesCostPerOneNorm, 2);
CurrMT.FieldByName('Cost').AsFloat := RoundCP(ComponPrice*ComponLength); //RoundX(Component.NormsResources.ResourcesCost, 2);
}
CurrMT.FieldByName('Length').AsFloat := RoundX(ComponLength, FKolvoPrecision);
CurrMT.FieldByName('Length_Reserv').AsFloat := RoundX(ComponLengthReserv, FKolvoPrecision);
CurrMT.FieldByName('Max_Length').AsFloat := RoundX(ComponMaxLength, FKolvoPrecision);
CurrMT.FieldByName('Price').AsFloat := RoundX(ComponPrice,FPricePrecision);
CurrMT.FieldByName('Cost').AsFloat := RoundX(ComponPrice*ComponLength, Max(FKolvoPrecision, FPricePrecision)); //RoundX(Component.NormsResources.ResourcesCost, 2);
///
//*** Длина превышает граничное значение.
if (Component.HaveInterfaceByGUIDInterface(guidTwistedPair)) and
(Component.Length - FExceedLength > cnstCmpLenDelta) then
CurrMT.FieldByName('ExceedLength').AsBoolean := true
else
CurrMT.FieldByName('ExceedLength').AsBoolean := false;
CurrMT.Post;
{TextLine := '';
AddTextToLine(Component.Name);
AddTextToLine(FirstName);
AddTextToLine(LastName);
AddTextToLine(FloatToStr(RoundX(Component.Length, 3)) +' м');
AddTextToLine(FloatToStr(RoundX(Component.ResourcesCostPerOneNorm, 3)) +' '+GCurrency.Name_Brief);
AddTextToLine(FloatToStr(RoundX(Component.ResourcesCost, 2)) +' '+GCurrency.Name_Brief);
RichEdit_Report.Lines.Add(TextLine);
}
{RichEdit_Report.Lines.Add(Component.Name + DupStr(' ', 2) +
FirstName + DupStr(' ', 2) + LastName + DupStr(' ', 2) +
FloatToStr(RoundX(Component.Length, 2)) + DupStr(' ', 2)+
FloatToStr(RoundX(Component.ResourcesCostPerOneNorm, 2)) + DupStr(' ', 2)+
FloatToStr(RoundX(Component.ResourcesCost, 2)) );}
end;
end;
for j := 0 to Component.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := Component.WholeComponent.Items[j];
ListWithLookedCompons.Add(ptrID);
end;
end;
fmRCableCanal:
if CheckSysNameIsCableChannel(Component.ComponentType.SysName) then
begin
Component.LoadCurrLength;
//Component.NormsResources.CalcResourcesCost(true, true);
//*** Найти/Создать Группу
if Not CurrMTGrp.Locate(fnGUID, Component.GuidNB, []) then
begin
CurrMTGrp.Append;
CurrMTGrp.FieldByName(fnGUID).AsString := Component.GuidNB;
CurrMTGrp.FieldByName(fnName).AsString := Component.GetNameForVisible(false);
CurrMTGrp.FieldByName(fnLength).AsFloat := 0;
CurrMTGrp.FieldByName(fnLengthReserv).AsFloat := 0;
CurrMTGrp.FieldByName(fnCost).AsFloat := 0;
CurrMTGrp.Post;
end;
if CurrMTGrp.Locate(fnGUID, Component.GuidNB, []) then
begin
CurrMT.Append;
CurrMT.FieldByName(fnID).AsInteger := Component.ID;
CurrMT.FieldByName(fnMarkID).AsInteger := Component.MarkID;
CurrMT.FieldByName(fnName).AsString := Component.GetNameForVisible(false); //GetComponNameForVisible(Component.Name, Component.NameMark);
CurrMT.FieldByName(fnNameSimple).AsString := Component.Name;
CurrMT.FieldByName(fnNameMark).AsString := Component.NameMark;
ComponLength := 0;
ComponLengthReserv := 0;
ComponPrice := 0;
if CheckPriceTransformToUOMByCompType(@Component.ComponentType) then
begin
CurrMT.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
ComponLength := FloatInUOM(Component.Length, umMetr, TF_Main(GForm).FUOM);
ComponLengthReserv := FloatInUOM(Component.LengthReserv, umMetr, TF_Main(GForm).FUOM);
ComponPrice := FloatInUOM(Component.Price, TF_Main(GForm).FUOM, umMetr);
end
else
begin
CurrMT.FieldByName(fnIzm).AsString := Component.Izm;
ComponLength := Component.Length;
ComponLengthReserv := Component.LengthReserv;
ComponPrice := Component.Price;
end;
CableCanalCost := ComponPrice * ComponLength;
CurrMT.FieldByName('FILLING').AsFloat := Component.GetFullnessPercentCableCanal;
CurrMT.FieldByName('Length').AsFloat := RoundCP(ComponLength);
CurrMT.FieldByName(fnLengthReserv).AsFloat := RoundCP(ComponLengthReserv);
CurrMT.FieldByName('Price').AsFloat := RoundCP(ComponPrice); //Component.NormsResources.ResourcesCostPerOneNorm;
CurrMT.FieldByName('Cost').AsFloat := RoundCP(CableCanalCost); //Component.NormsResources.ResourcesCost;
CurrMT.Post;
CurrMTGrp.Edit;
CurrMTGrp.FieldByName(fnLength).AsFloat := CurrMTGrp.FieldByName(fnLength).AsFloat + RoundCP(ComponLength);
CurrMTGrp.FieldByName(fnLengthReserv).AsFloat := CurrMTGrp.FieldByName(fnLengthReserv).AsFloat + RoundCP(ComponLengthReserv);
CurrMTGrp.FieldByName(fnCost).AsFloat := CurrMTGrp.FieldByName(fnCost).AsFloat + RoundCP(CableCanalCost);
CurrMTGrp.Post;
//*** сортировать кабельные каналы в группе
CurrMT.SortOn(fnMarkID, []);
end;
end;
end; // Case End
end;
end;
end;
end; // первый проход
// второй проход
// смотрим електросеть, телевиз., и т.п. и засыпаем в таблицу
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
Component := AFolder.ComponentReferences[i];
if Assigned(Component) and CheckNoIDinList(Component.ID, ListWithLookedCompons) then
begin
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(Component.GUIDNetType) <> -1)) then
begin
ComponSignType := Component.GetPropertyValueAsInteger(pnSignType);
if ((Component.IsLine = biTrue) and ((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) and
( (Component.IDNetType in [3,{4,}5,7])) and CheckCanLookComponInReportCable(Component, ACanHaveDismountAccount)) then
begin
Component.RefreshWholeLengthIfNecessary;
case AFormMode of
fmRCable, fmRCableExceedLength:
// Tolik 14/11/220 --
//if CheckSysNameIsCable(Component.ComponentType.SysName) then
if isCableComponent(Component) then
//
begin
// Added by Tolik
if not cbNone.Checked then
CableTypesAdd(Component, CableTypes, CableIdsList,Component.ID, Self);
//*** Есть ли функциональные интерфейсы
//if HaveComponFunctionalInterfaces(scsQSelect, CurrIDCompon) then
if Component.HaveInterfaceByType(itFunctional) then
begin
Component.LoadWholeComponent(false);
Component.LoadWholeLength;
if Not ACanHaveDismountAccount or
Not CheckHaveWholeComponentDismounted(FCatalog, Component.WholeComponent) then
begin
DefineBeginEnd(Component, FirstObjName, FirstComponName, LastObjName, LastComponName);
CurrMT.Append;
CurrMT.FieldByName(fnID).AsInteger := Component.ID;
CurrMT.FieldByName(fnMarkID).AsInteger := Component.MarkID;
CurrMT.FieldByName(fnName).AsString := GetComponNameForVisible(Component.Name, Component.NameMark);
CurrMT.FieldByName(fnNameSimple).AsString := Component.Name;
CurrMT.FieldByName(fnNameMark).AsString := Component.NameMark;
ComponLength := 0;
ComponLengthReserv := 0;
ComponMaxLength := 0;
ComponPrice := 0;
if CheckPriceTransformToUOMByCompType(@Component.ComponentType) then
begin
CurrMT.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
ComponLength := FloatInUOM(Component.Length, umMetr, TF_Main(GForm).FUOM);
ComponLengthReserv := FloatInUOM(Component.LengthReserv, umMetr, TF_Main(GForm).FUOM);
ComponMaxLength := FloatInUOM(Component.MaxLength, umMetr, TF_Main(GForm).FUOM);
ComponPrice := FloatInUOM(Component.Price, TF_Main(GForm).FUOM, umMetr);
end
else
begin
CurrMT.FieldByName(fnIzm).AsString := Component.Izm;
ComponLength := Component.Length;
ComponLengthReserv := Component.LengthReserv;
ComponMaxLength := Component.MaxLength;
ComponPrice := Component.Price;
end;
CurrMT.FieldByName(fnNameBegin).AsString := FirstObjName;
CurrMT.FieldByName(fnNameBeginCompon).AsString := FirstComponName;
// Поле для сортировки
if FirstComponName = '' then
CurrMT.FieldByName(fnNameBeginFull).AsString := FirstObjName
// commentsd by Tolik
else
CurrMT.FieldByName(fnNameBeginFull).AsString := FirstObjName+'/'+FirstComponName;
CurrMT.FieldByName(fnNameEnd).AsString := LastObjName;
CurrMT.FieldByName(fnNameEndCompon).AsString := '';//LastComponName;
// Поле для сортировки
if LastComponName = '' then
CurrMT.FieldByName(fnNameEndFull).AsString := LastObjName;
//commented by Tolik
//else
// CurrMT.FieldByName(fnNameEndFull).AsString := LastObjName +'/'+LastComponName;
CurrMT.FieldByName('Length').AsFloat := RoundCP(ComponLength);
CurrMT.FieldByName('Length_Reserv').AsFloat := RoundCP(ComponLengthReserv);
CurrMT.FieldByName('Max_Length').AsFloat := RoundCP(ComponMaxLength);
CurrMT.FieldByName('Price').AsFloat := RoundCP(ComponPrice); //RoundX(Component.NormsResources.ResourcesCostPerOneNorm, 2);
CurrMT.FieldByName('Cost').AsFloat := RoundCP(ComponPrice*ComponLength); //RoundX(Component.NormsResources.ResourcesCost, 2);
CurrMT.FieldByName('ExceedLength').AsBoolean := false;
CurrMT.Post;
end;
end;
for j := 0 to Component.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := Component.WholeComponent.Items[j];
ListWithLookedCompons.Add(ptrID);
end;
end;
fmRCableCanal:
if CheckSysNameIsCableChannel(Component.ComponentType.SysName) then
begin
Component.LoadCurrLength;
//*** Найти/Создать Группу
if Not CurrMTGrp.Locate(fnGUID, Component.GuidNB, []) then
begin
CurrMTGrp.Append;
CurrMTGrp.FieldByName(fnGUID).AsString := Component.GuidNB;
CurrMTGrp.FieldByName(fnName).AsString := Component.GetNameForVisible(false);
CurrMTGrp.FieldByName(fnLength).AsFloat := 0;
CurrMTGrp.FieldByName(fnLengthReserv).AsFloat := 0;
CurrMTGrp.FieldByName(fnCost).AsFloat := 0;
CurrMTGrp.Post;
end;
if CurrMTGrp.Locate(fnGUID, Component.GuidNB, []) then
begin
CurrMT.Append;
CurrMT.FieldByName(fnID).AsInteger := Component.ID;
CurrMT.FieldByName(fnMarkID).AsInteger := Component.MarkID;
CurrMT.FieldByName(fnName).AsString := Component.GetNameForVisible(false); //GetComponNameForVisible(Component.Name, Component.NameMark);
CurrMT.FieldByName(fnNameSimple).AsString := Component.Name;
CurrMT.FieldByName(fnNameMark).AsString := Component.NameMark;
ComponLength := 0;
ComponLengthReserv := 0;
ComponPrice := 0;
if CheckPriceTransformToUOMByCompType(@Component.ComponentType) then
begin
CurrMT.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
ComponLength := FloatInUOM(Component.Length, umMetr, TF_Main(GForm).FUOM);
ComponLengthReserv := FloatInUOM(Component.LengthReserv, umMetr, TF_Main(GForm).FUOM);
ComponPrice := FloatInUOM(Component.Price, TF_Main(GForm).FUOM, umMetr);
end
else
begin
CurrMT.FieldByName(fnIzm).AsString := Component.Izm;
ComponLength := Component.Length;
ComponLengthReserv := Component.LengthReserv;
ComponPrice := Component.Price;
end;
CableCanalCost := ComponPrice * ComponLength;
CurrMT.FieldByName('FILLING').AsFloat := Component.GetFullnessPercentCableCanal;
CurrMT.FieldByName('Length').AsFloat := RoundCP(ComponLength);
CurrMT.FieldByName(fnLengthReserv).AsFloat := RoundCP(ComponLengthReserv);
CurrMT.FieldByName('Price').AsFloat := RoundCP(ComponPrice); //Component.NormsResources.ResourcesCostPerOneNorm;
CurrMT.FieldByName('Cost').AsFloat := RoundCP(CableCanalCost); //Component.NormsResources.ResourcesCost;
CurrMT.Post;
CurrMTGrp.Edit;
CurrMTGrp.FieldByName(fnLength).AsFloat := CurrMTGrp.FieldByName(fnLength).AsFloat + RoundCP(ComponLength);
CurrMTGrp.FieldByName(fnLengthReserv).AsFloat := CurrMTGrp.FieldByName(fnLengthReserv).AsFloat + RoundCP(ComponLengthReserv);
CurrMTGrp.FieldByName(fnCost).AsFloat := CurrMTGrp.FieldByName(fnCost).AsFloat + RoundCP(CableCanalCost);
CurrMTGrp.Post;
//*** сортировать кабельные каналы в группе
CurrMT.SortOn(fnMarkID, []);
end;
end;
end;
end;
end;
end;
end;
if AFormMode = fmRCableCanal then
CurrMTGrp.SortOn(fnName, []);
///////////////////////////////////////////////
AParams.FReportSortInfo.FUsedFieldNames.Clear;
AParams.FReportSortInfo.FUsedFieldNames.Add(fnNameSimple);
AParams.FReportSortInfo.FUsedFieldNames.Add(fnNameBeginFull);
AParams.FReportSortInfo.FUsedFieldNames.Add(fnNameEndFull);
SortMemTableByParams(CurrMT, AParams, AReportItemParamValues);
{if AFormMode = fmRCable then
CurrMT.SortOn(fnMarkID, []);
if AFormMode = fmRCableExceedLength then
CurrMT.SortOn('ExceedLength', []);}
finally
EndProgress;
FreeList(ListWithLookedCompons);
end;
// Added by Tolik
// Если требуется посчитать расход кабеля из катушек,
// то посчитаем
if not cbNone.Checked then
begin
if cbMaxScrapRate.Checked then
CableReelCalculate(CableTypes, 'MaxScrapRate',ReelsCableFlow, Self);
if cbMaxEfficiency.Checked then
CableReelCalculate(CableTypes, 'MaxEfficiency',ReelsCableFlow, Self);
CableReelNamesToMemTable(MemTable_RCable ,CableTypes);
end
// если нет - сбросим результаты предидущих расчетов,
// в случае наличия таковых
else
begin
if ReelsCableFlow <> nil then
ReelsCableFlow.Clear
else
// нет строк для отчета - создаем пустой список ()
ReelsCableFlow := TStringList.Create;
end;
FreeCableTypes(CableTypes);
GFormMode := AFormMode;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderCableReport: '+E.Message);
end;
end;
procedure TF_ResourceReport.ShowFolderDisparityComponReport(AFolder: TSCSCatalog; AParams: TReportItemParams;
AFormMode: TResourceReportFormMode);
var //FolderIDComponList: TList;
ListWithLookedCompons: TList;
ptrLookedIDs: PTwoID;
CurrIDCompon: Integer;
i, j: Integer;
Component: TSCSComponent;
OwnerCompon: TSCSCatalog;
ComponColor: Integer;
ComponColorStr: String;
ComponIDProducer: Integer;
FirstName: String;
LastName: String;
function CheckNoLookedIDs(AID1, AID2: Integer): Boolean;
var i: Integer;
begin
Result := true;
for i := 0 to ListWithLookedCompons.Count - 1 do
begin
ptrLookedIDs := ListWithLookedCompons[i];
if ( (ptrLookedIDs.ID1 = AID1) and (ptrLookedIDs.ID2 = AID2) ) or
( (ptrLookedIDs.ID1 = AID2) and (ptrLookedIDs.ID2 = AID1) ) then
begin
Result := false;
Break; //// BREAK /////
end;
end;
end;
procedure FindDisparityColorInCompRel(AComponent: TSCSComponent; AOwner: TSCSCatalog; AComponColor: Integer; ACompRelList: Tlist);
var i: integer;
ptrCompRel: PComplect;
SCSComponent: TSCSComponent;
OwnerComp: TSCSCatalog;
OppositeID: Integer;
CompColor: Integer;
CompColorStr: String;
ConnectKindStr: String;
HaveDisparity: Boolean;
begin
if AComponColor = -1 then
Exit; ///// EXIT /////
if Not Assigned(AOwner) then
Exit; ///// EXIT /////
//SCSComponent := TSCSComponent.Create(GForm);
for i := 0 to ACompRelList.Count - 1 do
begin
ptrCompRel := ACompRelList[i];
OppositeID := 0;
if ptrCompRel.ID_Child <> AComponent.ID then
OppositeID := ptrCompRel.ID_Child;
if ptrCompRel.ID_Component <> AComponent.ID then
OppositeID := ptrCompRel.ID_Component;
if OppositeID = 0 then
Exit; ///// EXIT /////
if Not CheckNoLookedIDs(AComponent.ID, OppositeID) then
Exit; ///// EXIT /////
//SCSComponent.LoadComponentByID(OppositeID, false);
SCSComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(OppositeID);
if Assigned(SCSComponent) then
begin
HaveDisparity := false;
case AFormMode of
fmRDisparityComponColor:
begin
CompColor := SCSComponent.GetPropertyValueAsInteger(pnColor);
if (AComponColor <> CompColor) and (CompColor <> -1) then
HaveDisparity := true;
end;
fmRDisparityComponProducer:
if AComponent.ID_Producer <> SCSComponent.ID_Producer then
HaveDisparity := true;
end;
//*** Если цвета не совпадают, то вывести компоненты в отчет
if HaveDisparity then
begin
OwnerComp := SCSComponent.GetFirstParentCatalog;
if Assigned(OwnerComp) then
begin
case ptrCompRel.ConnectType of
cntComplect:
ConnectKindStr := cResourceReport_Msg6_1;
cntUnion:
ConnectKindStr := cResourceReport_Msg6_2;
end;
MemTable_RDisparityCompColor.Append;
MemTable_RDisparityCompColor.FieldByName('ID1').AsInteger := AComponent.ID;
MemTable_RDisparityCompColor.FieldByName('Name1').AsString := AComponent.GetNameForVisible(false); //GetComponNameForVisible(AComponent.Name, AComponent.NameMark);
MemTable_RDisparityCompColor.FieldByName('Name_Object1').AsString := OwnerComp.GetNameForVisible; //GetNameAndIndexByTCatalog(AOwner);
MemTable_RDisparityCompColor.FieldByName('ID2').AsInteger := SCSComponent.ID;
MemTable_RDisparityCompColor.FieldByName('Name2').AsString := SCSComponent.GetNameForVisible(false); //GetComponNameForVisible(SCSComponent.Name, SCSComponent.NameMark);
MemTable_RDisparityCompColor.FieldByName('Name_Object2').AsString := OwnerComp.GetNameForVisible; //GetNameAndIndexByTCatalog(OwnerComp);
MemTable_RDisparityCompColor.FieldByName('Name_Connect_Type').AsString := ConnectKindStr;
MemTable_RDisparityCompColor.Post;
New(ptrLookedIDs);
ptrLookedIDs.ID1 := AComponent.ID;
ptrLookedIDs.ID2 := SCSComponent.ID;
ListWithLookedCompons.Add(ptrLookedIDs);
end;
end;
end;
end;
//SCSComponent.Free;
end;
begin
try
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FCatalog := AFolder;
//FolderIDComponList := Tlist.Create;
ListWithLookedCompons := TList.Create;
//WholeComponent := nil;
//Component := TSCSComponent.Create(GForm);
//FolderIDComponList := GetFolderComponList(GForm, AFolder, [itSCSLine, itSCSConnector]);
//if FolderIDComponList = nil then
// Exit; ///// EXIT /////
MemTable_RDisparityCompColor.Active := false;
MemTable_RDisparityCompColor.Active := true;
BeginProgress(pcPreparingReport);
try
with TF_Main(GForm) do
for i := 0 to AFolder.ComponentReferences.Count - 1 do //for i := 0 to FolderIDComponList.Count - 1 do
begin
//Component.LoadComponentByID(Integer(FolderIDComponList[i]^), false);
//OwnerCompon := DM.GetCatalogByCompon(Component.ID);
Component := AFolder.ComponentReferences[i];
OwnerCompon := Component.GetFirstParentCatalog;
ComponColor := clWhite;
case AFormMode of
fmRDisparityComponColor:
ComponColor := Component.GetPropertyValueAsInteger(pnColor);
{fmRDisparityComponProducer:
ComponIDProducer}
end;
/////////Component.LoadComplects;
FindDisparityColorInCompRel(Component, OwnerCompon, ComponColor, Component.Complects);
/////////Component.LoadConections;
FindDisparityColorInCompRel(Component, OwnerCompon, ComponColor, Component.Connections);
end;
finally
EndProgress;
FreeList(ListWithLookedCompons);
end;
GFormMode := AFormMode; //fmRDisparityComponColor;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
//ShowModal;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderDisparityComponReport: '+E.Message);
end;
end;
// кабельный журнал
procedure TF_ResourceReport.ShowFolderCableJournal(AFolder: TSCSCatalog; AParams: TReportItemParams; AResRepFormMode: TResourceReportFormMode; ACanHaveActiveComponents, ACanHaveDismountAccount, AFullPath: Boolean);
var //FolderIDComponList: TList;
AllAllTraceLength: double;
ListWithLookedCompons: TList;
CatalogList : TSCSCatalogs;
currSCSCatalog,nextSCSCatalog : TSCSCatalog;
CurrIDCompon: Integer;
i, j, k, l, m, n: Integer;
SCSComponent : TSCSComponent;
PartSCSComponent1, PartSCSComponent2 : TSCSComponent; // части кабеля
TopSCSComponent : TSCSComponent;
ComponList: TSCSComponents;
ComponCatagoryStr: String;
ComponCatagory: Integer;
Interfaces : TSCSInterfaces;
CurrSCSCatalogs : TSCSCatalogs;
propList,propList1 : TstringList;
ListCAD : TF_CAD;
currTrace,NextTrace : TFigure; // трассы, по которым проходит кабель
currLine : TOrthoLine;
ppropList : ^TStringList;
FirstTraceFound, NextTraceFound : Boolean;
Figure : TFigure;
Ortholine : TOrtholine;
Connector1, Connector2, Connector3, Connector4 : TConnectorObject;
Compon1,Compon2,Compon3,Compon4 : TSCSComponent;
// ComponList : TSCSComponents;
List : TList;
LineJoins : TStringList;
indexes : ^integer;
s : string;
CableTypes : TCableTypeArray;
CableIdsList : TintList;
// SCSObject : TSCSObject;
//InterfPortsNppFrom: TStringList;
//InterfTypesFrom: TStringList;
//InterfPortsNppTo: TStringList;
//InterfTypesTo: TStringList;
ListName: String;
FirstComponent: TSCSComponent;
LastComponent: TSCSComponent;
FromNppPort, FromNppPort1: Integer;
FromNppPortFromPos: Integer;
FromNppPortToPos: Integer;
FromPortName: String;
FromPort: TSCSInterface;
ToNppPort: Integer;
ToNppPortFromPos: Integer;
ToNppPortToPos: Integer;
ToPortName: String;
ToPort: TSCSInterface;
InterfCount: Integer;
MasterID: Integer;
ComponSignType: Integer;
ComponMarkTemplate: string;
ListOwner, ListOwner1: TSCSList;
TraceListOwner : TSCSList;
RoomOwner: TSCSCatalog;
SprComponentType: TNBComponentType;
Ports: TSCSInterfaces;
Port : TSCSInterface;
childCompon : TSCSComponent;
ptrID: ^Integer;
FirstCompon, LastCompon,currCompon : TSCScomponent;
PortCountTo, PortCountFrom : Integer;
{
function GetNameFrom(AFirstConnCompon: TSCSComponent): String;
var //CompCatalog: TCatalog;
OwnerCatalog: TSCSCatalog;
TopComponent: TSCSComponent;
begin
Result := '';
if Assigned(AFirstConnCompon) then
begin
TopComponent := AFirstConnCompon.GetTopComponent;
if (TopComponent <> nil) and (TopComponent <> AFirstConnCompon) then
Result := TopComponent.NameMark;
//OwnerCatalog := AFirstConnCompon.GetFirstParentCatalog;
//if Assigned(OwnerCatalog) then
//begin
// Result := OwnerCatalog.GetNameForVisible(false);
//end;
end;
end; }
//
function GetNameTo(ALastConnCompon, ALastLineCompon: TSCSComponent; var aNppPort: Integer; var aPortName: String;
aPort: TSCSInterface=nil; aPortFromPos: Integer=0; aPortToPos: Integer=0): String;
var
//HaveParent: Boolean;
//IDCurrCompon: Integer;
//PathList: TStringList;
//i: Integer;
//ResName: String;
//LastConnCompon: TSCSComponent;
//CurrCompon: TSCSComponent;
ListOwner: TSCSList;
LastConnComponObject: TSCSCatalog;
TopComponent: TSCSComponent;
ParentComponent: TSCSComponent;
ComponPath: TSCSComponents;
DepthJoinedConnCompon: TSCSComponent;
DepthComponInterfs: TSCSInterfaces;
PrevDepthComponInterfs: TSCSInterfaces;
Interf: TSCSInterface;
NppPortList: TIntList;
PortName: String;
i,m: Integer;
InternalJoinedCompon, PrevInternalJoinedCompon: TSCSComponent;
NppFrom, NppTo: Integer;
begin
Result := '';
//LastConnComponObject := ALastConnCompon.GetFirstParentCatalog;
//if Assigned(LastConnComponObject) then
// Result := LastConnComponObject.GetNameForVisible + '\';
//Result := Result + ALastConnCompon.GetNameForVisible;
ComponPath := TSCSComponents.Create(false);
TopComponent := ALastConnCompon.GetTopComponent;
if (TopComponent <> nil) and (TopComponent <> ALastConnCompon) then
Result := TopComponent.NameMark + '\';
ListOwner := ALastConnCompon.GetListOwner;
if ListOwner <> nil then
begin
//01.08.2012 DepthJoinedConnCompon := GetDepthJoinedConnComponByConnCompon(ALastConnCompon, ComponPath, nil, nil, nil);
DepthComponInterfs := TSCSInterfaces.Create(false);
PrevDepthComponInterfs := TSCSInterfaces.Create(false);
DepthJoinedConnCompon := GetDepthJoinedConnComponByConnCompon(ALastConnCompon, ComponPath, nil, DepthComponInterfs, PrevDepthComponInterfs,
aPort, aPortFromPos, aPortToPos, true);
//01.08.2012 - определяем порт внутреннего компонента
if DepthJoinedConnCompon <> ALastConnCompon then
if PrevDepthComponInterfs.Count > 0 then
begin
for i := 0 to DepthComponInterfs.Count - 1 do
begin
Interf := DepthComponInterfs[i];
NppPortList := nil;
if Interf.IsPort = biTrue then
begin
NppPortList := GetNppPortsByConnected(Interf, Interf, PrevDepthComponInterfs[0]);
PortName := Interf.LoadName;
end
else if Interf.PortOwner <> nil then
begin
NppPortList := GetNppPortsByConnected(Interf.PortOwner, Interf, PrevDepthComponInterfs[0]);
PortName := Interf.PortOwner.LoadName;
end;
if NppPortList <> nil then
begin
if NppPortList.Count > 0 then
begin
aNppPort := NppPortList[0];
aPortName := PortName;
end;
FreeAndNil(NppPortList);
end;
end;
end;
FreeAndNil(DepthComponInterfs);
FreeAndNil(PrevDepthComponInterfs);
//*** Если нужно отображать полный путь к уройству
// начинаем с компоненты на уровень выше, т.к DepthJoinedConnCompon будет добавлена ниже
if AFullPath then
begin
Result := '';
//04.02.2013 ParentComponent := DepthJoinedConnCompon.GetParentComponent;
ParentComponent := ComponPath[0].GetParentComponent; // компонент к которому подключен кабель
while ParentComponent <> nil do
begin
if ParentComponent.NameMark <> '' then
begin
if Result <> '' then
Result := '\' + Result; //04.02.2013 Result + '\';
Result := ParentComponent.NameMark + Result;
end;
ParentComponent := ParentComponent.GetParentComponent;
end;
if Result <> '' then
Result := Result + '\';
end;
//*** Если внешний СКС, то выводим полный путь подключений, иначе подключенный компонент вглубине
//01.08.2012 if ListOwner.Setting.SCSType = st_External then
if (ListOwner.Setting.SCSType = st_External) or AFullPath then
begin
PrevInternalJoinedCompon := nil;
for i := 0 to ComponPath.Count - 1 do
begin
InternalJoinedCompon := ComponPath[i];
//04.02.2013 отображаем номер порта пред. внутреннего компонента, к которому пдключен InternalJoinedCompon
if PrevInternalJoinedCompon <> nil then
if GetPortInfoByJoinedCompons(PrevInternalJoinedCompon, InternalJoinedCompon, NppFrom, NppTo) then
begin
if NppFrom = NppTo then
Result := Result +' ('+cNamePort+' '+IntToStr(NppFrom)+')'
else
Result := Result +' ('+cNamePort+' '+IntToStr(NppFrom)+'-'+IntToStr(NppTo)+')';
end;
if i > 0 then
Result := Result + '->';
Result := Result + ComponPath[i].GetNameForVisible;
PrevInternalJoinedCompon := InternalJoinedCompon; //04.02.2013
end;
end
else
Result := Result + DepthJoinedConnCompon.GetNameForVisible;
end
else
Result := Result + ALastConnCompon.GetNameForVisible;
{ 20070709
TopComponent := ALastConnCompon.GetTopComponent;
if (TopComponent <> nil) and (TopComponent <> ALastConnCompon) then
Result := TopComponent.NameMark + '\';
Result := Result + ALastConnCompon.GetNameForVisible;
}
{PathList := TStringList.Create;
//IDCurrCompon := AIDLastConnCompon;
HaveParent := True;
//LastConnCompon := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(AIDLastConnCompon);
LastConnCompon := ALastConnCompon;
if Assigned(LastConnCompon) then
begin
CurrCompon := LastConnCompon;
while Assigned(CurrCompon) do
begin
if PathList.Count < 1 then
PathList.Insert(0, CurrCompon.GetNameForVisible(false))
else
PathList.Insert(0, CurrCompon.Name);
if CurrCompon.Parent is TSCSComponent then
CurrCompon := TSCSComponent(CurrCompon.Parent)
else
CurrCompon := nil;
end;
end;
ResName := '';
for i := 0 to PathList.Count - 1 do
begin
if i = 0 then
ResName := PathList.Strings[i]
else
ResName := ResName + ' \ ' + PathList.Strings[i];
end;
PathList.Free;
Result := ResName;}
end;
{function GetMultiPortNameMark(APointComponent: TSCSComponent): String;
var
CurrParentComponent: TSCSComponent;
ResComponent: TSCSComponent;
begin
Result := '';
if APointComponent <> nil then
begin
ResComponent := APointComponent;
CurrParentComponent := APointComponent;
while CurrParentComponent <> nil do
begin
if CurrParentComponent.ComponentType.PortKind = pkMultiPort then
begin
ResComponent := CurrParentComponent;
Break; //// BREAK ////
end;
CurrParentComponent := CurrParentComponent.GetParentComponent;
end;
if ResComponent.NameMark <> '' then
Result := ResComponent.NameMark
else
Result := IntToStr(ResComponent.MarkID);
end;
end;}
//Tolik
Procedure SaveTracedCable(Compon: TSCSComponent);
Var i, j, k : Integer;
AllCable: TSCSComponents;
FirstConnected, LastConnected: TSCSComponents;
Interf: TSCSInterFace;
InterFacePosition: TSCSInterfPosition;
EndAssigned: Boolean;
ConnectionSide: Integer;
BeginDescription, EndDescription: String;
BeginCompon, EndCompon: TSCSComponent;
SCSCompon: TSCScomponent;
TracePart: string;
AllTraceLength, TracePartLength: Double;
CrossSquare: String;
PropFound: Boolean;
Parent,Parent1 : TSCSComponent;
// Tolik 10/08/2017 --
// возвращает полное наименование (путь) от самого верхнего компонента типа: шкаф/панель/плинт -- до порта)
Procedure CheckConnectionSide(var ConnectedCompons: TSCSComponents; var Descript: string; var ConnectedCompon: TSCSComponent);
var ConnSide: Integer;
i, j, k : Integer;
isLineConnection: Boolean;
PathList: TstringList;
ComponPath: String;
PathIndex: Integer;
PathString: String;
StringAdded: Boolean;
function GetComponPath(aCompon: TSCSComponent): String;
var CanSeekPath: Boolean;
ParentCompon: TSCSComponent;
begin
Result := '';
ParentCompon := aCompon.GetParentComponent;
if ParentCompon <> nil then
begin
//Result := ParentCompon.Name + ' '+inttostr(ParentCompon.MarkID);
Result := ParentCompon.Name + ' '+ParentCompon.NameMark;
CanSeekPath := True;
while CanSeekPath do
begin
CanSeekPath := False;
ParentCompon := ParentCompon.GetParentComponent;
if ParentCompon <> nil then
begin
CanSeekPath := True;
// Result := ParentCompon.Name + ' '+inttostr(ParentCompon.MarkID) + '/'+Result;
Result := ParentCompon.Name + ' '+ParentCompon.NameMark + '/'+Result;
end;
end;
end;
end;
Begin
PathList := TStringList.Create;
ConnSide := ConnectionSide;
EndAssigned := false;
While not EndAssigned do
begin
if ConnSide = 0 then
break;
for i := 0 to SCSCompon.Interfaces.Count - 1 do
begin
if ( (SCSCompon.Interfaces[i].TypeI = itFunctional) and (SCSCompon.Interfaces[i].Side = ConnSide)
and ((SCSCompon.Interfaces[i].IsBusy = biTrue) or (SCSCompon.Interfaces[i].KolvoBusy > 0 ))
) then
begin
for j := 0 to SCSCompon.Interfaces[i].BusyPositions.Count - 1 do
begin
InterFacePosition := SCSCompon.Interfaces[i].BusyPositions[j];
InterFacePosition := InterFacePosition.GetConnectedPos;
Interf := TSCSInterFace(InterFacePosition.InterfOwner);
if Interf.ComponentOwner <> nil then
begin
if ConnectedCompons.IndexOF(Interf.ComponentOwner) = -1 then
ConnectedCompons.Add(Interf.ComponentOwner);
end;
end;
end;
end;
// если нашли точечный компонент, скрутку или ничего не нашли, здесь будет конец кабеля
if ( (ConnectedCompons.Count = 0) or ((ConnectedCompons.Count = 1) and (ConnectedCompons[0].IsLine = biFalse)) or
(ConnectedCompons.Count > 1)
) then
begin
if ConnectedCompons.Count = 0 then
begin
Descript := cRepMsg267;
ConnectedCompon := nil;
end;
if ConnectedCompons.Count > 1 then
begin
// Tolik -- 23/06/2016 --
isLineConnection := True;
for i := 0 to ConnectedCompons.Count - 1 do
begin
if TSCSComponent(ConnectedCompons[i]).IsLine = biFalse then
begin
isLineConnection := False;
break;
end;
end;
if isLineConnection then
Descript := cRepMsg246
else
begin
//Descript := ConnectedCompon.Name + ' ' + ConnectedCompon.NameMark;
if ConnectedCompons.Count > 0 then
begin
for i := 0 to ConnectedCompons.Count - 1 do
begin
ConnectedCompon := TSCSComponent(ConnectedCompons[i]);
StringAdded := False;
ComponPath := '';
//Descript := ConnectedCompon.Name + ' ' + IntToStr(ConnectedCompon.MarkID);
Descript := ConnectedCompon.Name + ' ' +ConnectedCompon.NameMark;
if cbFullPathInCableJournal.Checked then
ComponPath := GetComponPath(ConnectedCompon);
if ComponPath <> '' then
begin
for j := 0 to PathList.Count - 1 do
begin
PathString := PathList[j];
if Pos(ComponPath, PathString) <> 0 then
begin
StringAdded := True;
PathString := PathString + ',' + Descript;
PathList[j] := PathString;
break;
end;
end;
if Not StringAdded then
PathList.Add(ComponPath + '/' + Descript);
end
else
begin
PathList.Add(Descript);
end;
end;
Descript := PathList.Text;
end;
end;
end
else
if ConnectedCompons.Count = 1 then
begin
ConnectedCompon := ConnectedCompons.Items[0];
// Tolik 23/10/2020 --
//if cbFullPathInCableJournal.Checked then
if not cbFullPathInCableJournal.Checked then // а то кнопочка работает наоборот...
Descript := ConnectedCompon.Name + ConnectedCompon.NameMark
else
begin
PathString := GetComponPath(ConnectedCompon);
if PathString = '' then
Descript := ConnectedCompon.Name + ConnectedCompon.NameMark
else
Descript := PathString + '/' + ConnectedCompon.Name + ConnectedCompon.NameMark;
end;
end;
EndAssigned := true;
end
else
begin
if ((ConnectedCompons.Count = 1) and (ConnectedCompons[0].isLine = biTrue)) then
begin
//если тот же кабель пошел дальше
if ConnectedCompons[0].Cypher = Compon.Cypher then
begin
ConnSide := 0;
ComponList.Add(ConnectedCompons[0]);
//определяем сторону подключения к предидущему
for j := 0 to ConnectedCompons[0].Interfaces.count - 1 do
begin
if ConnectedCompons[0].Interfaces[j].TypeI = itFunctional then
begin
for k := 0 to ConnectedCompons[0].Interfaces[j].BusyPositions.Count - 1 do
begin
InterFacePosition := ConnectedCompons[0].Interfaces[j].BusyPositions[k];
InterFacePosition := InterFacePosition.GetConnectedPos;
Interf := TSCSInterface(InterFacePosition.InterfOwner);
if Interf.ComponentOwner = SCSCompon then
begin
ConnSide := ConnectedCompons[0].Interfaces[j].Side;
break;
end;
end;
end;
if ConnSide <> 0 then break;
end;
//сторону подключения меняем, чтобы посмотреть, что подключено с другого конца
if ConnSide = 1 then
ConnSide := 2
else
if ConnSide = 2 then
ConnSide := 1;
//
SCSCompon := ConnectedCompons[0];
if ComponList.IndexOF(SCSCompon) = -1 then
ComponList.Add(SCSCompon);
if ConnectionSide = 1 then
AllCable.Insert(0, SCSCompon)
else
if ConnectionSide = 2 then
AllCable.Add(SCSCompon);
ConnectedCompons.Clear;
end
else
begin
Descript := cRepMsg242;
ConnectedCompon := ConnectedCompons.Items[0];
EndAssigned := true;
end;
end;
end;
end;
End;
Procedure ExcangeSides;
var tmpList: TSCSComponents;
i: Integer;
tmpCompon: TSCSComponent;
s: string;
begin
tmpCompon := BeginCompon;
BeginCompon := EndCompon;
EndCompon := tmpCompon;
tmpList := TSCSComponents.Create(false);
tmpList.Assign(FirstConnected, laCopy);
FirstConnected.Clear;
FirstConnected.Assign(LastConnected, laCopy);
LastConnected.Assign(tmpList, laCopy);
tmpList.Clear;
tmpList.Assign(AllCable,laCopy);
AllCable.Clear;
for i := tmpList.Count - 1 downto 0 do
AllCable.Add(tmpList[i]);
tmpList.Clear;
s := BeginDescription;
BeginDescription := EndDescription;
EndDescription := s;
tmpList.free;
end;
//
Begin
AllCable := TSCSComponents.Create(false);
SCSCompon := Compon;
FirstConnected := TSCSComponents.Create(false);
LastConnected := TSCSComponents.Create(false);
BeginDescription := '';
EndDescription := '';
BeginCompon := nil;
EndCompon := nil;
ALLCable.Add(SCSCompon);
// подключение кабеля с одной стороны
EndAssigned := false;
ConnectionSide := 1;
CheckConnectionSide(FirstConnected, BeginDescription, BeginCompon);
// подключение кабеля с другой стороны
EndAssigned := false;
ConnectionSide := 2;
SCSCompon := Compon;
CheckConnectionSide(LastConnected, EndDescription, EndCompon);
CrossSquare := '';
TracePart := '';
TracePartLength := 0;
AllTraceLength := 0;
// Tolik --10/08/20107 -- перевернуть, если не сходится направление подключения
// Tolik -- 10/08/2017 --
Compon.RefreshWholeLengthIfNecessary;
Compon.LoadWholeComponent(false);
Compon.LoadWholeLength;
Compon.DefineFirstLast;
//
if (BeginCompon <> nil) and (EndCompon <> nil) then
if (BeginCompon <> Compon.FirstConnectedConnCompon) or (FirstConnected.IndexOf(BeginCompon) = -1) then
ExcangeSides;
SCSCompon := AllCable[0];
// TracePartLength := AllCable[0].Length;
AllTraceLength := RoundX(AllCable[0].GetPartLength, 2);
SCSCompon := AllCable[0];
if SCSCompon.GetParentComponent <> nil then
TracePart := SCSCompon.GetParentComponent.NameShort
else
TracePart := cRepMsg265;
TracePartLength := Roundx(SCSCompon.GetPartLength, 2);
for i := 1 to AllCable.Count - 1 do
begin
// оба куска кабеля вложены в ложемент или гофру
if (AllCable[i - 1].GetParentComponent <> nil) and (AllCable[i].GetParentComponent <> nil) then
begin
Parent := AllCable[i - 1].GetParentComponent;
Parent1 := AllCable[i].GetParentComponent;
SCSCompon := AllCable[i];
//если в одинаковую, то просто складываем длину
if Parent.NameShort = Parent1.NameShort then
begin
TracePartLength := TracePartLength + RoundX(SCSCompon.GetPartLength, 2);
end
// если не в одинаковую, то добавляем имена
else
begin
// верхний компонент дописываем, если есть
TracePart := TracePart + ' - ' + Floattostr(TracePartLength)+'м; ' + Parent1.NameShort;
// длину сбрасываем
TracePartLength := RoundX(SCSCompon.GetPartLength, 2);
end;
end;
// оба куска кабеля просто лежат на трассах
if (AllCable[i - 1].GetParentComponent = nil) and (AllCable[i].GetParentComponent = nil) then
begin
TracePartLength := TracePartLength + RoundX(AllCable[i].GetPartLength, 2);
end;
// кусок на трассе, кусок - вложен
if ( ((AllCable[i - 1].GetParentComponent <> nil) and (AllCable[i].GetParentComponent = nil)) or
((AllCable[i - 1].GetParentComponent = nil) and (AllCable[i].GetParentComponent <> nil))
) then
begin
TracePart := TracePart + ' - '+Floattostr(TracePartLength)+'м;';
if AllCable[i].GetParentComponent = nil then
TracePart := TracePart + cRepMsg265
else
TracePart := TracePart + ' ' + AllCable[i].GetParentComponent.NameShort;
TracePartLength := RoundX(AllCable[i].GetPartLength,2);
end;
AllTraceLength := AllTraceLength + RoundX(AllCable[i].GetPartLength, 2);
end;
AllAllTraceLength := AllAllTraceLength + AllTraceLength;
//Tolik 23/10/2020 -- не матры, а единицы измерения, принятые в проекте
//TracePart := TracePart + '-' + Floattostr(TracePartLength) + cRepMsg266;
TracePart := TracePart + '-' + Floattostr(RoundX(FloatInUOM(TracePartLength, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure),2)) +
' ' + GetNameUOM(TF_Main(GForm).FUOM, true);
//
// ищем сечение кабеля и количество жил (если задано)
PropFound := false;
if AllCable[0].GetPropertyBySysName(pnWireCount) <> nil then
begin
CrossSquare := AllCable[0].GetPropertyBySysName(pnWireCount).Value;
end;
CrossSquare := CrossSquare + 'х' + floattostr(RoundX(AllCable[0].GetVolume(gtMale, '', true),2));
// если выводить полный путь к компонентам
//Tolik
{
if cbFullPathInCableJournal.Checked then
begin
while not BeginCompon.IsTop do
begin
BeginCompon := BeginCompon.GetParentComponent;
BeginDescription := BeginDescription + '/' + BeginCompon.NameMark;
end;
while not EndCompon.IsTop do
begin
EndCompon := EndCompon.GetParentComponent;
EndDescription := EndCompon.NameMark + '/' + EndDescription;
end;
end;
}
MemTable_RCableJournal.Append;
MemTable_RCableJournal.FieldByName(fnName).AsString := Compon.NameMark; // обозначение кабеля
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := BeginDescription; // начало
MemTable_RCableJournal.FieldByName(fnNameTo).AsString := EndDescription; // конец
MemTable_RCableJournal.FieldByName(fnTraceCabling).AsString := TracePart; // участок трассы, кабеля
MemTable_RCableJournal.FieldByName(fnNameMark).AsString := Compon.Name; // марка
MemTable_RCableJournal.FieldByName(fnTotalKolvo).AsString := CrossSquare; // количество,число и сечение жид
// Tolik 18/10/2020 --
// MemTable_RCableJournal.FieldByName(fnLength).asFloat := AllTraceLength; // длина, м
MemTable_RCableJournal.FieldByName(fnLength).asFloat := RoundX(FloatInUOM(AllTraceLength, umMetr, F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure),2); // длина в единицах измерения проекта
//
MemTable_RCableJournal.FieldByName(fnNotice).asString := SCSCompon.Notice; // примечание
if BeginCompon <> nil then
MemTable_RCableJournal.FieldByName(fnNameBegin).AsString := BeginCompon.GetFirstParentCatalog.GetNameForVisible(false); // парент каталог для начала
if EndCompon <> nil then
MemTable_RCableJournal.FieldbyName(fnNameEnd).AsString := EndCompon.GetFirstParentCatalog.GetNameForVisible(false); // парент каталог для конца
FreeAndNil(ALLCable);
FreeAndNil(FirstConnected);
FreeAndNil(LastConnected);
End;
begin
// Tolik 02/09/2020 --
MemTable_RCableJournal.Close;
MemTable_RCableJournal.Open;
//
MemTable_RCableJournal.FieldDefs.Clear;
MemTable_RCableJournal.FieldDefs.Add(fnID, ftAutoInc);
MemTable_RCableJournal.FieldDefs.Add(fnNameList, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameCable, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnName, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameMark, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftInteger);
//MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnComponentIndex, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnIZM, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnCategory, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnLength, ftFloat);
//Tolik -- 24/06/2016 -- не влазит, надо расширить
// MemTable_RCableJournal.FieldDefs.Add(fnNameFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameFrom, ftString, 3000);
//
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeFrom, ftString, 255);
//Tolik -- 24/06/2016 -- не влазит, надо расширить
//MemTable_RCableJournal.FieldDefs.Add(fnNameTo, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameTo, ftString, 3000);
//
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeTo, ftString, 255);
//Added by Tolik
MemTable_RCableJournal.FieldDefs.Add(fnMarks, ftMemo); // маркировки компонентов по всему кабелю
MemTable_RCableJournal.FieldDefs.Add(fnPrices, ftMemo); // стоимость кабеля на каждом участке
MemTable_RCableJournal.FieldDefs.Add(fnLengthReserv, ftFloat); // запас кабеля
MemTable_RCableJournal.FieldDefs.Add(fnReelName,ftString,255); // наименование катушки, из которой отрезан кабель
MemTable_RCableJournal.FieldDefs.Add(fnTraceCabling, ftString, 255); // участок трассы, кабеля
MemTable_RCableJournal.FieldDefs.Add(fnTotalKolvo, ftString, 255); // количество, число и сечение жил
MemTable_RCableJournal.FieldDefs.Add(fnNotice, ftString, 255); // примечание (можно использовать как альтернативную маркировку)
MemTable_RCableJournal.FieldDefs.Add(fnNameBegin, ftString, 255); // парент каталог начала
MemTable_RCableJournal.FieldDefs.Add(fnNameEnd, ftString, 255); // парент каталог конца
MemTable_RCableJournal.Close;
MemTable_RCableJournal.Open;
// Tolik
// Старая форма отчета
//Tolik02/09/2020
if (cbOldReportForm.Visible = false) or ((cbOldReportForm.Visible = true) and cbOldReportForm.Checked) then
//if cbOldReportForm.Checked then
//
begin
try
SetLength(CableTypes,0);
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FCatalog := AFolder;
//FolderIDComponList := Tlist.Create;
ListWithLookedCompons := TList.Create;
//InterfPortsNppFrom := TStringList.Create;
//InterfTypesFrom := TStringList.Create;
//InterfPortsNppTo := TStringList.Create;
//InterfTypesTo := TStringList.Create;
//WholeComponent := nil;
//Component := TSCSComponent.Create(GForm);
//FolderIDComponList := GetFolderComponList(GForm, AFolder, [itSCSLine]);
//if FolderIDComponList = nil then
// Exit; ///// EXIT /////
MemTable_RCableJournal.Active := false;
MemTable_RCableJournal.Active := true;
//MemTable_RPortToAndFrom.Active := false;
//MemTable_RPortToAndFrom.Active := true;
BeginProgress(pcPreparingReport);
// Tolik
if CableIdsList = nil then
CableIdsList := TIntList.Create
else
CableIdsList.Clear;
if not cbShowCablePath.Checked then // если не учитывать путь кабеля, то показать
// стандартный отчет
//
begin
try
with TF_Main(GForm).DM do
begin
for i := 0 to AFolder.ComponentReferences.Count - 1 do //for i := 0 to FolderIDComponList.Count - 1 do
begin
//CurrIDCompon := Integer(FolderIDComponList.Items[i]^);
SCSComponent := AFolder.ComponentReferences[i];
if Assigned(SCSComponent) then
begin
// по типу сети
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1)) then
begin
ComponSignType := SCSComponent.GetPropertyValueAsInteger(pnSignType);
if (SCSComponent.IsLine = biTrue) and ((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) then
begin
if SCSComponent.HaveInterfaceByType(itFunctional) then //*** Есть ли функциональные интерфейсы
begin
//if ((CheckSysNameIsCable(SCSComponent.ComponentType.SysName)) and
if ( IsCableComponent(SCSComponent) and // Tolik 24/06/2016 -- так правильнее будет(точно будем понимать, что это -- кабель)
// Tolik -- отфильтровать сети по типам, но только в том случае, если выбраны все, если выбраны не все -
// фильтровать не будем, чтобы дать возможность показать в отчете не только компьютерные сети
// (not (SCSComponent.IDNetType in [3,4,5,7])) and
// Tolik -- 12/07/2016 --
// (((not (SCSComponent.IDNetType in [3,4,5,7])) and AllNetTypes) or (not AllNetTypes)) and
(((SCSComponent.IDNetType in [3,{4,}5,7]) and (not AllNetTypes)) or AllNetTypes) and
//
CheckNoIDinList(SCSComponent.ID, ListWithLookedCompons)) then
begin
SCSComponent.RefreshWholeLengthIfNecessary;
SCSComponent.LoadWholeComponent(false);
SCSComponent.LoadWholeLength;
SCSComponent.DefineFirstLast;
//if (SCSComponent.FirstIDConnectedConnCompon > 0) and
// (SCSComponent.LastIDConnectedConnCompon > 0) then
if Assigned(SCSComponent.FirstConnectedConnCompon) and
Assigned(SCSComponent.LastConnectedConnCompon) and
CheckCanLookComponInReportCable(SCSComponent.FirstConnectedConnCompon, ACanHaveDismountAccount) and
CheckCanLookComponInReportCable(SCSComponent.LastConnectedConnCompon, ACanHaveDismountAccount) then
begin
if Not ACanHaveDismountAccount or
Not CheckHaveWholeComponentDismounted(FCatalog, SCSComponent.WholeComponent) then
begin
//01.04.2009 SCSComponent.RefreshWholeLengthIfNecessary;
// Если требуется рассчитать расход кабеля из катушек
// формируем по ходу список типов кабелей
if not cbNone.Checked then
CableTypesAdd(SCSComponent, CableTypes, CableIdsList, MemTable_RCableJournal.AutoIncValue+1, self);
ComponCatagoryStr := '';
ComponCatagoryStr := SCSComponent.GetPropertyValueBySysName(pnCategory);
ListName := '';
FirstComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.FirstIDCompon);
LastComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.LastIDCompon);
LoadPortName(SCSComponent.FirstIDConnectedConnCompon, SCSComponent.FirstIDCompon, FromNppPort, FromPortName, @FromPort, @FromNppPortFromPos, @FromNppPortToPos);
LoadPortName(SCSComponent.LastIDConnectedConnCompon, SCSComponent.LastIDCompon, ToNppPort, ToPortName, @ToPort, @ToNppPortFromPos, @ToNppPortToPos);
if AResRepFormMode = fmRCableJournal then
begin
if (FirstComponent <> nil) and (LastComponent <> nil) then
begin
if FirstComponent.ListID = LastComponent.ListID then
ListName := GetListName(FirstComponent)
else
ListName := GetListName(FirstComponent) + '/' + GetListName(LastComponent);
end;
MemTable_RCableJournal.Append;
MemTable_RCableJournal.FieldByName(fnNameList).AsString := ListName;
MemTable_RCableJournal.FieldByName(fnNameCable).AsString := SCSComponent.GetNameForVisible(false); //GetComponNameForVisible(Component.Name, Component.NameMark);
MemTable_RCableJournal.FieldByName(fnName).AsString := SCSComponent.Name;
MemTable_RCableJournal.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
//MemTable_RCableJournal.FieldByName(fnMarkID).AsString := IntToStr(SCSComponent.MarkID);
MemTable_RCableJournal.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
MemTable_RCableJournal.FieldByName(fnCategory).AsString := ComponCatagoryStr;
if CheckPriceTransformToUOMByCompType(@SCSComponent.ComponentType) then
begin
MemTable_RCableJournal.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
MemTable_RCableJournal.FieldByName(fnLength).AsFloat := FloatInUOM(SCSComponent.Length, umMetr, TF_Main(GForm).FUOM);
//MemTable_RCableJournal.FieldByName(fnLength).AsString := FormatFloat(ffMask, FloatInUOM(SCSComponent.Length, umMetr, TF_Main(GForm).FUOM));
end
else
begin
MemTable_RCableJournal.FieldByName(fnIzm).AsString := SCSComponent.Izm;
MemTable_RCableJournal.FieldByName(fnLength).AsFloat := SCSComponent.Length;
//MemTable_RCableJournal.FieldByName(fnLength).AsString := FormatFloat(ffMask, SCSComponent.Length);
end;
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := GetNameTo(SCSComponent.FirstConnectedConnCompon, FirstComponent, FromNppPort, FromPortName, FromPort, FromNppPortFromPos, FromNppPortToPos); //GetNameFrom(SCSComponent.FirstConnectedConnCompon);
MemTable_RCableJournal.FieldByName(fnNameTo).AsString := GetNameTo(SCSComponent.LastConnectedConnCompon, LastComponent, ToNppPort, ToPortName, ToPort, ToNppPortFromPos, ToNppPortToPos);
MemTable_RCableJournal.FieldByName(fnPortNameFrom).AsInteger := FromNppPort;
//
MemTable_RCableJournal.FieldByName(fnPortTypeFrom).AsString := FromPortName;
MemTable_RCableJournal.FieldByName(fnPortNameTo).AsInteger := ToNppPort;
MemTable_RCableJournal.FieldByName(fnPortTypeTo).AsString := ToPortName;
MasterID := MemTable_RCableJournal.FieldByName(fnID).AsInteger;
MemTable_RCableJournal.Post;
end
else
if AResRepFormMode = fmRGOSTCableJournal then
begin
if FirstComponent <> nil then
begin
ListName := GetListName(FirstComponent);
RoomOwner := GetComponObjectOwnerByItemType(FirstComponent, itRoom);
if RoomOwner <> nil then
ListName := ListName + '. '+ RoomOwner.GetNameForVisible;
end;
//*** Определить шаблон мркировки
ComponMarkTemplate := '';
ListOwner := nil;
if FirstComponent <> nil then
ListOwner := FirstComponent.GetListOwner
else
if LastComponent <> nil then
ListOwner := LastComponent.GetListOwner
else
ListOwner := SCSComponent.GetListOwner;
if ListOwner <> nil then
SprComponentType := ListOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
if SprComponentType <> nil then
ComponMarkTemplate := SprComponentType.ComponentType.MarkMask;
//*** Удалить обозначение из
if ComponMarkTemplate <> '' then
if Pos(mteNameShort, ComponMarkTemplate) <> 0 then
Delete(ComponMarkTemplate, Pos(mteNameShort, ComponMarkTemplate), Length(mteNameShort));
MemTable_RCableJournal.Append;
//MemTable_RCableJournal.FieldByName(fnMarkID).AsString := TF_Main(SCSComponent.ActiveForm).MakeNameMarkComponent(SCSComponent, SCSComponent.GetFirstParentCatalog, false, ComponMarkTemplate); // номер кабеля
MemTable_RCableJournal.FieldByName(fnNameMark).AsString := TF_Main(SCSComponent.ActiveForm).MakeNameMarkComponent(SCSComponent, SCSComponent.GetFirstParentCatalog, false, ComponMarkTemplate); // номер кабеля
MemTable_RCableJournal.FieldByName(fnComponentIndex).AsInteger := SCSComponent.MarkID;
MemTable_RCableJournal.FieldByName(fnNameCable).AsString := SCSComponent.NameShort; //Тип кабеля
MemTable_RCableJournal.FieldByName(fnNameTo).AsString := GetMultiPortNameMark(SCSComponent.LastConnectedConnCompon, true); // Номер комутационной панели
MemTable_RCableJournal.FieldByName(fnPortNameTo).AsString := IntToStr(ToNppPort); // Номер порта панели
MemTable_RCableJournal.FieldByName(fnNameList).AsString := ListName; // Откуда приходит
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := GetMultiPortNameMark(SCSComponent.FirstConnectedConnCompon, true); // Номер розетки
MemTable_RCableJournal.FieldByName(fnPortNameFrom).AsString := IntToStr(FromNppPort);// IntToStr(FromNppPort); // номер порта розетки
MasterID := MemTable_RCableJournal.FieldByName(fnID).AsInteger;
MemTable_RCableJournal.Post;
end;
end;
end;
for j := 0 to SCSComponent.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := SCSComponent.WholeComponent.Items[j];
ListWithLookedCompons.Add(ptrID);
end;
end;
end;
end;
end;
end;
end;
end;
//*** Сортировка
//if AResRepFormMode = fmRCableJournal then
// MemTable_RCableJournal.SortOn(fnMarkID, [])
//else
//if AResRepFormMode = fmRGOSTCableJournal then
// MemTable_RCableJournal.SortOn(fnMarkID, []);
//MemTable_RCableJournal.SortOn(fnMarkID, []);
SortMemTableByParams(MemTable_RCableJournal, AParams, nil);
finally
EndProgress;
FreeList(ListWithLookedCompons);
end;
end
else // Added by Tolik (Если учитывать путь кабеля)
begin
{ MemTable_RCableJournal.FieldDefs.Clear;
MemTable_RCableJournal.FieldDefs.Add(fnID, ftAutoInc);
MemTable_RCableJournal.FieldDefs.Add(fnNameList, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameCable, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnName, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameMark, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftInteger);
//MemTable_RCableJournal.FieldDefs.Add(fnMarkID, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnComponentIndex, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnIZM, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnCategory, ftString, 20);
MemTable_RCableJournal.FieldDefs.Add(fnLength, ftFloat);
MemTable_RCableJournal.FieldDefs.Add(fnNameFrom, ftString, 255);
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameFrom, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeFrom, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnNameTo, ftString, 255);
//MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftString, 255);
MemTable_RCableJournal.FieldDefs.Add(fnPortNameTo, ftInteger);
MemTable_RCableJournal.FieldDefs.Add(fnPortTypeTo, ftString, 255);
//Added by Tolik
MemTable_RCableJournal.FieldDefs.Add(fnMarks, ftMemo); // маркировки компонентов по всему кабелю
MemTable_RCableJournal.FieldDefs.Add(fnPrices, ftMemo); // стоимость кабеля на каждом участке
MemTable_RCableJournal.FieldDefs.Add(fnLengthReserv, ftFloat); // запас кабеля
MemTable_RCableJournal.FieldDefs.Add(fnReelName,ftString,255); // наименование катушки, из которой отрезан кабель
MemTable_RCableJournal.Close;
MemTable_RCableJournal.Open;}
//
CatalogList := TSCSCatalogs.Create(false);
CatalogList.Add(AFolder);
CatalogList.AddItems(AFolder.ChildCatalogReferences);
SortSCSObjectsByPMOrder(CatalogList);
try
with TF_Main(GForm).DM do
for i := 0 to AFolder.ComponentReferences.Count - 1 do //for i := 0 to FolderIDComponList.Count - 1 do
begin
//CurrIDCompon := Integer(FolderIDComponList.Items[i]^);
SCSComponent := AFolder.ComponentReferences[i];
if Assigned(SCSComponent) then
begin
// по типу сети
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1)) then
begin
ComponSignType := SCSComponent.GetPropertyValueAsInteger(pnSignType);
if (SCSComponent.IsLine = biTrue) and ((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) then
begin
if SCSComponent.HaveInterfaceByType(itFunctional) then //*** Есть ли функциональные интерфейсы
begin
//Tolik 14/11/2020 --
//if (CheckSysNameIsCable(SCSComponent.ComponentType.SysName) and
if (IsCableComponent(SCSComponent) and
//
// Tolik
// (not (SCSComponent.IDNetType in [3,4,5,7])) and
(((not (SCSComponent.IDNetType in [3,{4,}5,7])) and AllNetTypes) or (not AllNetTypes)) and
//
CheckNoIDinList(SCSComponent.ID, ListWithLookedCompons)) then
begin
SCSComponent.RefreshWholeLengthIfNecessary;
SCSComponent.LoadWholeComponent(false);
SCSComponent.LoadWholeLength;
SCSComponent.DefineFirstLast;
if Assigned(SCSComponent.FirstConnectedConnCompon) and
Assigned(SCSComponent.LastConnectedConnCompon) and
CheckCanLookComponInReportCable(SCSComponent.FirstConnectedConnCompon, ACanHaveDismountAccount) and
CheckCanLookComponInReportCable(SCSComponent.LastConnectedConnCompon, ACanHaveDismountAccount) then
begin
if Not ACanHaveDismountAccount or
Not CheckHaveWholeComponentDismounted(FCatalog, SCSComponent.WholeComponent) then
begin
// Если требуется рассчитать расход кабеля из катушек
// формируем по ходу список типов кабелей
if not cbNone.Checked then
CableTypesAdd(SCSComponent, CableTypes, CableIdsList,MemTable_RCableJournal.AutoIncValue + 1, self);
//01.04.2009 SCSComponent.RefreshWholeLengthIfNecessary;
ComponList := TSCSComponents.create(false);
//ComponList1 := TSCSComponents.create(false);
SetActualOrderInPartComponent(SCSComponent, ComponList, FromNppPort1, ListName);
propList:=tstringList.Create;
propList1:=tstringList.Create;
GetCablePath(SCSComponent,propList,propList1,ComponList);
ComponCatagoryStr := '';
ComponCatagoryStr := SCSComponent.GetPropertyValueBySysName(pnCategory);
ListOwner:=nil;
SCSComponent.LoadWholeLength;
// ListName := '';
FirstComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.FirstIDCompon);
LastComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.LastIDCompon);
LoadPortName(SCSComponent.FirstIDConnectedConnCompon, SCSComponent.FirstIDCompon, FromNppPort, FromPortName, @FromPort, @FromNppPortFromPos, @FromNppPortToPos);
LoadPortName(SCSComponent.LastIDConnectedConnCompon, SCSComponent.LastIDCompon, ToNppPort, ToPortName, @ToPort, @ToNppPortFromPos, @ToNppPortToPos);
if AResRepFormMode = fmRCableJournal then
begin
{ if (FirstComponent <> nil) and (LastComponent <> nil) then
begin
if FirstComponent.ListID = LastComponent.ListID then
ListName := GetListName(FirstComponent)
else
ListName := GetListName(FirstComponent) + '/' + GetListName(LastComponent);
end;
}
MemTable_RCableJournal.Append;
MemTable_RCableJournal.FieldByName(fnNameList).AsString := ListName;
MemTable_RCableJournal.FieldByName(fnNameCable).AsString := SCSComponent.GetNameForVisible(false); //GetComponNameForVisible(Component.Name, Component.NameMark);
MemTable_RCableJournal.FieldByName(fnName).AsString := SCSComponent.Name;
MemTable_RCableJournal.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
//MemTable_RCableJournal.FieldByName(fnMarkID).AsString := IntToStr(SCSComponent.MarkID);
MemTable_RCableJournal.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
MemTable_RCableJournal.FieldByName(fnCategory).AsString := ComponCatagoryStr;
if CheckPriceTransformToUOMByCompType(@SCSComponent.ComponentType) then
begin
MemTable_RCableJournal.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
MemTable_RCableJournal.FieldByName(fnLength).AsFloat := FloatInUOM(SCSComponent.Length, umMetr, TF_Main(GForm).FUOM);
MemTable_RCableJournal.FieldByName(fnLengthReserv).AsFloat := RoundCP(FloatInUOM(SCSComponent.LengthReserv, umMetr, TF_Main(GForm).FUOM));
//MemTable_RCableJournal.FieldByName(fnLength).AsString := FormatFloat(ffMask, FloatInUOM(SCSComponent.Length, umMetr, TF_Main(GForm).FUOM));
end
else
begin
MemTable_RCableJournal.FieldByName(fnIzm).AsString := SCSComponent.Izm;
MemTable_RCableJournal.FieldByName(fnLength).AsFloat := SCSComponent.Length;
MemTable_RCableJournal.FieldByName(fnLengthReserv).AsFloat := RoundCP(SCSComponent.LengthReserv);
//MemTable_RCableJournal.FieldByName(fnLength).AsString := FormatFloat(ffMask, SCSComponent.Length);
end;
// changed by Tolik
// MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := GetNameTo(SCSComponent.FirstConnectedConnCompon, FirstComponent, FromNppPort, FromPortName, FromPort, FromNppPortFromPos, FromNppPortToPos); //GetNameFrom(SCSComponent.FirstConnectedConnCompon);
// маркировка начального объекта на пути кабеля
try
s:='';
if SCSComponent.FirstConnectedConnCompon.GetTopComponent.NameMark <>'' then // если есть маркировка шкафа(или кроса или что там еще)
s := SCSComponent.FirstConnectedConnCompon.GetTopComponent.NameMark;
if s = '' then
begin
if SCSComponent.FirstConnectedConnCompon.NameMark <> '' then // если нет - ищем маркировку порта
s := SCSComponent.FirstConnectedConnCompon.NameMark;
end;
if s = '' then
begin
if SCSComponent.FirstConnectedConnCompon.GetParentComponent.NameMark<>'' then // если нет - ищем маркировку патч -панели
begin
s := SCSComponent.FirstConnectedConnCompon.GetParentComponent.NameMark;
end;
end;
if s = '' then // если нет - пишем имя шкафа
begin
s := SCSComponent.FirstConnectedConnCompon.GetTopComponent.Name + ' '+inttostr(SCSComponent.FirstConnectedConnCompon.GetTopComponent.MarkID)
end;
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := s;
except
// если ошибка - берем имя топ компонента и номер
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := SCSComponent.FirstConnectedConnCompon.GetTopComponent.Name + ' '+inttostr(SCSComponent.FirstConnectedConnCompon.GetTopComponent.MarkID);
end;
//
MemTable_RCableJournal.FieldByName(fnNameTo).AsString := GetNameTo(SCSComponent.LastConnectedConnCompon, LastComponent, ToNppPort, ToPortName, ToPort, ToNppPortFromPos, ToNppPortToPos);
MemTable_RCableJournal.FieldByName(fnPortNameFrom).AsInteger := FromNppPort1;
MemTable_RCableJournal.FieldByName(fnPortTypeFrom).AsString := FromPortName;
//
// MemTable_RCableJournal.FieldByName(fnPortNameTo).AsInteger := ToNppPort;
MemTable_RCableJournal.FieldByName(fnPortNameTo).AsInteger := ToNppPort;
//changed by Tolik
// если у подключаемого модуля есть маркировка - выводим,
// если нет - ищем раркировку верхнего объекта модуля
// если и ее нет - пишем имя верхнего объекта модуля
// MemTable_RCableJournal.FieldByName(fnPortTypeTo).AsString := ToPortName;
s:='';
if SCSComponent.LastConnectedConnCompon.NameMark<>'' then
s := SCSComponent.LastConnectedConnCompon.NameMark;
if s='' then
begin
if SCSComponent.LastConnectedConnCompon.GetTopComponent.NameMark<>'' then
s := SCSComponent.LastConnectedConnCompon.GetParentComponent.NameMark;
end;
if s='' then
begin
s :=SCSComponent.LastConnectedConnCompon.GetTopComponent.Name + ' ' + inttostr(SCSComponent.LastConnectedConnCompon.GetTopComponent.MarkID);
end;
MemTable_RCableJournal.FieldByName(fnPortTypeTo).AsString := s;
//
//added by Tolik
MemTable_RCableJournal.FieldValues[fnMarks]:=propList.Text; // маркировка объектов по пути кабеля
MemTable_RCableJournal.FieldValues[fnPrices]:=propList1.Text; // длины линейных компонент по пути кабеля
//
MasterID := MemTable_RCableJournal.FieldByName(fnID).AsInteger;
MemTable_RCableJournal.Post;
end
else
if AResRepFormMode = fmRGOSTCableJournal then
begin
if FirstComponent <> nil then
begin
ListName := GetListName(FirstComponent);
RoomOwner := GetComponObjectOwnerByItemType(FirstComponent, itRoom);
if RoomOwner <> nil then
ListName := ListName + '. '+ RoomOwner.GetNameForVisible;
end;
//*** Определить шаблон мркировки
ComponMarkTemplate := '';
ListOwner := nil;
if FirstComponent <> nil then
ListOwner := FirstComponent.GetListOwner
else
if LastComponent <> nil then
ListOwner := LastComponent.GetListOwner
else
ListOwner := SCSComponent.GetListOwner;
if ListOwner <> nil then
SprComponentType := ListOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
if SprComponentType <> nil then
ComponMarkTemplate := SprComponentType.ComponentType.MarkMask;
//*** Удалить обозначение из
if ComponMarkTemplate <> '' then
if Pos(mteNameShort, ComponMarkTemplate) <> 0 then
Delete(ComponMarkTemplate, Pos(mteNameShort, ComponMarkTemplate), Length(mteNameShort));
MemTable_RCableJournal.Append;
//MemTable_RCableJournal.FieldByName(fnMarkID).AsString := TF_Main(SCSComponent.ActiveForm).MakeNameMarkComponent(SCSComponent, SCSComponent.GetFirstParentCatalog, false, ComponMarkTemplate); // номер кабеля
MemTable_RCableJournal.FieldByName(fnNameMark).AsString := TF_Main(SCSComponent.ActiveForm).MakeNameMarkComponent(SCSComponent, SCSComponent.GetFirstParentCatalog, false, ComponMarkTemplate); // номер кабеля
MemTable_RCableJournal.FieldByName(fnComponentIndex).AsInteger := SCSComponent.MarkID;
MemTable_RCableJournal.FieldByName(fnNameCable).AsString := SCSComponent.NameShort; //Тип кабеля
//changed by Tolik
MemTable_RCableJournal.FieldByName(fnNameTo).AsString := GetMultiPortNameMark(SCSComponent.LastConnectedConnCompon, true); // Номер комутационной панели
MemTable_RCableJournal.FieldByName(fnPortNameTo).AsString := IntToStr(ToNppPort); // Номер порта панели
MemTable_RCableJournal.FieldByName(fnNameList).AsString := ListName; // Откуда приходит
MemTable_RCableJournal.FieldByName(fnNameFrom).AsString := GetMultiPortNameMark(SCSComponent.FirstConnectedConnCompon, true); // Номер розетки
MemTable_RCableJournal.FieldByName(fnPortNameFrom).AsString := IntToStr(FromNppPort1);
// MemTable_RCableJournal.FieldByName(fnPortNameFrom).AsString := IntToStr(FromNppPort); // номер порта розетки
MasterID := MemTable_RCableJournal.FieldByName(fnID).AsInteger;
MemTable_RCableJournal.Post;
end;
end;
for j := 0 to SCSComponent.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := SCSComponent.WholeComponent.Items[j];
ListWithLookedCompons.Add(ptrID);
end;
end;
end;
end;
end;
end;
end;
end;
//*** Сортировка
//if AResRepFormMode = fmRCableJournal then
// MemTable_RCableJournal.SortOn(fnMarkID, [])
//else
//if AResRepFormMode = fmRGOSTCableJournal then
// MemTable_RCableJournal.SortOn(fnMarkID, []);
//MemTable_RCableJournal.SortOn(fnMarkID, []);
SortMemTableByParams(MemTable_RCableJournal, AParams, nil);
finally
EndProgress;
FreeList(ListWithLookedCompons);
end;
end; // end else
// Если требуется посчитать расход кабеля из катушек
// то посчитаем
if not cbNone.Checked then
begin
if cbMaxScrapRate.Checked then
CableReelCalculate(CableTypes, 'MaxScrapRate',ReelsCableFlow, Self);
if cbMaxEfficiency.Checked then
CableReelCalculate(CableTypes, 'MaxEfficiency',ReelsCableFlow, Self);
CableReelNamesToMemTable(MemTable_RCableJournal,CableTypes);
end
// если нет - сбросим результаты предидущих расчетов,
// в случае наличия таковых
else
begin
if ReelsCableFlow <> nil then
ReelsCableFlow.Clear
else
// нет строк для отчета - создаем пустой список ()
ReelsCableFlow := TStringList.Create;
end;
FreeCableTypes(CableTypes);
GFormMode := AResRepFormMode;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderJoining: '+E.Message + 'i = '+ inttostr(i));
end;
end
// Tolik
// Кабельно-трубный журнал по ДСТУ Б А.2.4-21:2008 (форма 8)
else
begin
AllAllTraceLength := 0;
FCatalog := AFolder;
//ComponList := TSCSComponents.Create(false);
{ MemTable_RCableJournal.FieldDefs.Clear;
MemTable_RCableJournal.FieldDefs.Add(fnID, ftAutoInc);
MemTable_RCableJournal.FieldDefs.Add(fnTraceCabling, ftString, 255); // участок трассы, кабеля
MemTable_RCableJournal.FieldDefs.Add(fnName, ftString, 255); // обозначение кабеля
MemTable_RCableJournal.FieldDefs.Add(fnNameMark, ftString, 255); // марка
MemTable_RCableJournal.FieldDefs.Add(fnNameFrom, ftString, 255); // начало
MemTable_RCableJournal.FieldDefs.Add(fnNameTo, ftString, 255); // конец
MemTable_RCableJournal.FieldDefs.Add(fnTotalKolvo, ftString, 255); // количество, число и сечение жил
MemTable_RCableJournal.FieldDefs.Add(fnNotice, ftString, 255); // примечание (можно использовать как альтернативную маркировку)
MemTable_RCableJournal.FieldDefs.Add(fnLength, ftFloat); // Длина, м
MemTable_RCableJournal.FieldDefs.Add(fnNameBegin, ftString, 255); // парент каталог начала
MemTable_RCableJournal.FieldDefs.Add(fnNameEnd, ftString, 255); // парент каталог конца
MemTable_RCableJournal.Close;
MemTable_RCableJournal.Open; }
try
if ((AFolder.ItemType = itList) or (AFolder.ItemType = itProject)) then
begin
ComponList := TSCSComponents.Create(false);
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
SCSComponent := AFolder.ComponentReferences[i];
// по типу сети
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1)) then
begin
if GCableCompTypes.IndexOf(SCSComponent.ComponentType.SysName) <> -1 then
begin
if ComponList.IndexOf(SCSComponent) = -1 then
begin
if SCSComponent.IsLine = bitrue then
begin
if IsCableComponent(SCSComponent) then
begin
ComponList.Add(SCSComponent);
FirstComponent := nil;
LastComponent := nil;
SaveTracedCable(SCSComponent);
end;
end;
end;
end;
end;
end;
// FreeAndNil(ComponList);
end;
AllAllTraceLength := 0;
SortMemTableByParams(MemTable_RCableJournal, AParams, nil);
FreeAndNil(ComponList);
GFormMode := AResRepFormMode;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderJoining: '+E.Message);
end;
end;
end;
// расширенный кабельный журнал
procedure TF_ResourceReport.ShowFolderCableJournalExt(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents, ACanHaveDismountAccount, AFullPath: Boolean);
var LookedCompons: TSCSComponents;
ptrID: ^Integer;
i, j, k, l, m, n, p, q, r, x: Integer;
CurrCompon: TSCSComponent;
ComponSignType: Integer;
ptrJoinedComponents: PJoinedComponents;
ChangeFirstLast: Boolean;
FirstConComponents: TSCSComponents;
LastConComponents: TSCSComponents;
BuffComponents: TSCSComponents;
FirstConCompon: TSCSComponent;
LastConCompon: TSCSComponent;
FirstLineCompon: TSCSComponent;
LastLineCompon: TSCSComponent;
PrevLineCompon: TSCSComponent;
CurrLineCompon: TSCSComponent;
PrevRowCompon: TSCSComponent;
CurrRowCompon: TSCSComponent;
LeftCompon: TSCSComponent;
RightCompon: TSCSComponent;
CurrRowComponObject: TSCSCatalog;
LeftComponObject: TSCSCatalog;
RightComponObject: TSCSCatalog;
BuffCompon: TSCSComponent;
BuffObject: TSCSCatalog;
BuffList: TList;
FirstObject: TSCSCatalog;
LastObject: TSCSCatalog;
InterfCount1: Integer;
InterfCount2: Integer;
ParallelInterfaces: TInterfLists;
JoinedInterfaces: TInterfLists;
JoinedInterfacesLeft: TInterfLists;
JoinedInterfacesRight: TInterfLists;
SideCompon1Left: Integer;
SideCompon2Left: Integer;
SideCompon1Right: Integer;
SideCompon2Right: Integer;
InterfacesLeft: TSCSInterfaces;
InterfacesLeftPoint: TSCSInterfaces;
InterfacesLeftJoinedToPoint: TSCSInterfaces;
InterfacesRight: TSCSInterfaces;
InterfacesRightPoint: TSCSInterfaces;
InterfacesRighJoinedToPoint: TSCSInterfaces;
InterfJoinedCount: Integer;
NppPortsLeft: TIntList;
NppPortsRight: TIntList;
NppPortsCount: Integer;
ptrWeld: PInterfLists;
ptrWeldFirst: PInterfLists;
ptrWeldLast: PInterfLists;
ptrBuffWeld: PInterfLists;
WeldList: Tlist;
InterfCount: Integer;
ptrInterfFirst: TSCSInterface;
ptrInterfLast: TSCSInterface;
ptrlineInterfFirst: TSCSInterface;
ptrLineInterfLast: TSCSInterface;
ptrPortFirst: TSCSInterface;
ptrPortLast: TSCSInterface;
CurrRow: TSCSComponents;
DeviceName: String;
DeviceNameSecond: String;
DeviceNameThird: String;
DeviceNameFourth: String;
ElementName: String;
NppPort: Integer;
CableDiametr: Double;
ShowDevNameFrom: Boolean;
ShowDevNameTo: Boolean;
// added by Tolik
currTrace,NextTrace: TFigure; // трассы, по которым проходит кабель
currLine: TOrthoLine; // текущая трасса
propList, propList1: TstringList; // propList - список трасс по маршруту кабеля, propList1 - длины кусков кабеля соответственно
FirstTraceFound, NextTraceFound: Boolean; // две соседние трассы
Figure: TFigure;
Ortholine: TOrtholine;
Connector1, Connector2, Connector3, Connector4: TConnectorObject; // коннекторы трасс
Compon1, Compon2, Compon3, Compon4: TSCSComponent; // компоненты, сидящие на коннекторах трасс
s: string;
currSCSCatalog, nextSCSCatalog: TSCSCatalog;
PartSCSComponent1,PartSCSComponent2: TSCScomponent;
ListName: string;
ComponList: TSCSComponents;
FromNppPort1: integer;
ListOwner: TSCSList;
TraceListOwner : TSCSList;
ListCAD : TF_CAD;
FirstCompon, LastCompon : TSCSComponent;
PortCountFrom, PortCountTo: Integer;
// Tolik
MasterID: Integer;
//
{
// украдено у Игоря by Tolik из TSCSComponent.DefineFirstLast (модуль U_SCSComponent)
// правда, немножко переделано совсем
Procedure SetActualOrderInPartComponent(aComponent: TSCSComponent; ComponList : TSCSComponents; FromNppPort1 : integer);
Var
Component : TSCSComponent;
SortedWholeComponent: TIntList;
my_comp, ComponentToOrder: TSCSComponent;
StepComponent: TSCSComponent;
JoinedComponent: TSCSComponent;
i, j: Integer;
portcount1, portcount2 : integer;
ListOwner: TSCSList;
EndPointCad : TF_CAD;
PointComponent : TSCSComponent;
SCSCatalog : TSCSCatalog;
SCSInterfaces: TSCSInterfaces;
Begin
Component := aComponent;
// SCSCatalogs := TSCSCatalogs.Create(false);
SortedWholeComponent := TIntList.Create;
Component.DefineFirstLast;
ComponentToOrder := nil;
ListOwner := Component.GetListOwner;
my_comp := Component.FirstConnectedConnCompon.GetTopComponent;
if my_comp<>nil then
begin
SCSInterfaces := my_comp.GetInterfacesByIsPort(1, True, -1, nil);
portcount1 := SCSInterfaces.Count;
my_comp := Component.LastConnectedConnCompon.GetTopComponent;
SCSInterfaces := my_comp.GetInterfacesByIsPort(1, True, -1, nil);
portcount2 := SCSInterfaces.Count;
ComponentToOrder := Component.FirstConnectedConnCompon;
// Сразу же определяем порядок листов для отчета
// и порт шкафа
begin
if Component.FirstConnectedConnCompon.ListID = Component.LastConnectedConnCompon.ListID then
ListName := GetListName(Component.FirstConnectedConnCompon)
else
begin
if Portcount1 >= PortCount2 then
ListName := GetListName(Component.FirstConnectedConnCompon)+'/'+GetListName(Component.LastConnectedConnCompon)
else
ListName := GetListName(Component.LastConnectedConnCompon)+'/'+GetListName(Component.FirstConnectedConnCompon);
end;
end;
if PortCount1 >= PortCount2 then
ComponentToOrder := Component.FirstConnectedConnCompon
else
begin
ComponentToOrder := Component.LastConnectedConnCompon;
Component.LastConnectedConnCompon := Component.FirstConnectedConnCompon;
Component.FirstConnectedConnCompon := ComponentToOrder;
end;
FromNppPort1 := Component.FirstConnectedConnCompon.MarkID ;
if Component<> nil then
begin
for i := 0 to Component.WholeComponent.Count - 1 do
begin
for j := 0 to ComponentToOrder.JoinedComponents.Count - 1 do
begin
StepComponent := ComponentToOrder.JoinedComponents[j];
if ((SortedWholeComponent.IndexOf(StepComponent.ID)= -1) and (Component.WholeComponent.IndexOf(StepComponent.ID)<> -1)) then
begin
SortedWholeComponent.Add(StepComponent.ID);
ComponList.Add(StepComponent);
ComponentToOrder := StepComponent;
SCSCatalog := StepComponent.GetFirstParentCatalog;
break;
end;
end;
end;
end;
ComponentToOrder := Component;
//*** Не один участок кабеля не ушел в пизду
if ComponentToOrder.WholeComponent.Count = SortedWholeComponent.Count then
begin
ComponentToOrder.WholeComponent.Clear;
ComponentToOrder.WholeComponent.Assign(SortedWholeComponent);
end;
SortedWholeComponent.Free;
end;
End;
// }
function GetDeviceName(AComponents: TSCSComponents): String;
var TopCompon: TSCSComponent;
i: Integer;
begin
Result := '';
if Not Assigned(AComponents) then
Exit; ///// EXIT ////
TopCompon := nil;
if AComponents.Count > 0 then
TopCompon := AComponents[0].GetTopComponent;
for i := 0 to AComponents.Count - 1 do
if AComponents[i].GetTopComponent <> TopCompon then
Exit; ///// EXIT /////
if Assigned(TopCompon) then
Result := GetComponNameForVisible(TopCompon.NameShort, IntTostr(TopCompon.MarkID));
//TopCompon := ACompon.GetTopComponent;
//if Assigned(TopCompon) then
// Result := TF_Main(GForm).GetComponNameForVisible(TopCompon.NameShort, IntTostr(TopCompon.MarkID));
end;
procedure GetDeviceAndElementNamesByLineComponInterfaces(ACompon: TSCSComponent; AInterfaces: TList;
var ADevName, ADevNameSecond, ADevNameThird, ADevNameFourth, AElementName: String);
var
i: integer;
CurrPointInterfaces: TSCSInterfaces;
PointComponsInterfaces: TSCSInterfaces;
PointCompon: TSCSComponent;
PointComponents: TSCSComponents;
TopComponent: TSCSComponent;
PointTopComponents: TSCSComponents;
//PathToDepthComponent: TSCSComponent;
DevicePath: TStringList;
CurrCompon: TSCSComponent;
InternalConnComponPath: TSCSComponents;
InterrnalJoinedInterfaces: TSCSInterfaces;
InternalJoinedCompon, PrevInternalJoinedCompon: TSCSComponent;
NppFrom, NppTo: Integer;
begin
ADevName := '';
ADevNameSecond := '';
ADevNameThird := '';
ADevNameFourth := '';
AElementName := '';
if Assigned(ACompon) and Assigned(AInterfaces) then
begin
PointComponsInterfaces := TSCSInterfaces.Create(false);
PointComponents := TSCSComponents.Create(false);
PointTopComponents := TSCSComponents.Create(false);
InternalConnComponPath := TSCSComponents.Create(false);
InterrnalJoinedInterfaces := TSCSInterfaces.Create(false);
for i := 0 to AInterfaces.Count - 1 do
begin
//01.08.2012 CurrPointInterfaces := ACompon.GetInterfacesConnectedToConnCompon(AInterfaces[i], nil, nil);
CurrPointInterfaces := ACompon.GetInterfacesConnectedToConnCompon(AInterfaces[i], InternalConnComponPath, InterrnalJoinedInterfaces);
if Assigned(CurrPointInterfaces) then
begin
PointComponsInterfaces.Assign(CurrPointInterfaces, laOr);
CurrPointInterfaces.Free;
end;
end;
for i := 0 to PointComponsInterfaces.Count - 1 do
begin
PointCompon := TSCSComponent(TSCSInterface(PointComponsInterfaces[i]).ComponentOwner);
if PointComponents.IndexOf(PointCompon) = -1 then
if CheckCanLookComponInReportCable(PointCompon, ACanHaveDismountAccount) then
PointComponents.Add(PointCompon);
end;
for i := 0 to PointComponents.Count - 1 do
begin
TopComponent := PointComponents[i].GetTopComponent;
if PointTopComponents.IndexOf(TopComponent) = -1 then
PointTopComponents.Add(TopComponent);
end;
//*** Имя устройства c учетом полного пути
if Not AFullPath then
begin
if PointTopComponents.Count > 0 then
ADevName := PointTopComponents[0].NameMark; //PointTopComponents[0].NameShort + IntToStr(PointTopComponents[0].MarkID);
end
else
if PointComponents.Count > 0 then
begin
{CurrCompon := PointComponents[0];
while CurrCompon <> nil do
begin
if CurrCompon <> PointComponents[0] then
begin
if ADevName <> '' then
ADevName := '\' + ADevName;
ADevName := CurrCompon.NameMark + ADevName;
end;
CurrCompon := CurrCompon.GetParentComponent;
end;}
DevicePath := TStringList.Create;
//*** Сосзать список из пути компоненты в нормальном порядке
//04.02.2013
//CurrCompon := PointComponents[0];
//while CurrCompon <> nil do
//begin
// if CurrCompon <> PointComponents[0] then
// DevicePath.Insert(0, CurrCompon.NameMark);
// CurrCompon := CurrCompon.GetParentComponent;
//end;
//04.02.2013
CurrCompon := InternalConnComponPath[0]; // компонент к которому подключен кабель
while CurrCompon <> nil do
begin
if CurrCompon <> InternalConnComponPath[0] then
DevicePath.Insert(0, CurrCompon.NameMark);
CurrCompon := CurrCompon.GetParentComponent;
end;
//*** По списку определить элементы подключенного устройства
for i := 0 to DevicePath.Count - 1 do
begin
if i = 0 then
ADevName := DevicePath[i]
else
if i = 1 then
ADevNameSecond := DevicePath[i]
else
if i = 2 then
ADevNameThird := DevicePath[i]
else
if i >= 3 then
begin
if ADevNameFourth <> '' then
ADevNameFourth := ADevNameFourth + '\';
ADevNameFourth := ADevNameFourth + DevicePath[i];
end;
end;
FreeAndNil(DevicePath);
end;
//01.08.2012
if AFullPath and (InternalConnComponPath.Count > 0) then
begin
PrevInternalJoinedCompon := nil;
for i := 0 to InternalConnComponPath.Count - 1 do
begin
InternalJoinedCompon := TSCSComponent(InternalConnComponPath[i]);
//04.02.2013 отображаем номер порта пред. внутреннего компонента, к которому пдключен InternalJoinedCompon
if PrevInternalJoinedCompon <> nil then
if GetPortInfoByJoinedCompons(PrevInternalJoinedCompon, InternalJoinedCompon, NppFrom, NppTo) then
begin
if NppFrom = NppTo then
AElementName := AElementName +' ('+cNamePort+' '+IntToStr(NppFrom)+')'
else
AElementName := AElementName +' ('+cNamePort+' '+IntToStr(NppFrom)+'-'+IntToStr(NppTo)+')';
end;
if i > 0 then
AElementName := AElementName +#13;
AElementName := AElementName + InternalJoinedCompon.NameMark;
PrevInternalJoinedCompon := InternalJoinedCompon; //04.02.2013
end;
end
else
begin
if PointComponents.Count > 0 then
AElementName := PointComponents[0].NameMark; //PointComponents[0].NameShort + IntToStr(PointComponents[0].MarkID);
end;
InterrnalJoinedInterfaces.Free;
InternalConnComponPath.Free;
PointComponents.Free;
PointTopComponents.Free;
PointComponsInterfaces.Free;
end;
end;
function DefineSidePorts(aIdx: Integer; aInterfacesSide, aInterfacesSidePoint, aInterfacesSideJoinedToPoint: TSCSInterfaces): TIntList;
begin
Result := nil;
if ((InterfacesLeft.Count - 1) >= aIdx) and ((aInterfacesSidePoint.Count - 1) >= aIdx) then
if aInterfacesSidePoint[aIdx].PortOwner <> nil then
begin
Result := GetNppPortsByConnected(aInterfacesSidePoint[aIdx].PortOwner, aInterfacesSidePoint[p], aInterfacesSideJoinedToPoint[0]);
//if Result.Count > NppPortsCount then
// NppPortsCount := Result.Count;
end
else
if aInterfacesSidePoint[aIdx].IsPort = biTrue then
begin
//Result := TIntList.Create;
//Result.Add(aInterfacesSidePoint[aIdx].NppPort);
Result := GetNppPortsByConnected(aInterfacesSidePoint[aIdx], aInterfacesSidePoint[aIdx], aInterfacesSideJoinedToPoint[0]);
end;
if Assigned(Result) then
if Result.Count > NppPortsCount then
NppPortsCount := Result.Count;
end;
function GetDeviceNameByInterface(AInterface: TSCSInterface): String;
var ComponOwner: TSCSComponent;
TopComponent: TSCSComponent;
begin
if AInterface <> nil then
if Assigned(AInterface.ComponentOwner) then
begin
ComponOwner := TSCSComponent(AInterface.ComponentOwner);
TopComponent := ComponOwner.GetTopComponent;
if Assigned(TopComponent) then
Result := TopComponent.NameShort + IntToStr(TopComponent.MarkID);
end;
end;
function GetElementName(ACompon: TSCSComponent): String;
begin
Result := '';
if Not Assigned(ACompon) then
Exit; ///// EXIT ////
Result := ACompon.NameMark; //GetComponNameForVisible(ACompon.NameShort, IntTostr(ACompon.MarkID));
end;
function GetElementNameByInterface(AInterface: TSCSInterface): String;
var ComponOwner: TSCSComponent;
begin
if AInterface <> nil then
if Assigned(AInterface.ComponentOwner) then
begin
ComponOwner := TSCSComponent(AInterface.ComponentOwner);
Result := ComponOwner.NameMark; //ComponOwner.NameShort + IntToStr(ComponOwner.MarkID);
end;
end;
function GetWelding(AInterfList: TSCSInterfaces): String;
var i: Integer;
Interfac: TSCSInterface;
ComponOwner: TSCSComponent;
begin
Result := '';
if Assigned(AInterfList) then
for i := 0 to AInterfList.Count - 1 do
begin
if i > 0 then
Result := Result + #10+#13;
Interfac := AInterfList[i];
ComponOwner := TSCSComponent(Interfac.ComponentOwner);
if Assigned(ComponOwner) then
Result := Result + ComponOwner.NameShort + IntToStr(ComponOwner.MarkID);
end;
end;
function GetNumThreads(AInterfList: TSCSInterfaces): String;
var i: Integer;
Interfac: TSCSInterface;
begin
Result := '';
if Assigned(AInterfList) then
for i := 0 to AInterfList.Count - 1 do
begin
if i > 0 then
Result := Result + #10+#13;
Interfac := AInterfList[i];
Result := Result + IntToStr(Interfac.Npp);
end;
end;
begin
try
if (TF_Main(GForm).GDBMode <> bkProjectManager) or Not(Assigned(AFolder)) then
Exit; ///// EXIT //////
if Not CheckCanShowReport(AFolder) then
Exit; //// EXIT ////
FCatalog := AFolder;
mtRCableJournalInterfaces.Active := false;
MemTable_RCableJournalExt.Active := false;
mtRCableJournalInterfaces.MasterSource := DataSource_MT_RCableJournalExt;
mtRCableJournalInterfaces.DetailFields := fnIDMaster;
mtRCableJournalInterfaces.MasterFields := fnID;
MemTable_RCableJournalExt.Active := true;
mtRCableJournalInterfaces.Active := true;
LookedCompons := TSCSComponents.Create(false);
BeginProgress(pcPreparingReport);
try
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
CurrCompon := AFolder.ComponentReferences[i];
if Assigned(CurrCompon) then
//Tolik
// if {CurrCompon.IsLine = biTrue} CheckSysNameIsCable(CurrCompon.ComponentType.SysName) then // так было
// проверка на тип сети
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(CurrCompon.GUIDNetType) <> -1)) then
begin
//if {CurrCompon.IsLine = biTrue} (CheckSysNameIsCable(CurrCompon.ComponentType.SysName) and
if (isCableComponent(CurrCompon) and
//
// (not (CurrCompon.IDNetType in [3,4,5,7]))) then
(((not (CurrCompon.IDNetType in [3,{4,}5,7])) and AllNetTypes) or (not AllNetTypes))) then
//
begin
ComponSignType := CurrCompon.GetPropertyValueAsInteger(pnSignType);
if (LookedCompons.IndexOf(CurrCompon) = -1) and
((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) then
if CurrCompon.HaveInterfaceByType(itFunctional) then
begin
CurrCompon.RefreshWholeLengthIfNecessary;
// added by Tolik
ComponList := TSCSComponents.create(false);
SetActualOrderInPartComponent(CurrCompon, ComponList, FromNppPort1, ListName);
propList:=TStringList.Create;
propList1:=TStringList.Create;
GetCablePath(CurrCompon, propList, propList1,ComponList);
CurrCompon.LoadNet;
CurrCompon.DefineLengthsOfNetThreads;
for j := 0 to CurrCompon.Net.Count - 1 do
begin
ptrJoinedComponents := CurrCompon.Net[j];
if Not ACanHaveDismountAccount or Not CheckHaveComponentDismountedInList(ptrJoinedComponents.JoinedLines) then
for k := 0 to ptrJoinedComponents.FirstConnCompons.Count - 1 do
if Assigned(ptrJoinedComponents.FirstConnCompons[k]) and
CheckCanLookComponInReportCable(ptrJoinedComponents.FirstConnCompons[k], ACanHaveDismountAccount) then
for l := 0 to ptrJoinedComponents.LastConnCompons.Count - 1 do
if Assigned(ptrJoinedComponents.LastConnCompons[l]) and
CheckCanLookComponInReportCable(ptrJoinedComponents.LastConnCompons[l], ACanHaveDismountAccount) then
begin
FirstConComponents := ptrJoinedComponents.FirstConnCompons;
LastConComponents := ptrJoinedComponents.LastConnCompons;
FirstConCompon := ptrJoinedComponents.FirstConnCompons[k];
LastConCompon := ptrJoinedComponents.LastConnCompons[l];
FirstLineCompon := ptrJoinedComponents.First;
LastLineCompon := ptrJoinedComponents.Last;
//*** Определить Исходящие и входящие объекты
ChangeFirstLast := false;
FirstObject := FirstConCompon.GetFirstParentCatalog;
LastObject := LastConCompon.GetFirstParentCatalog;
InterfCount1 := 0;
InterfCount2 := 0;
if Assigned(FirstObject) then
InterfCount1 := FirstObject.GetInterfaceCount([itFunctional]);
if Assigned(LastObject) then
InterfCount2 := LastObject.GetInterfaceCount([itFunctional]);
if InterfCount1 > InterfCount2 then
begin
ChangeFirstLast := true;
BuffComponents := FirstConComponents;
FirstConComponents := LastConComponents;
LastConComponents := BuffComponents;
BuffCompon := FirstConCompon;
FirstConCompon := LastConCompon;
LastConCompon := BuffCompon;
BuffCompon := FirstLineCompon;
FirstLineCompon := LastLineCompon;
LastLineCompon := BuffCompon;
BuffObject := FirstObject;
FirstObject := LastObject;
LastObject := BuffObject;
ptrJoinedComponents.JoinedLines.Rotate;
end;
PrevRowCompon := nil;
CurrRowCompon := nil;
// From Left(first) To Right(Last)
//if FirstLineCompon.Whole_ID <> LastLineCompon.Whole_ID then
begin
for m := 0 to ptrJoinedComponents.JoinedLines.Count - 1 do
if LookedCompons.IndexOf(ptrJoinedComponents.JoinedLines[m]) = -1 then
begin
PrevRowCompon := CurrRowCompon;
CurrRowCompon := ptrJoinedComponents.JoinedLines[m];
LeftCompon := nil;
RightCompon := nil;
if Assigned(PrevRowCompon) then
if PrevRowCompon.Whole_ID <> CurrRowCompon.Whole_ID then
LeftCompon := PrevRowCompon;
if Not Assigned(PrevRowCompon) then
LeftCompon := FirstConCompon;
//*** Компонент слева определен ?
if Assigned(LeftCompon) then
begin
if m < ptrJoinedComponents.JoinedLines.Count - 1 then
for n := m+1 to ptrJoinedComponents.JoinedLines.Count - 1 do
if CurrRowCompon.Whole_ID <> ptrJoinedComponents.JoinedLines[n].Whole_ID then
RightCompon := ptrJoinedComponents.JoinedLines[n]
else
if n = ptrJoinedComponents.JoinedLines.Count - 1 then
RightCompon := LastConCompon;
if m = ptrJoinedComponents.JoinedLines.Count - 1 then
RightCompon := LastConCompon;
end;
//*** Определены подключенные компоненты слева и справа
if Assigned(LeftCompon) and Assigned(RightCompon) then
begin
CurrRowCompon.LoadWholeComponent(false);
CurrRowCompon.LoadWholeLength;
CurrRowComponObject := CurrRowCompon.GetFirstParentCatalog;
LeftComponObject := LeftCompon.GetFirstParentCatalog;
RightComponObject := RightCompon.GetFirstParentCatalog;
SideCompon1Left := -1;
SideCompon2Left := -1;
SideCompon1Right := -1;
SideCompon2Right := -1;
if Assigned(CurrRowComponObject) and Assigned(LeftComponObject) and Assigned(RightComponObject) then
begin
GetSidesByConnectedFigures(CurrRowComponObject.ListID, LeftComponObject.ListID, CurrRowComponObject.SCSID, LeftComponObject.SCSID, SideCompon1Left, SideCompon2Left);
GetSidesByConnectedFigures(CurrRowComponObject.ListID, RightComponObject.ListID, CurrRowComponObject.SCSID, RightComponObject.SCSID, SideCompon1Right, SideCompon2Right);
end;
//**** Side1-Left(First), Side2-Right(Last)
ParallelInterfaces := CurrRowCompon.GetInterfacesBySides;
if (SideCompon1Left = 2) {or (SideCompon1Right = 1)} then
begin
BuffList := ParallelInterfaces.InterfList2;
ParallelInterfaces.InterfList2 := ParallelInterfaces.InterfList1;
ParallelInterfaces.InterfList1 := BuffList;
end;
ShowDevNameFrom := false;
ShowDevNameTo := false;
MemTable_RCableJournalExt.Append;
MemTable_RCableJournalExt.FieldByName('NumCable').AsInteger := CurrRowCompon.MarkID;
MemTable_RCableJournalExt.FieldByName('CableData').AsString := CurrRowCompon.Name;
MemTable_RCableJournalExt.FieldByName('NameMark').AsString := CurrRowCompon.NameMark;
//added by Tolik
MemTable_RCableJournalExt.FieldValues[fnMarks]:=propList.Text; // маркировка объектов по пути кабеля
MemTable_RCableJournalExt.FieldValues[fnPrices]:=propList1.Text; // длины линейных компонент по пути кабеля
//
if CheckPriceTransformToUOMByCompType(@CurrRowCompon.ComponentType) then
begin
MemTable_RCableJournalExt.FieldByName(fnIzm).AsString := GetNameUOM(TF_Main(GForm).FUOM, true);
MemTable_RCableJournalExt.FieldByName(fnLength).AsFloat := FloatInUOM(CurrRowCompon.Length, umMetr, TF_Main(GForm).FUOM);
end
else
begin
MemTable_RCableJournalExt.FieldByName(fnIzm).AsString := CurrRowCompon.Izm;
MemTable_RCableJournalExt.FieldByName(fnLength).AsFloat := CurrRowCompon.Length;
end;
MemTable_RCableJournalExt.FieldByName('NumThread').AsInteger := 0;
MemTable_RCableJournalExt.FieldByName('From_Building').AsString := LeftCompon.GetListOwner.GetNameForVisible(false);
GetDeviceAndElementNamesByLineComponInterfaces(CurrRowCompon, ParallelInterfaces.InterfList1,
DeviceName, DeviceNameSecond, DeviceNameThird, DeviceNameFourth, ElementName);
if DeviceName = '' then
ShowDevNameFrom := true;
MemTable_RCableJournalExt.FieldByName(fnFromDevice).AsString := DeviceName; //GetDeviceName(FirstConComponents);
MemTable_RCableJournalExt.FieldByName(fnFromDeviceSecond).AsString := DeviceNameSecond;
MemTable_RCableJournalExt.FieldByName(fnFromDeviceThird).AsString := DeviceNameThird;
MemTable_RCableJournalExt.FieldByName(fnFromDeviceFourth).AsString := DeviceNameFourth;
//if LeftCompon.IsLine = biFalse then
MemTable_RCableJournalExt.FieldByName('From_Element').AsString := ElementName; //GetElementName(LeftCompon);
MemTable_RCableJournalExt.FieldByName('To_Building').AsString := RightCompon.GetListOwner.GetNameForVisible;
GetDeviceAndElementNamesByLineComponInterfaces(CurrRowCompon, ParallelInterfaces.InterfList2,
DeviceName, DeviceNameSecond, DeviceNameThird, DeviceNameFourth, ElementName);
if DeviceName = '' then
ShowDevNameTo := true;
MemTable_RCableJournalExt.FieldByName(fnToDevice).AsString := DeviceName; //GetDeviceName(LastConComponents);
MemTable_RCableJournalExt.FieldByName(fnToDeviceSecond).AsString := DeviceNameSecond;
MemTable_RCableJournalExt.FieldByName(fnToDeviceThird).AsString := DeviceNameThird;
MemTable_RCableJournalExt.FieldByName(fnToDeviceFourth).AsString := DeviceNameFourth;
//if RightCompon.IsLine = biFalse then
MemTable_RCableJournalExt.FieldByName('To_Element').AsString := ElementName; //GetElementName(RightCompon);
MemTable_RCableJournalExt.FieldByName('TraceCabling').AsString := CurrRowCompon.GetPropertyValueBySysName(pnTraceCabinig);
MemTable_RCableJournalExt.FieldByName('Sign').AsString := CurrRowCompon.NameShort + IntToStr(CurrRowCompon.MarkID);
MemTable_RCableJournalExt.FieldByName('Kolvo').AsInteger := 2;
//MemTable_RCableJournalExt.FieldByName('Diameter').AsFloat := Round3(CurrRowCompon.GetVolume(gtMale) * 10);
CableDiametr := CurrRowCompon.GetPropertyValueAsFloat(pnOutDiametr);
if CableDiametr <> 0 then
begin
CableDiametr := FLoatInUOM(CableDiametr, umMillimetr, ConvertUOMToMin(TF_Main(GForm).FUOM));
MemTable_RCableJournalExt.FieldByName(fnDiameter).AsFloat := Round2(CableDiametr);
end
else
MemTable_RCableJournalExt.FieldByName(fnDiameter).Value := null;
MemTable_RCableJournalExt.FieldByName('Note').AsString := CurrRowCompon.Notice;
MasterID := MemTable_RCableJournalExt.FieldByName(fnID).AsInteger;
MemTable_RCableJournalExt.Post;
for n := 0 to ParallelInterfaces.InterfList1.Count - 1 do
begin
ptrInterfFirst := ParallelInterfaces.InterfList1[n];
ptrInterfLast := ParallelInterfaces.InterfList2[n];
InterfacesLeftJoinedToPoint := TSCSInterfaces.Create(false);
InterfacesRighJoinedToPoint := TSCSInterfaces.Create(false);
InterfacesLeft := CurrRowCompon.GetInterfacesConnectedToInterfaceOtherCompon(ptrInterfFirst);
InterfacesLeftPoint := CurrRowCompon.GetInterfacesConnectedToConnCompon(ptrInterfFirst,
nil, InterfacesLeftJoinedToPoint);
//*** Если не нашлись интерфейсы, подключенные к компоненте в самой глуби
// находим подключенные от кабеля
if InterfacesLeftJoinedToPoint.Count = 0 then
begin
FreeAndNil(InterfacesLeftJoinedToPoint);
InterfacesLeftJoinedToPoint := CurrRowCompon.GetInterfacesConnectedToEndLineCompon(ptrInterfFirst);
end;
InterfacesRight := CurrRowCompon.GetInterfacesConnectedToInterfaceOtherCompon(ptrInterfLast);
InterfacesRightPoint := CurrRowCompon.GetInterfacesConnectedToConnCompon(ptrInterfLast,
nil, InterfacesRighJoinedToPoint);
// См коментарий для "if InterfacesLeftJoinedToPoint.Count = 0 then"
if InterfacesRighJoinedToPoint.Count = 0 then
begin
FreeAndNil(InterfacesRighJoinedToPoint);
InterfacesRighJoinedToPoint := CurrRowCompon.GetInterfacesConnectedToEndLineCompon(ptrInterfLast);
end;
//InterfacesLeft := ptrInterfFirst.ConnectedInterfaces;
//InterfacesRight := ptrInterfLast.ConnectedInterfaces;
if ((InterfacesLeft.Count > 0) or (InterfacesRight.Count > 0)) and
(InterfacesLeftPoint.Count > 0) and (InterfacesRightPoint.Count > 0) then
begin
InterfJoinedCount := 0;
//23.03.2009 if InterfacesLeftPoint.Count < InterfacesRightPoint.Count then
//23.03.2009 InterfJoinedCount := InterfacesLeftPoint.Count
//23.03.2009 else
//23.03.2009 InterfJoinedCount := InterfacesRightPoint.Count;
if InterfacesLeftPoint.Count > InterfacesRightPoint.Count then
InterfJoinedCount := InterfacesLeftPoint.Count
else
InterfJoinedCount := InterfacesRightPoint.Count;
for p := 0 to InterfJoinedCount - 1 do
begin
NppPortsCount := 1; // 1 чтобы след-й цикл отработал минимум одну итерацию
{//01.08.2012
NppPortsLeft := nil;
NppPortsRight := nil;
// Определяем списки номеров портов
if ((InterfacesLeft.Count - 1) >= p) and ((InterfacesLeftPoint.Count - 1) >= p) then
if InterfacesLeftPoint[p].PortOwner <> nil then
begin
NppPortsLeft := GetNppPortsByConnected(InterfacesLeftPoint[p].PortOwner, InterfacesLeftPoint[p], InterfacesLeftJoinedToPoint[0]);
if NppPortsLeft.Count > NppPortsCount then
NppPortsCount := NppPortsLeft.Count;
end;
if ((InterfacesRight.Count -1) >= p) and ((InterfacesRightPoint.Count - 1) >= p) then
if InterfacesRightPoint[p].PortOwner <> nil then
begin
NppPortsRight := GetNppPortsByConnected(InterfacesRightPoint[p].PortOwner, InterfacesRightPoint[p], InterfacesRighJoinedToPoint[0]);
if NppPortsRight.Count > NppPortsCount then
NppPortsCount := NppPortsRight.Count;
end;}
NppPortsLeft := DefineSidePorts(p, InterfacesLeft, InterfacesLeftPoint, InterfacesLeftJoinedToPoint);
NppPortsRight := DefineSidePorts(p, InterfacesRight, InterfacesRightPoint, InterfacesRighJoinedToPoint);
for q := 0 to NppPortsCount - 1 do
begin
mtRCableJournalInterfaces.Append;
// Tolik
mtRCableJournalInterfaces.FieldByName(fnIDMaster).AsInteger := MasterID; //MemTable_RCableJournalExt.FieldByName(fnID).AsInteger;
//
mtRCableJournalInterfaces.FieldByName('NumThread').AsInteger := ptrInterfFirst.Npp; // or ptrInterfLast
if (InterfacesLeftPoint.Count - 1) >= p then
begin
if ShowDevNameFrom then
mtRCableJournalInterfaces.FieldByName('From_Device').AsString := GetDeviceNameByInterface(InterfacesLeftPoint[p]);
mtRCableJournalInterfaces.FieldByName('From_Element').AsString := GetElementNameByInterface(InterfacesLeftPoint[p]);
end;
if ((InterfacesLeft.Count - 1) >= p) and
(TSCSComponent(TSCSInterface(InterfacesLeft[p]).ComponentOwner).IsLine = biTrue) then
begin
mtRCableJournalInterfaces.FieldByName('From_WeldingCable').AsString := GetWelding(InterfacesLeft);
mtRCableJournalInterfaces.FieldByName('From_NumThread').AsString := GetNumThreads(InterfacesLeft);
end
else
if ((InterfacesLeftPoint.Count - 1) >= p) and
(InterfacesLeftPoint[p].ComponentOwner.IsLine = biFalse) then
begin
mtRCableJournalInterfaces.FieldByName('From_InterfName').AsString := InterfacesLeftPoint[p].LoadName; //TF_MAIN(GForm).DM.GetInterfName(TSCSInterface(InterfacesLeft[0]).ID_Interface);
ptrPortFirst := InterfacesLeftPoint[p].PortOwner; //}TSCSComponent(TSCSInterface(InterfacesLeft[0]).ComponentOwner).GetPort;
//01.08.2012 if ptrPortFirst <> nil then
if (NppPortsLeft <> nil) and ((NppPortsLeft.Count-1) >= q) then
begin
if (ptrPortFirst = nil) and (InterfacesLeftPoint[p].IsPort = biTrue) then //01.08.2012
ptrPortFirst := InterfacesLeftPoint[p];
NppPort := NppPortsLeft[q]; //GetNppPortByConnected(ptrPortFirst, InterfacesLeftPoint[p], InterfacesLeftJoinedToPoint[0], p+1);
mtRCableJournalInterfaces.FieldByName('From_NppPort').AsInteger := NppPort; //ptrPortFirst.NppPort;
if NppPort <> 0 then
//mtRCableJournalInterfaces.FieldByName('From_PortMark').AsString := ConcatStrWithDefis(FirstConCompon.NameMark, IntToStr(NppPort)); //LastConCompon.NameShort + IntToStr(LastConCompon.MarkID)+'-'+IntToStr(ptrPortFirst.NppPort);
mtRCableJournalInterfaces.FieldByName('From_PortMark').AsString := ConcatStrWithDefis(ptrPortFirst.ComponentOwner.NameMark, IntToStr(NppPort));
end;
end;
if (InterfacesRightPoint.Count - 1) >= p then
begin
if ShowDevNameTo then
mtRCableJournalInterfaces.FieldByName('To_Device').AsString := GetDeviceNameByInterface(InterfacesRightPoint[p]);
mtRCableJournalInterfaces.FieldByName('To_Element').AsString := GetElementNameByInterface(InterfacesRightPoint[p]);
end;
if ((InterfacesRight.Count - 1) >= p) and (TSCSComponent(TSCSInterface(InterfacesRight[p]).ComponentOwner).IsLine = biTrue) then
begin
mtRCableJournalInterfaces.FieldByName('To_WeldingCable').AsString := GetWelding(InterfacesRight);
mtRCableJournalInterfaces.FieldByName('To_NumThread').AsString := GetNumThreads(InterfacesRight);
end
else
if ((InterfacesRightPoint.Count - 1) >= p) and
(InterfacesRightPoint[p].ComponentOwner.IsLine = biFalse) then
begin
mtRCableJournalInterfaces.FieldByName('To_InterfName').AsString := InterfacesRightPoint[p].LoadName; //TF_MAIN(GForm).DM.GetInterfName(TSCSInterface(InterfacesRight[0]).ID_Interface);
ptrPortLast := InterfacesRightPoint[p].PortOwner; //}TSCSComponent(TSCSInterface(InterfacesRight[0]).ComponentOwner).GetPort;
//01.08.2012 if ptrPortLast <> nil then
if (NppPortsRight <> nil) and ((NppPortsRight.Count-1) >= q) then
begin
if (ptrPortLast = nil) and (InterfacesRightPoint[p].IsPort = biTrue) then //01.08.2012
ptrPortLast := InterfacesRightPoint[p];
NppPort := NppPortsRight[q]; //GetNppPortByConnected(ptrPortLast, InterfacesRightPoint[p], InterfacesRighJoinedToPoint[0], p+1);
mtRCableJournalInterfaces.FieldByName('To_NppPort').AsInteger := NppPort; // //ptrPortLast.NppPort;
if NppPort <> 0 then
mtRCableJournalInterfaces.FieldByName('To_PortMark').AsString := ConcatStrWithDefis(ptrPortLast.ComponentOwner.NameMark, IntToStr(NppPort));
end;
end;
end;
if NppPortsLeft <> nil then
FreeAndNil(NppPortsLeft);
if NppPortsRight <> nil then
FreeAndNil(NppPortsRight);
{//24.03.2009
mtRCableJournalInterfaces.Append;
mtRCableJournalInterfaces.FieldByName(fnIDMaster).AsInteger := MemTable_RCableJournalExt.FieldByName(fnID).AsInteger;
mtRCableJournalInterfaces.FieldByName('NumThread').AsInteger := ptrInterfFirst.Npp; // or ptrInterfLast
if InterfacesLeft.Count > 0 then
begin
if (InterfacesLeftPoint.Count - 1) >= p then
begin
if ShowDevNameFrom then
mtRCableJournalInterfaces.FieldByName('From_Device').AsString := GetDeviceNameByInterface(InterfacesLeftPoint[p]);
mtRCableJournalInterfaces.FieldByName('From_Element').AsString := GetElementNameByInterface(InterfacesLeftPoint[p]);
end;
if ((InterfacesLeft.Count - 1) >= p) and
(TSCSComponent(TSCSInterface(InterfacesLeft[p]).ComponentOwner).IsLine = biTrue) then
begin
mtRCableJournalInterfaces.FieldByName('From_WeldingCable').AsString := GetWelding(InterfacesLeft);
mtRCableJournalInterfaces.FieldByName('From_NumThread').AsString := GetNumThreads(InterfacesLeft);
end
else
if ((InterfacesLeftPoint.Count - 1) >= p) and
(InterfacesLeftPoint[p].ComponentOwner.IsLine = biFalse) then
//if (InterfacesLeftPoint[0].ComponentOwner = LeftCompon) or
// (InterfacesLeftPoint[0].ComponentOwner = RightCompon) then
begin
mtRCableJournalInterfaces.FieldByName('From_InterfName').AsString := InterfacesLeftPoint[p].LoadName; //TF_MAIN(GForm).DM.GetInterfName(TSCSInterface(InterfacesLeft[0]).ID_Interface);
ptrPortFirst := InterfacesLeftPoint[p].PortOwner; //TSCSComponent(TSCSInterface(InterfacesLeft[0]).ComponentOwner).GetPort;
if ptrPortFirst <> nil then
begin
NppPort := GetNppPortByConnected(ptrPortFirst, InterfacesLeftPoint[p], InterfacesLeftJoinedToPoint[0], p+1);
mtRCableJournalInterfaces.FieldByName('From_NppPort').AsInteger := NppPort; //ptrPortFirst.NppPort;
if NppPort <> 0 then
//mtRCableJournalInterfaces.FieldByName('From_PortMark').AsString := ConcatStrWithDefis(FirstConCompon.NameMark, IntToStr(NppPort)); //LastConCompon.NameShort + IntToStr(LastConCompon.MarkID)+'-'+IntToStr(ptrPortFirst.NppPort);
mtRCableJournalInterfaces.FieldByName('From_PortMark').AsString := ConcatStrWithDefis(ptrPortFirst.ComponentOwner.NameMark, IntToStr(NppPort));
end;
//MemTable_RCableJournalExt.FieldByName('From_NppPort').AsInteger := TSCSInterface(InterfacesLeft[0]).NppPort;
//if TSCSInterface(InterfacesLeft[0]).NppPort <> 0 then
// MemTable_RCableJournalExt.FieldByName('From_PortMark').AsString := LastConCompon.MarkStr + IntToStr(LastConCompon.MarkID)+'-'+IntToStr(TSCSInterface(InterfacesLeft[0]).NppPort);
end;
end;
if InterfacesRight.Count > 0 then
begin
if (InterfacesRightPoint.Count - 1) >= p then
begin
if ShowDevNameTo then
mtRCableJournalInterfaces.FieldByName('To_Device').AsString := GetDeviceNameByInterface(InterfacesRightPoint[p]);
mtRCableJournalInterfaces.FieldByName('To_Element').AsString := GetElementNameByInterface(InterfacesRightPoint[p]);
end;
if ((InterfacesRight.Count - 1) >= p) and (TSCSComponent(TSCSInterface(InterfacesRight[p]).ComponentOwner).IsLine = biTrue) then
begin
mtRCableJournalInterfaces.FieldByName('To_WeldingCable').AsString := GetWelding(InterfacesRight);
mtRCableJournalInterfaces.FieldByName('To_NumThread').AsString := GetNumThreads(InterfacesRight);
end
else
if ((InterfacesRightPoint.Count - 1) >= p) and
(InterfacesRightPoint[p].ComponentOwner.IsLine = biFalse) then
//if (InterfacesRightPoint[0].ComponentOwner = RightCompon) or
// (InterfacesRightPoint[0].ComponentOwner = LeftCompon) then
begin
mtRCableJournalInterfaces.FieldByName('To_InterfName').AsString := InterfacesRightPoint[p].LoadName; //TF_MAIN(GForm).DM.GetInterfName(TSCSInterface(InterfacesRight[0]).ID_Interface);
ptrPortLast := InterfacesRightPoint[p].PortOwner; //TSCSComponent(TSCSInterface(InterfacesRight[0]).ComponentOwner).GetPort;
if ptrPortLast <> nil then
begin
NppPort := GetNppPortByConnected(ptrPortLast, InterfacesRightPoint[p], InterfacesRighJoinedToPoint[0], p+1);
mtRCableJournalInterfaces.FieldByName('To_NppPort').AsInteger := NppPort; // //ptrPortLast.NppPort;
if NppPort <> 0 then
//mtRCableJournalInterfaces.FieldByName('To_PortMark').AsString := ConcatStrWithDefis(LastConCompon.NameMark, IntToStr(NppPort)); //LastConCompon.NameShort + IntToStr(LastConCompon.MarkID)+'-'+IntToStr(ptrPortLast.NppPort);
mtRCableJournalInterfaces.FieldByName('To_PortMark').AsString := ConcatStrWithDefis(ptrPortLast.ComponentOwner.NameMark, IntToStr(NppPort));
end;
//MemTable_RCableJournalExt.FieldByName('To_NppPort').AsInteger := TSCSInterface(InterfacesRight[0]).NppPort;
//if TSCSInterface(InterfacesRight[0]).NppPort <> 0 then
// MemTable_RCableJournalExt.FieldByName('To_PortMark').AsString := LastConCompon.MarkStr + IntToStr(LastConCompon.MarkID)+'-'+IntToStr(TSCSInterface(InterfacesRight[0]).NppPort);
end;
end; }
mtRCableJournalInterfaces.Post;
end;
end;
FreeAndNil(InterfacesLeft);
FreeAndNil(InterfacesLeftPoint);
FreeAndNil(InterfacesLeftJoinedToPoint);
FreeAndNil(InterfacesRight);
FreeAndNil(InterfacesRightPoint);
FreeAndNil(InterfacesRighJoinedToPoint);
end;
// Tolik -- 11/03/2017 --
//ParallelInterfaces.InterfList1.Free;
//ParallelInterfaces.InterfList2.Free;
FreeAndNil(ParallelInterfaces.InterfList1);
FreeAndNil(ParallelInterfaces.InterfList2);
//
end;
end;
LookedCompons.Assign(ptrJoinedComponents.JoinedLines, laOr);
end;
{for j := 0 to CurrCompon.Net.Count - 1 do
begin
ptrJoinedComponents := CurrCompon.Net[j];
if Assigned(ptrJoinedComponents.JoinedLines) then
LookedCompons.Assign(ptrJoinedComponents.JoinedLines, laOr);
end;}
end;
end;
for j := 0 to CurrCompon.Net.Count - 1 do
begin
ptrJoinedComponents := CurrCompon.Net[j];
if Assigned(ptrJoinedComponents.JoinedLines) then
LookedCompons.Assign(ptrJoinedComponents.JoinedLines, laOr);
end;
end;
end;
end;
end;
//MemTable_RCableJournalExt.SortOn('NumCable', []);
SortMemTableByParams(MemTable_RCableJournalExt, AParams, nil);
finally
EndProgress;
LookedCompons.Free;
end;
GFormMode := fmRCableJournalExt;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderCableJournalExt: '+E.Message);
end;
end;
procedure TF_ResourceReport.ShowFolderLegendObjectIcons(AFolder: TSCSCatalog; AParams: TReportItemParams; ACanHaveActiveComponents: Boolean);
var
i: Integer;
CurrCatalog: TSCSCatalog;
FirstComponent: TSCSComponent;
ComponSignType: Integer;
CurrObjIconGUID: string;
CurrObjIconType: Integer;
LookedObjectIconGUIDs: TStringList;
LookedObjectIconActTypes: TIntList;
LookedObjectIconProjTypes: TIntList;
IndexOfLooked: Integer;
SprObjectIcon: TNBObjectIcon;
ObjectIcon: TMemoryStream;
ObjectIconName: String;
ProjOwner: TSCSProject;
begin
try
FCatalog := AFolder;
mtRLegendObjectIcons.Active := false;
mtRLegendObjectIcons.Active := true;
LookedObjectIconGUIDs := TStringList.Create;
LookedObjectIconActTypes := TIntList.Create;
LookedObjectIconProjTypes := TIntList.Create;
BeginProgress(pcPreparingReport);
try
ProjOwner := AFolder.GetProject;
if ProjOwner <> nil then
for i := 0 to AFolder.ChildCatalogReferences.Count - 1 do
begin
CurrCatalog := AFolder.ChildCatalogReferences[i];
if CurrCatalog.ItemType in [itSCSLine, itSCSConnector] then
begin
//*** ID и Тип условного обозначения объекта
//CurrObjIconID := GetIconIDByObjectID(CurrCatalog.SCSID);
//CurrObjIconType := GetObjectTypeIDByObjectID(CurrCatalog.SCSID);
FirstComponent := CurrCatalog.GetFirstComponent;
if (AllNetTypes or (NetTypeGuidListSelected.IndexOf(FirstComponent.GUIDNetType) <> -1)) then
begin
if FirstComponent <> nil then
begin
CurrObjIconGUID := FirstComponent.GUIDObjectIcon; //CurrObjIconID := FirstComponent.IDObjectIcon;
CurrObjIconType := FirstComponent.GetPropertyValueAsInteger(pnSignType);
if (FirstComponent.GUIDObjectIcon <> '') and ((CurrObjIconType = oitProjectible) or ACanHaveActiveComponents) then
begin
IndexOfLooked := LookedObjectIconGUIDs.IndexOf(CurrObjIconGUID);
if (IndexOfLooked = -1) or
((CurrObjIconType = oitActive) and (LookedObjectIconActTypes[IndexOfLooked] = oitNone)) or
((CurrObjIconType = oitProjectible) and (LookedObjectIconProjTypes[IndexOfLooked] = oitNone)) then
begin
//ObjectIcon := nil;
//ObjectIcon := TF_Main(GForm).FNormBase.DM.GetComponIconByIconType(CurrObjIconID, CurrObjIconType, ieBMP);
//ObjectIconName := TF_Main(GForm).FNormBase.DM.GetStringFromTableByID(tnObjectIcons, fnName, CurrObjIconID, qmPhisical);
SprObjectIcon := ProjOwner.Spravochnik.GetObjectIconByGUID(CurrObjIconGUID);
if SprObjectIcon <> nil then
begin
ObjectIcon := nil;
if CurrObjIconType = oitProjectible then
ObjectIcon := SprObjectIcon.ProjBmp
else
if CurrObjIconType = oitActive then
ObjectIcon := SprObjectIcon.ActiveBmp;
if ObjectIcon <> nil then
begin
ObjectIcon.Position := 0;
mtRLegendObjectIcons.Append;
mtRLegendObjectIcons.FieldByName(fnName).AsString := SprObjectIcon.Name; //ObjectIconName;
TBlobField(mtRLegendObjectIcons.FieldByName(fnPicture)).LoadFromStream(ObjectIcon);
mtRLegendObjectIcons.Post;
//FreeAndNil(ObjectIcon);
end;
end;
if IndexOfLooked = -1 then
begin
IndexOfLooked := LookedObjectIconGUIDs.Add(CurrObjIconGUID);
LookedObjectIconActTypes.Add(oitNone);
LookedObjectIconProjTypes.Add(oitNone);
end;
case CurrObjIconType of
oitProjectible:
LookedObjectIconProjTypes[IndexOfLooked] := CurrObjIconType;
oitActive:
LookedObjectIconActTypes[IndexOfLooked] := CurrObjIconType;
end;
end;
end;
end;
end;
end;
end;
finally
EndProgress;
LookedObjectIconGUIDs.Free;
LookedObjectIconActTypes.Free;
LookedObjectIconProjTypes.Free;
//mtRLegendObjectIcons.SortOn(fnName, []);
SortMemTableByParams(mtRLegendObjectIcons, AParams, nil);
end;
GFormMode := fmRLegendObjectIcons;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog(': '+E.Message);
end;
end;
// ##### Ведомость по типам компонентов #####
procedure TF_ResourceReport.ShowFolderTypeComponenetsReport(AFolder: TSCSCatalog; AParams: TReportItemParams);
var FolderIDComponList: TList;
ListWithBusyCompons: TList;
i, j, k: Integer;
IDMaster: Integer;
TypeList: TList;
Group: TSCSCatalog;
GroupList: TList;
GroupComponent: TSCSComponent;
GroupLength: Double;
GroupCost: Double;
TotalCost: Double;
TypeCost: Double;
strLength: String;
LengthFromStr: Double;
StrToShow: String;
procedure AddToGroups(AIDComponent: Integer);
var NewSCSComponent: TSCSComponent;
Compon: TSCSComponent;
i: Integer;
Group: TSCSCatalog;
GroupForReceiveCompon: TSCSCatalog;
WholeLineCompon: TList; //*** Цельный линейный компонент
Length: Double;
strLength: String;
LengthFromStr: Double;
ptrIDBusy: ^Integer;
begin
if CheckNoIDinList(AIDComponent, ListWithBusyCompons) then
begin
NewSCSComponent := TSCSComponent.Create(GForm);
NewSCSComponent.LoadComponentByID(AIDComponent, false);
case NewSCSComponent.IsLine of
biTrue:
begin
NewSCSComponent.LoadWholeComponent(false);
NewSCSComponent.LoadWholeLength;
//*** Занести в список занятых
for i := 0 to NewSCSComponent.WholeComponent.Count - 1 do
begin
New(ptrIDBusy);
ptrIDBusy^ := NewSCSComponent.WholeComponent[i];
ListWithBusyCompons.Add(ptrIDBusy);
end;
end;
end;
NewSCSComponent.NormsResources.CalcResourcesCost(true, true);
if NewSCSComponent.NormsResources.ResourcesCost = 0 then
begin
NewSCSComponent.Free;
Exit; //// EXIT ////
end;
GroupForReceiveCompon := nil;
//*** Найти тип для компоненты
GroupList := nil;
for i := 0 to TypeList.Count - 1 do
begin
//GroupList := TypeList.Items[i];
if TList(TypeList.Items[i]).Count > 0 then
begin
Group := TList(TypeList.Items[i]).Items[0]; // GroupList.Items[0];
if Group.SCSComponents.Count > 0 then
if TSCSComponent(Group.SCSComponents.Items[0]).ID_ComponentType = NewSCSComponent.ID_ComponentType then
begin
GroupList := TypeList.Items[i];
Break;
end;
end;
end;
//*** Если нет списка групп для тек-го типа, то создать ее
if GroupList = nil then
begin
GroupList := TList.Create;
TypeList.Add(GroupList);
end;
//*** Найти группу для компоненты
for i := 0 to GroupList.Count - 1 do
begin
Group := GroupList.Items[i];
if Group.SCSComponents.Count > 0 then
if TSCSComponent(Group.SCSComponents.Items[0]).GuidNB = NewSCSComponent.GuidNB then
begin
GroupForReceiveCompon := Group;
Break;
end;
end;
//*** Создать новую группу
if GroupForReceiveCompon = nil then
begin
Group := TSCSCatalog.Create(GForm);
GroupList.Add(Group);
GroupForReceiveCompon := Group;
end;
//*** Добавить компонент в группу
if GroupForReceiveCompon <> nil then
begin
//ptrNewSCSComponent.LoadNorms(false);
//ptrNewSCSComponent.CalcResourcesCost(true, true);
if NewSCSComponent.IsLine = biFalse then
begin
New(ptrIDBusy);
ptrIDBusy^ := NewSCSComponent.ID;
ListWithBusyCompons.Add(ptrIDBusy);
end;
//*** Добавление в группу
if NewSCSComponent.NormsResources.ResourcesCost > 0 then
GroupForReceiveCompon.SCSComponents.Add(NewSCSComponent)
else
NewSCSComponent.Free;
end;
end;
end;
begin
FolderIDComponList := nil;
try
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
try
FCatalog := AFolder;
//Tolik 18/05/2018 --
//FolderIDComponList := Tlist.Create;
//ListWithBusyCompons := TList.Create;
//TypeList := TList.Create;
//
//GroupList := TList.Create;
//*** Найти все кмопоненты папки
FolderIDComponList := GetFolderComponList(GForm, AFolder, [itSCSLine, itSCSConnector]);
if FolderIDComponList = nil then
Exit; //// EXIT /////
// Tolik 18/05/2018 --
ListWithBusyCompons := TList.Create;
TypeList := TList.Create;
//
//*** Разбить компоненты по группам относительно IDNormBase
for i := 0 to FolderIDComponList.Count - 1 do
AddToGroups(Integer(FolderIDComponList.Items[i]^));
TotalCost := 0;
MemTable_RTypeComponents.Active := false;
MemTable_RTypeComponents.Active := true;
MemTable_RTypeComponentsDetail.Active := false;
MemTable_RTypeComponentsDetail.Active := true;
Screen.Cursor := crHourGlass;
try
for i := 0 to TypeList.Count - 1 do
begin
GroupList := TypeList.Items[i];
IDMaster := -1;
TypeCost := 0;
for j := 0 to GroupList.Count - 1 do
begin
Group := GroupList.Items[j];
GroupLength := 0;
GroupCost := 0;
if Group.SCSComponents.Count > 0 then
begin
StrToShow := '';
for k := 0 to Group.SCSComponents.Count - 1 do
begin
GroupComponent := Group.SCSComponents.Items[k];
//*** Если Первый компонент текущего типа
if (j = 0) and (k = 0) then
begin
GroupComponent.LoadComponentType;
MemTable_RTypeComponents.Append;
MemTable_RTypeComponents.FieldByName('Name_Type').AsString := GroupComponent.ComponentType.Name;
if GroupComponent.ComponentType.IsLine = biTrue then
MemTable_RTypeComponents.FieldByName('IsLine').AsString := 'Да'
else
MemTable_RTypeComponents.FieldByName('IsLine').AsString := 'Нет';
IDMaster := MemTable_RTypeComponents.FieldByName('ID').AsInteger;
MemTable_RTypeComponents.Post;
// IDMaster := MemTable_RTypeComponents.FieldByName('ID').AsInteger;
end;
GroupCost := GroupCost + GroupComponent.NormsResources.ResourcesCost;
if GroupComponent.IsLine = biTrue then
GroupLength := GroupLength + GroupComponent.Length;
TypeCost := TypeCost + GroupComponent.NormsResources.ResourcesCost;
end;
GroupComponent := Group.SCSComponents.Items[0];
MemTable_RTypeComponentsDetail.Append;
MemTable_RTypeComponentsDetail.FieldByName('ID').AsInteger := GroupComponent.ID;
MemTable_RTypeComponentsDetail.FieldByName('ID_MASTER').AsInteger := IDMaster;
MemTable_RTypeComponentsDetail.FieldByName('NAME').AsString := GroupComponent.Name;
case GroupComponent.IsLine of
biTrue:
begin
MemTable_RTypeComponentsDetail.FieldByName('Kolvo').AsFloat := Round3(GroupLength);
MemTable_RTypeComponentsDetail.FieldByName('Price').AsFloat := Round3(GroupComponent.NormsResources.ResourcesCostPerOneNorm);
end;
biFalse:
begin
MemTable_RTypeComponentsDetail.FieldByName('Kolvo').AsFloat := Round3(Group.SCSComponents.Count);
MemTable_RTypeComponentsDetail.FieldByName('Price').AsFloat := Round3(GroupComponent.NormsResources.ResourcesCost);
end;
end;
MemTable_RTypeComponentsDetail.FieldByName('Cost').AsFloat := Round3(GroupCost);
MemTable_RTypeComponentsDetail.Post;
TotalCost := TotalCost + GroupCost;
end;
if j = GroupList.Count - 1 then
begin
MemTable_RTypeComponents.Edit;
MemTable_RTypeComponents.FieldByName('Cost_Type').AsFloat := Round3(TypeCost);
MemTable_RTypeComponents.Post;
end;
end;
end;
//Label_TotalCost.Caption := FloatToStr(RoundX(TotalCost, 3)) +' '+GCurrency.Name_Brief;
finally
Screen.Cursor := crDefault;
end;
GFormMode := fmRTypeComponents;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderTypeComponenetsReport: '+E.Message);
end;
finally
//*** Удалить Группы
for i := 0 to TypeList.Count - 1 do
begin
GroupList := TypeList.items[i];
for j := 0 to GroupList.Count - 1 do
begin
Group := GroupList.Items[j];
Group.Free;
end;
//GroupList.Free;
end;
FreeList(TypeList);
//FreeList(GroupList);
FreeList(ListWithBusyCompons);
FreeList(FolderIDComponList);
end;
end;
// ##### Отчет "Спецификация" #####
procedure TF_ResourceReport.ShowFolderSpecificationReport(AFolder: TSCSCatalog; AParams, AReportItemParamValues: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode;
ACanHaveActiveComponents, ACanHaveZeroPriceComponents, ACanHaveDismountAccount,
ACanRoundValue, ACanHaveSupplyValue: Boolean);
const
CmpDelta = 0.001;
var
FolderComponents: TSCSComponents;
GroupTypeComponents: TSCSComponents;
GroupTypeComponent: TSCSComponent;
GroupComponent: TSCSComponent;
ComponsFromResources: TSCSComponents;
CachedNBCompons: TSCSComponents;
NBComponent: TSCSComponent;
IDNBComponent: Integer;
SprComponent: TSCSComponent;
NormResourcesKinds: TNormResourcesKinds;
Resources: TSCSNormsResources;
ResourceRel: TSCSResourceRel;
CurrGroupComponent: TSCSComponent;
Component: TSCSComponent;
ComponTypeForGroup: TComponentType;
ComponSignType: Integer;
ComponentLengthKolvo: Double;
PartComponent: TSCSComponent;
PartLength: Double;
ExpenseForMetr: Double;
//ExpenseForSection: Double;
LengthTrace: Double;
LookedComponIDs: TIntList;
IDTypeSpecif: Integer;
ReservLength: Double;
CanAddComponToGroup: Boolean;
ProjectOwner: TSCSProject;
SprSuppliesKind: TNBSuppliesKind;
ComponIzm: String;
Kolvo, Price, Cost: Double;
TotalCost: Double;
i, j, k: Integer;
function GetComponTypeForGroup(AComponent: TSCSComponent): TComponentType;
var
PropGrpName: PProperty;
begin
ZeroMemory(@Result, SizeOf(TComponentType));
if AReportItemParamValues.GroupMode = gmComponType then
Result := AComponent.ComponentType
else if AReportItemParamValues.GroupMode = gmGroupName then
begin
PropGrpName := AComponent.GetPropertyBySysName(pnGroupName);
if PropGrpName = nil then
begin
Result.GUID := '';
Result.Name := cResourceReport_Msg44;
end
else
begin
Result.GUID := PropGrpName.Value;
Result.Name := PropGrpName.Value;
end;
Result.NamePlural := Result.Name;
end;
end;
begin
try
Component := nil;
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FCatalog := AFolder;
ProjectOwner := AFolder.GetProject;
DefinePrecisions;
TotalCost := 0;
GroupTypeComponents := TSCSComponents.Create(true);
LookedComponIDs := TIntList.Create;
MemTable_RSpecifTypeCompon.Active := false;
MemTable_RSpecifTypeCompon.Active := true;
MemTable_RSpecification.Active := false;
MemTable_RSpecification.Active := true;
BeginProgress(pcPreparingReport);
try
// Tolik
// по типам сетей
INeedNormsRecources := True;
//
//*** Сгруппировать компоненты
FolderComponents := TSCSComponents.Create(false);
FolderComponents.Assign(AFolder.ComponentReferences);
//Определяем сгруппирированные аксессуары и ресурсы в список компонентов
ComponsFromResources := TSCSComponents.Create(true);
NormResourcesKinds := [nrAccessories];
if AReportItemParamValues.CanResources = biTrue then
NormResourcesKinds := NormResourcesKinds + [nrResources];
Resources := AFolder.GetAllNormsResources(NormResourcesKinds, false,
ACanHaveActiveComponents, ACanHaveDismountAccount, ACanHaveZeroPriceComponents);
CachedNBCompons := TSCSComponents.Create(true);
for i := 0 to Resources.Resources.Count - 1 do
begin
ResourceRel := Resources.Resources[i];
Component := TSCSComponent.Create(GForm);
if ResourceRel.GUIDNBComponent <> '' then
begin
// Если ресурс из компонента, то ищем его в кеше компонентов из НБ
NBComponent := GetComponByGUIDFromList(ResourceRel.GUIDNBComponent, CachedNBCompons);
if NBComponent = nil then
begin
// ищем в НБ
IDNBComponent := F_NormBase.DM.GetIntFromTableByGUID(tnComponent, fnID, ResourceRel.GUIDNBComponent, qmPhisical);
if IDNBComponent <> 0 then
begin
NBComponent := TSCSComponent.Create(F_NormBase);
NBComponent.LoadComponentByID(IDNBComponent, false);
NBComponent.LoadComponentType;
// Если на аксессуар установлено свойство "расход на метр", то не учитвать его, т.к.
// это свойство уж есть в аксессуаре и оно учтено
NBComponent.SetPropertyValueAsFloat(pnExpenseForMetr, 0, false);
CachedNBCompons.Add(NBComponent);
end
else
begin
// ищем в справочном компоненте
//SprComponent := AFolder.ProjectOwner.GetSprComponentByGUID(ResourceRel.GUIDNBComponent);
SprComponent := ProjectOwner.GetSprComponentByGUID(ResourceRel.GUIDNBComponent);
if SprComponent <> nil then
NBComponent := SprComponent;
end;
end;
if NBComponent <> nil then
Component.AssignOnlyComponent(NBComponent);
end
else
begin
// Внесем отдельный тип - ресурсы
Component.GUIDComponentType := guidCompTypeResource;
Component.ComponentType.GUID := guidCompTypeResource;
Component.ComponentType.SysName := guidCompTypeResource;
Component.ComponentType.NamePlural := cBaseOptions_Msg4_1;
end;
Component.IsLine := biFalse;
Component.ComponentType.IsLine := biFalse;
Component.Name := ResourceRel.Name;
Component.Izm := ResourceRel.Izm;
Component.Price := ResourceRel.Price;
Component.Length := ResourceRel.Kolvo;
FolderComponents.Add(Component);
ComponsFromResources.Add(Component);
end;
FreeAndNil(CachedNBCompons);
FreeAndNil(Resources);
for i := 0 to FolderComponents.Count - 1 do
begin
Component := FolderComponents[i];
if Assigned(Component) then
begin
// Tolik
// по типу сети
if (AllNetTypes) or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(Component.GUIDNetType)<> -1)) then
begin
ComponIzm := Component.Izm;
if CheckPriceTransformToUOMByCompType(@Component.ComponentType) then
ComponIzm := GetNameUOM(umMetr, true);
//ComponSignType := Component.GetPropertyValueAsInteger(pnSignType);
if ((Component.ID = 0) or (LookedComponIDs.IndexOf(Component.ID) = -1)) and
CheckCanLookComponInReportRsrc(Component, ACanHaveActiveComponents, ACanHaveDismountAccount) then
//((ComponSignType = oitProjectible) or
// (ACanHaveActiveComponents or (ACanHaveDismountAccount and (Component.IsDismount = biTrue)) )) then
begin
if Component.IsLine = biTrue then
begin
Component.Length := GetComponPartLengthWithReserv(Component, ReservLength, true, true);
// 2007.03.15 Component.LoadWholeComponent(false);
//Component.RefreshWholeLengthIfNecessary;
// 2007.03.15 if AFolder.ItemType = itProject then
// 2007.03.15 begin
// 2007.03.15 Component.RefreshWholeLength;
// 2007.03.15 Component.Length := Component.GetPropertyValueAsFloat(pnLength)
// 2007.03.15 end
// 2007.03.15 else
// 2007.03.15 Component.Length := Component.GetWholeLength(false);
end;
GroupTypeComponent := nil;
GroupComponent := nil;
if (Component.Price > 0) or (ACanHaveZeroPriceComponents) then
begin
ComponTypeForGroup := GetComponTypeForGroup(Component);
//*** Найти группу компонент с соответствующим типом компоненты
for j := 0 to GroupTypeComponents.Count - 1 do
if GroupTypeComponents[j].GUIDComponentType = ComponTypeForGroup.GUID then //28.02.2012 if GroupTypeComponents[j].GUIDComponentType = Component.ComponentType.GUID then
begin
GroupTypeComponent := GroupTypeComponents[j];
Break; //// BREAK ////
end;
if GroupTypeComponent = nil then
begin
GroupTypeComponent := TSCSComponent.Create(GForm);
GroupTypeComponent.GUIDComponentType := ComponTypeForGroup.GUID; //28.02.2012 Component.ComponentType.GUID;
GroupTypeComponent.ID_ComponentType := ComponTypeForGroup.ID; //28.02.2012 Component.ComponentType.ID;
GroupTypeComponent.Name := ComponTypeForGroup.NamePlural; //28.02.2012 Component.ComponentType.NamePlural;
GroupTypeComponents.Add(GroupTypeComponent);
end;
if GroupTypeComponent <> nil then
begin
//*** Найти в группе компонент который имеет сходственные параметры с Component
for j := 0 to GroupTypeComponent.ChildComplects.Count - 1 do
begin
CurrGroupComponent := GroupTypeComponent.ChildComplects[j];
CanAddComponToGroup := false;
if (CurrGroupComponent.ArticulProducer = Component.ArticulProducer) and
(CurrGroupComponent.ArticulDistributor = Component.ArticulDistributor) and
//(((Component.IsLine = biTrue) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCostPerOneNorm) < CmpDelta)) or
// ((Component.IsLine = biFalse) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCost) < CmpDelta))) and
(Abs(CurrGroupComponent.Price - Component.Price) < CmpDelta) and
(CurrGroupComponent.Izm = ComponIzm) and
(CurrGroupComponent.GUIDProducer = Component.GUIDProducer) and
(CurrGroupComponent.Name = Component.Name) and
(CurrGroupComponent.NameShort = Component.NameShort) and
((AResourceReportFormMode <> fmRGOSTSpecification) or (CurrGroupComponent.Notice = Component.Notice)) then
begin
CanAddComponToGroup := true;
//***группировка по видам поставки
if ACanHaveSupplyValue then
if (CurrGroupComponent.GUIDSuppliesKind <> '') and
(CurrGroupComponent.GUIDSuppliesKind <> Component.GUIDSuppliesKind) then
if ProjectOwner.Spravochnik.GetSuppliesKindByGUID(Component.GUIDSuppliesKind) <> nil then
CanAddComponToGroup := false;
if CanAddComponToGroup then
begin
GroupComponent := CurrGroupComponent;
Break; //// BREAK ////
end;
end;
end;
if GroupComponent = nil then
begin
GroupComponent := TSCSComponent.Create(GForm);
GroupComponent.AssignOnlyComponent(Component);
GroupComponent.Izm := ComponIzm;
GroupComponent.Length := 0;
{if GroupComponent.ArticulProducer = '' then
if GroupComponent.ArticulDistributor <> '' then
GroupComponent.ArticulProducer := GroupComponent.ArticulDistributor;
GroupComponent.Length := 0;}
//*** На тот случай, если мертвая ссылка на вид поставки
if GroupComponent.GUIDSuppliesKind <> '' then
if ProjectOwner.Spravochnik.GetSuppliesKindByGUID(GroupComponent.GUIDSuppliesKind) = nil then
GroupComponent.GUIDSuppliesKind := '';
GroupTypeComponent.ChildComplects.Add(GroupComponent);
end;
if GroupComponent <> nil then
begin
//if (GroupComponent.Notice = '') and (Component.Notice <> '') then
// GroupComponent.Notice := Component.Notice;
ComponentLengthKolvo := 0;
case GroupComponent.IsLine of
biFalse:
begin
ComponentLengthKolvo := 1;
// Если ресурс, то берем количество этого ресурса из поля Length
if ComponsFromResources.IndexOf(Component) <> -1 then
ComponentLengthKolvo := Component.Length;
if ((Component.ComponentType.SysName = ctsnCableChannelAccessory) or
(Component.ComponentType.SysName = ctsnAccessory)) then
begin
ExpenseForMetr := Component.GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr > 0 then
begin
ComponentLengthKolvo := Round(Component.Length * ExpenseForMetr);
end
end;
end;
biTrue:
begin
// Расход на ед.длины
ExpenseForMetr := Component.GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr > 0 then
begin
//ComponentLengthKolvo := Round(Component.Length) * ExpenseForMetr;
ComponentLengthKolvo := Round(Component.Length * ExpenseForMetr);
// 2007.03.15 LengthTrace := 0;
// 2007.03.15 for k := 0 to Component.WholeComponent.Count - 1 do
// 2007.03.15 begin
// 2007.03.15 PartComponent := FCatalog.GetComponentFromReferences(Component.WholeComponent[k]);
// 2007.03.15 if PartComponent <> nil then
// 2007.03.15 begin
// 2007.03.15 PartLength := PartComponent.GetPartLength;
// 2007.03.15 LengthTrace := LengthTrace + PartLength;
// 2007.03.15 end;
// 2007.03.15 end;
// 2007.03.15 ComponentLengthKolvo := Round(LengthTrace) * ExpenseForMetr;
end
else
ComponentLengthKolvo := RoundCP(Component.Length);
// Расход на отрезок
//ExpenseForSection := Component.GetPropertyValueAsFloat(pnExpenseForSection);
//if ExpenseForSection > 0 then
// ComponentLengthKolvo := ComponentLengthKolvo + ExpenseForSection;
end;
end;
//*** Если учитывать демонтаж, и компонент демонтирован,
// то отнимать от общего количества, кол-во этой компоненты
if ACanHaveDismountAccount and (Component.IsDismount = biTrue) then
if Component.IsUseDismounted = biTrue then
ComponentLengthKolvo := ComponentLengthKolvo * -1
else
ComponentLengthKolvo := 0;
GroupComponent.Length := GroupComponent.Length + ComponentLengthKolvo;
end;
end;
end;
//25.02.2009 LookedComponIDs.Add(Component.ID);
// 2007.03.15
//if Component.IsLine = biTrue then
//begin
// for j := 0 to Component.WholeComponent.Count - 1 do
// if Component.WholeComponent[j] <> Component.ID then
// LookedComponIDs.Add(Component.WholeComponent[j]);
//end;
end;
end;
end;
end;
FreeAndNil(ComponsFromResources);
FreeAndNil(FolderComponents);
//*** Закинуть группы в MemTable
for i := 0 to GroupTypeComponents.Count - 1 do
begin
GroupTypeComponent := GroupTypeComponents[i];
MemTable_RSpecifTypeCompon.Append;
//*** ID - AutoInc
MemTable_RSpecifTypeCompon.FieldByName(fnName).AsString := GroupTypeComponent.Name;
MemTable_RSpecifTypeCompon.FieldByName(fnIDComponentType).AsInteger := GroupTypeComponent.ID_ComponentType;
IDTypeSpecif := MemTable_RSpecifTypeCompon.FieldByName(fnID).AsInteger;
MemTable_RSpecifTypeCompon.Post;
for j := 0 to GroupTypeComponent.ChildComplects.Count - 1 do
begin
GroupComponent := GroupTypeComponent.ChildComplects[j];
if GroupComponent.Length > 0 then
begin
//*** Округлить количество и цену групповой компоненты
//GroupComponent.Length := RoundCP(GroupComponent.Length);
//GroupComponent.Price := RoundCP(GroupComponent.Price);
//*** Учитывать вид поставки
SprSuppliesKind := nil;
if (ACanHaveSupplyValue or (isCableComponent(GroupComponent) and
(not cbNone.Checked))) and (GroupComponent.GUIDSuppliesKind <> '') then
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(GroupComponent.GUIDSuppliesKind);
// Подогнать под вид поставки
// Tolik - 09/11/2020 - для кабеля если только не выбрана опция "НЕТ" для расчета катушек
//if SprSuppliesKind <> nil then
if ((SprSuppliesKind <> nil) and ((GroupComponent.isLine = biFalse) or
(not isCableComponent(GroupComponent)) or (isCableComponent(GroupComponent) and
(not cbNone.Checked)))) then
begin
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
begin
GroupComponent.Izm := SprSuppliesKind.Data.NameTradUOM;
if CheckPriceTransformToUOMByCompType(@GroupComponent.ComponentType) then
begin
// Для кабелей и каналов в традиционной системы США нужно юзать ФУТЫ
GroupComponent.Length := FloatInUOM(GroupComponent.Length, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
GroupComponent.Price := FloatInUOM(GroupComponent.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
GroupComponent.Length := GroupComponent.Length / SprSuppliesKind.Data.UnitKolvoTradUOM;
GroupComponent.Price := GroupComponent.Price * SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
end
else
begin
GroupComponent.Izm := SprSuppliesKind.Data.Name;
GroupComponent.Length := GroupComponent.Length / SprSuppliesKind.Data.UnitKolvo;
GroupComponent.Price := GroupComponent.Price * SprSuppliesKind.Data.UnitKolvo;
end;
end
else
begin
if CheckPriceTransformToUOMByCompType(@GroupComponent.ComponentType) then
begin
GroupComponent.Izm := GetNameUOM(TF_Main(GForm).FUOM, true);
if TF_Main(GForm).FUOM <> umMetr then
begin
GroupComponent.Length := FloatInUOM(GroupComponent.Length, umMetr, TF_Main(GForm).FUOM);
GroupComponent.Price := FloatInUOM(GroupComponent.Price, TF_Main(GForm).FUOM, umMetr);
end;
end;
end;
//*** Учитывать флаг округления
if ACanRoundValue then
GroupComponent.Length := RoundUp(GroupComponent.Length);
MemTable_RSpecification.Append;
MemTable_RSpecification.FieldByName(fnID).AsInteger := GroupComponent.ID;
MemTable_RSpecification.FieldByName(fnIDMaster).AsInteger := IDTypeSpecif;
MemTable_RSpecification.FieldByName(fnName).AsString := GroupComponent.Name;
MemTable_RSpecification.FieldByName(fnNameShort).AsString := GroupComponent.NameShort;
MemTable_RSpecification.FieldByName(fnArticulProducer).AsString := GroupComponent.ArticulProducer;
MemTable_RSpecification.FieldByName(fnArticulDistributor).AsString := GroupComponent.ArticulDistributor;
MemTable_RSpecification.FieldByName(fnNotice).AsString := GroupComponent.Notice;
if GroupComponent.ArticulProducer = '' then
if GroupComponent.ArticulDistributor <> '' then
GroupComponent.ArticulProducer := GroupComponent.ArticulDistributor;
MemTable_RSpecification.FieldByName(fnIDProducer).AsInteger := GroupComponent.ID_Producer;
MemTable_RSpecification.FieldByName(fnProducerName).AsString := GroupComponent.GetProducerName;
MemTable_RSpecification.FieldByName(fnIzm).AsString := GroupComponent.Izm;
{//27.03.2012
MemTable_RSpecification.FieldByName(fnKolvo).AsFloat := RoundCP(GroupComponent.Length);
MemTable_RSpecification.FieldByName(fnPrice).AsFloat := RoundCP(GroupComponent.Price);
//MemTable_RSpecification.FieldByName(fnCost).AsFloat := Round3(Round3(GroupComponent.PRICE) * Round3(GroupComponent.Length));
MemTable_RSpecification.FieldByName(fnCost).AsFloat := RoundCP(GroupComponent.Price * GroupComponent.Length);
MemTable_RSpecification.Post;
TotalCost := TotalCost + RoundCP(GroupComponent.Price * GroupComponent.Length);}
Kolvo := RoundX(GroupComponent.Length, FKolvoPrecision);
Price := RoundX(GroupComponent.Price, FPricePrecision);
Cost := RoundX(Kolvo * Price, Max(FKolvoPrecision, FPricePrecision) );
MemTable_RSpecification.FieldByName(fnKolvo).AsFloat := Kolvo;
MemTable_RSpecification.FieldByName(fnPrice).AsFloat := Price;
MemTable_RSpecification.FieldByName(fnCost).AsFloat := Cost;
MemTable_RSpecification.Post;
TotalCost := TotalCost + Cost;
end;
end;
end;
MemTable_RSpecifTypeCompon.SortOn(fnName, []);
SortMemTableByParams(MemTable_RSpecification, AParams, nil);
finally
EndProgress;
LookedComponIDs.Free;
GroupTypeComponents.Free;
//Toilk
INeedNormsRecources := False;
//
end;
GFormMode := AResourceReportFormMode; //fmRSpecification;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderSpecificationReport: '+E.Message);
end;
end;
(*
procedure TF_ResourceReport.ShowFolderSpecificationReport(AFolder: TSCSCatalog; ACanHaveActiveComponents: Boolean);
const CmpDelta = 0.001;
var
ListWithLookedCompons: TList;
ptrID: ^Integer;
CurrIDCompon: Integer;
Component: TSCSComponent;
ComponSignType: Integer;
TypeSpecifList: TList;
i, j: Integer;
IDTypeSpecif: integer;
IDObject: Integer;
IDSpecification: Integer;
TypeKolvo: Double;
TypeCost: Double;
CurrKolvo: Double;
//CurrCost: Double;
begin
try
Component := nil;
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FCatalog := AFolder;
ListWithLookedCompons := TList.Create;
//Component := TSCSComponent.Create(GForm);
MemTable_RSpecifTypeCompon.Active := false;
MemTable_RSpecifTypeCompon.Active := true;
MemTable_RSpecification.Active := false;
MemTable_RSpecification.Active := true;
BeginProgress(pcPreparingReport);
try
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
Component := AFolder.ComponentReferences[i];
if Assigned(Component) then
begin
ComponSignType := Component.GetPropertyValueAsInteger(pnSignType);
if CheckNoIDinList(Component.ID, ListWithLookedCompons) and
((ComponSignType = oitProjectible) or (ACanHaveActiveComponents)) then
begin
if Component.IsLine = biTrue then
begin
Component.RefreshWholeLengthIfNecessary;
//Component.LoadWholeComponent(false);
//Component.LoadWholeLength;
end;
//Component.NormsResources.CalcResourcesCost(true, true);
//if Component.NormsResources.ResourcesCost > 0 then
if Component.Price > 0 then
begin
IDTypeSpecif := -1;
IDObject := -1;
IDSpecification := -1;
CurrKolvo := 0;
//CurrCost := 0;
//*** Найти тип спецификации
MemTable_RSpecifTypeCompon.First;
while Not MemTable_RSpecifTypeCompon.Eof do
begin
if MemTable_RSpecifTypeCompon.FieldByName('id_component_type').AsInteger = Component.ID_ComponentType then
begin
IDTypeSpecif := MemTable_RSpecifTypeCompon.FieldByName('id').AsInteger;
Break; ///// BREAK /////
end;
MemTable_RSpecifTypeCompon.Next;
end;
//*** Если тип не найден, то создать его
if IDTypeSpecif = -1 then
begin
Component.RefreshComponentType;
MemTable_RSpecifTypeCompon.Append;
//*** ID - AutoInc
MemTable_RSpecifTypeCompon.FieldByName('name').AsString := Component.ComponentType.NamePlural;
MemTable_RSpecifTypeCompon.FieldByName('id_component_type').AsInteger := Component.ID_ComponentType;
MemTable_RSpecifTypeCompon.Post;
IDTypeSpecif := MemTable_RSpecifTypeCompon.FieldByName('ID').AsInteger;
end;
//*** Найти спецификацию для компоненты по совпадающим артик. номерам и ценам
while Not MemTable_RSpecification.Eof do
begin
if (MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString = Component.ArticulProducer) and
(MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString = Component.ArticulDistributor) and
//(((Component.IsLine = biTrue) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCostPerOneNorm) < CmpDelta)) or
// ((Component.IsLine = biFalse) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCost) < CmpDelta))) and
(Abs(MemTable_RSpecification.FieldByName(fnPrice).AsFloat - Component.Price) < CmpDelta) and
(MemTable_RSpecification.FieldByName('IZM').AsString = Component.Izm) and
(MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger = Component.ID_Producer) and
(MemTable_RSpecification.FieldByName('NAME').AsString = Component.Name) and
(MemTable_RSpecification.FieldByName('NAME_SHORT').AsString = Component.NameShort) then
begin
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
TypeKolvo := MemTable_RSpecification.FieldByName('KOLVO').AsFloat;
TypeCost := MemTable_RSpecification.FieldByName('COST').AsFloat;
CurrKolvo := 0;
MemTable_RSpecification.Edit;
case Component.IsLine of
biTrue:
CurrKolvo := Component.Length;
biFalse:
CurrKolvo := CurrKolvo + 1;
end;
TypeKolvo := TypeKolvo + CurrKolvo;
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := TypeKolvo;
MemTable_RSpecification.FieldByName('COST').AsFloat := TypeCost + Round3(CurrKolvo * MemTable_RSpecification.FieldByName(fnPrice).AsFloat);
MemTable_RSpecification.Post;
end;
MemTable_RSpecification.Next;
end;
//*** Если не найдена спецификация, то создается новая
if IDSpecification = -1 then
begin
MemTable_RSpecification.Append;
MemTable_RSpecification.FieldByName('ID').AsInteger := Component.ID;
MemTable_RSpecification.FieldByName('ID_MASTER').AsInteger := IDTypeSpecif;
MemTable_RSpecification.FieldByName('NAME').AsString := Component.Name;
MemTable_RSpecification.FieldByName('NAME_SHORT').AsString := Component.NameShort;
MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString := Component.ArticulProducer;
MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString := Component.ArticulDistributor;
MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger := Component.ID_Producer;
MemTable_RSpecification.FieldByName('PRODUCER').AsString := Component.GetProducerName;
MemTable_RSpecification.FieldByName('IZM').AsString := Component.Izm;
CurrKolvo := 1;
case Component.IsLine of
biTrue:
CurrKolvo := Component.Length;
biFalse:
CurrKolvo := 1;
end;
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := CurrKolvo;
MemTable_RSpecification.FieldByName('PRICE').AsFloat := Round3(Component.PRICE);
MemTable_RSpecification.FieldByName('COST').AsFloat := Round3(Round3(Component.PRICE) * CurrKolvo);
MemTable_RSpecification.Post;
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
end;
{
//*** Найти спецификацию для компоненты по совпадающим артик. номерам и ценам
while Not MemTable_RSpecification.Eof do
begin
if (MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString = Component.ArticulProducer) and
(MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString = Component.ArticulDistributor) and
(((Component.IsLine = biTrue) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCostPerOneNorm) < CmpDelta)) or
((Component.IsLine = biFalse) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCost) < CmpDelta))) and
(MemTable_RSpecification.FieldByName('IZM').AsString = Component.Izm) and
(MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger = Component.ID_Producer) and
(MemTable_RSpecification.FieldByName('NAME').AsString = Component.Name) and
(MemTable_RSpecification.FieldByName('NAME_SHORT').AsString = Component.NameShort) then
begin
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
CurrKolvo := MemTable_RSpecification.FieldByName('KOLVO').AsFloat;
CurrCost := MemTable_RSpecification.FieldByName('COST').AsFloat;
MemTable_RSpecification.Edit;
case Component.IsLine of
biTrue:
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(CurrKolvo + Component.Length, 2);
biFalse:
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(CurrKolvo + 1, 2);
end;
MemTable_RSpecification.FieldByName('COST').AsFloat := RoundX(CurrCost + Component.NormsResources.ResourcesCost, 2);
MemTable_RSpecification.Post;
end;
MemTable_RSpecification.Next;
end;
//*** Если не найдена спецификация, то создается новая
if IDSpecification = -1 then
begin
MemTable_RSpecification.Append;
MemTable_RSpecification.FieldByName('ID').AsInteger := Component.ID;
MemTable_RSpecification.FieldByName('ID_MASTER').AsInteger := IDTypeSpecif;
MemTable_RSpecification.FieldByName('NAME').AsString := Component.Name;
MemTable_RSpecification.FieldByName('NAME_SHORT').AsString := Component.NameShort;
MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString := Component.ArticulProducer;
MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString := Component.ArticulDistributor;
MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger := Component.ID_Producer;
MemTable_RSpecification.FieldByName('PRODUCER').AsString := Component.GetProducerName;
MemTable_RSpecification.FieldByName('IZM').AsString := Component.Izm;
case Component.IsLine of
biTrue:
begin
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(Component.Length, 2);
MemTable_RSpecification.FieldByName('PRICE').AsFloat := RoundX(Component.NormsResources.ResourcesCostPerOneNorm, 2);
end;
biFalse:
begin
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := 1;
MemTable_RSpecification.FieldByName('PRICE').AsFloat := RoundX(Component.NormsResources.ResourcesCost, 2);
end;
end;
MemTable_RSpecification.FieldByName('COST').AsFloat := RoundX(Component.NormsResources.ResourcesCost, 2);
MemTable_RSpecification.Post;
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
end; }
case Component.IsLine of
biTrue:
for j := 0 to Component.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := Component.WholeComponent[j];
ListWithLookedCompons.Add(ptrID);
end;
biFalse:
begin
New(ptrID);
ptrID^ := Component.ID;
ListWithLookedCompons.Add(ptrID);
end;
end;
end;
end;
end;
end;
MemTable_RSpecifTypeCompon.SortOn(fnName, []);
finally
EndProgress;
FreeList(ListWithLookedCompons);
end;
GFormMode := fmRSpecification;
Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog(': '+E.Message);
end;
end; *)
(*
// ##### Отчет "Спецификация" #####
procedure TF_ResourceReport.ShowFolderSpecificationReport(AFolder: TSCSCatalog);
const CmpDelta = 0.0001;
var FolderIDComponList: TList;
ListWithLookedCompons: TList;
ptrID: ^Integer;
CurrIDCompon: Integer;
Component: TSCSComponent;
TypeSpecifList: TList;
i, j: Integer;
IDTypeSpecif: integer;
IDObject: Integer;
IDSpecification: Integer;
CurrKolvo: Double;
CurrCost: Double;
begin
try
try
Component := nil;
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
FolderIDComponList := Tlist.Create;
ListWithLookedCompons := TList.Create;
Component := TSCSComponent.Create(GForm);
//*** Найти все кмопоненты папки
FolderIDComponList := GetFolderComponList(GForm, AFolder, [itSCSLine, itSCSConnector]);
if FolderIDComponList = nil then
Exit; //// EXIT /////
MemTable_RSpecifTypeCompon.Active := false;
MemTable_RSpecifTypeCompon.Active := true;
MemTable_RSpecification.Active := false;
MemTable_RSpecification.Active := true;
Screen.Cursor := crHourGlass;
try
for i := 0 to FolderIDComponList.Count - 1 do
begin
CurrIDCompon := Integer(FolderIDComponList.Items[i]^);
if CheckNoIDinList(CurrIDCompon, ListWithLookedCompons) then
begin
Component.LoadComponentByID(CurrIDCompon, false);
Component.LoadOwnerCatalog(false);
if Component.IsLine = biTrue then
begin
Component.LoadWholeComponent(false);
Component.LoadWholeLength(true);
end;
Component.NormsResources.CalcResourcesCost(true, true);
if Component.NormsResources.ResourcesCost > 0 then
begin
IDTypeSpecif := -1;
IDObject := -1;
IDSpecification := -1;
CurrKolvo := 0;
CurrCost := 0;
//*** Найти тип спецификации
MemTable_RSpecifTypeCompon.First;
while Not MemTable_RSpecifTypeCompon.Eof do
begin
if MemTable_RSpecifTypeCompon.FieldByName('id_component_type').AsInteger = Component.ID_ComponentType then
begin
IDTypeSpecif := MemTable_RSpecifTypeCompon.FieldByName('id').AsInteger;
Break; ///// BREAK /////
end;
MemTable_RSpecifTypeCompon.Next;
end;
//*** Если тип не найден, то создать его
if IDTypeSpecif = -1 then
begin
Component.LoadComponentType;
MemTable_RSpecifTypeCompon.Append;
//*** ID - AutoInc
MemTable_RSpecifTypeCompon.FieldByName('name').AsString := Component.ComponentType.NAME;
MemTable_RSpecifTypeCompon.FieldByName('id_component_type').AsInteger := Component.ID_ComponentType;
MemTable_RSpecifTypeCompon.Post;
IDTypeSpecif := MemTable_RSpecifTypeCompon.FieldByName('ID').AsInteger;
end;
{
//*** Найти объект, для Компонента
while Not MemTable_RObject.Eof do
begin
if ((Component.ID_ComponentType = ctWorkPlace) and
(MemTable_RObject.FieldByName('ID_CATALOG').AsInteger = TSCSCatalog(Component.OwnerCatalog).ID)) then
begin
IDObject := MemTable_RObject.FieldByName('ID').AsInteger;
Break; ///// BREAK //////
end;
if Component.ID_ComponentType <> ctWorkPlace then
begin
IDObject := MemTable_RObject.FieldByName('ID').AsInteger;
if IDObject <> TSCSCatalog(Component.OwnerCatalog).ID then
begin
MemTable_RObject.Edit;
MemTable_RObject.FieldByName('NAME').AsString := '';
MemTable_RObject.Post;
end;
Break; ///// BREAK //////
end;
MemTable_RObject.Next;
end;
//*** Если объект для этого компонента небыл найден
if IDObject = -1 then
begin
MemTable_RObject.Append;
MemTable_RObject.FieldByName('ID_MASTER').AsInteger := IDTypeSpecif;
MemTable_RObject.FieldByName('ID_CATALOG').AsInteger := TSCSCatalog(Component.OwnerCatalog).ID;
MemTable_RObject.FieldByName('NAME').AsString := GetNameAndIndexByTSCSCatalog(Component.OwnerCatalog);
//if Component.ID_ComponentType = ctWorkPlace then
// MemTable_RObject.FieldByName('NAME').AsString := GetNameAndIndexByTSCSCatalog(Component.OwnerCatalog) //TSCSCatalog(Component.OwnerCatalog).Name
//else
// MemTable_RObject.FieldByName('NAME').AsString := '';
MemTable_RObject.Post;
IDObject := MemTable_RObject.FieldByName('ID').AsInteger;
end; }
//*** Найти спецификацию для компоненты по совпадающим артик. номерам и ценам
while Not MemTable_RSpecification.Eof do
begin
if (MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString = Component.ArticulProducer) and
(MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString = Component.ArticulDistributor) and
(((Component.IsLine = biTrue) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCostPerOneNorm) < CmpDelta)) or
((Component.IsLine = biFalse) and (Abs(MemTable_RSpecification.FieldByName('PRICE').AsFloat - Component.NormsResources.ResourcesCost) < CmpDelta))) and
(MemTable_RSpecification.FieldByName('IZM').AsString = Component.Izm) and
(MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger = Component.ID_Producer) and
(MemTable_RSpecification.FieldByName('NAME').AsString = Component.Name) and
(MemTable_RSpecification.FieldByName('NAME_SHORT').AsString = Component.NameShort) then
begin
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
CurrKolvo := MemTable_RSpecification.FieldByName('KOLVO').AsFloat;
CurrCost := MemTable_RSpecification.FieldByName('COST').AsFloat;
MemTable_RSpecification.Edit;
case Component.IsLine of
biTrue:
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(CurrKolvo + Component.Length, 2);
biFalse:
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(CurrKolvo + 1, 2);
end;
MemTable_RSpecification.FieldByName('COST').AsFloat := RoundX(CurrCost + Component.NormsResources.ResourcesCost, 2);
MemTable_RSpecification.Post;
end;
MemTable_RSpecification.Next;
end;
//*** Если не найдена спецификация, то создается новая
if IDSpecification = -1 then
begin
MemTable_RSpecification.Append;
MemTable_RSpecification.FieldByName('ID').AsInteger := Component.ID;
MemTable_RSpecification.FieldByName('ID_MASTER').AsInteger := IDTypeSpecif;
MemTable_RSpecification.FieldByName('NAME').AsString := Component.Name;
MemTable_RSpecification.FieldByName('NAME_SHORT').AsString := Component.NameShort;
MemTable_RSpecification.FieldByName('ARTICUL_PRODUCER').AsString := Component.ArticulProducer;
MemTable_RSpecification.FieldByName('ARTICUL_DISTRIBUTOR').AsString := Component.ArticulDistributor;
MemTable_RSpecification.FieldByName('ID_PRODUCER').AsInteger := Component.ID_Producer;
MemTable_RSpecification.FieldByName('PRODUCER').AsString := Component.GetProducerName;
MemTable_RSpecification.FieldByName('IZM').AsString := Component.Izm;
case Component.IsLine of
biTrue:
begin
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := RoundX(Component.Length, 2);
MemTable_RSpecification.FieldByName('PRICE').AsFloat := RoundX(Component.NormsResources.ResourcesCostPerOneNorm, 2);
end;
biFalse:
begin
MemTable_RSpecification.FieldByName('Kolvo').AsFloat := 1;
MemTable_RSpecification.FieldByName('PRICE').AsFloat := RoundX(Component.NormsResources.ResourcesCost, 2);
end;
end;
MemTable_RSpecification.FieldByName('COST').AsFloat := RoundX(Component.NormsResources.ResourcesCost, 2);
MemTable_RSpecification.Post;
IDSpecification := MemTable_RSpecification.FieldByName('ID').AsInteger;
end;
case Component.IsLine of
biTrue:
for j := 0 to Component.WholeComponent.Count - 1 do
begin
New(ptrID);
ptrID^ := Integer(Component.WholeComponent[j]^);
ListWithLookedCompons.Add(ptrID);
end;
biFalse:
begin
New(ptrID);
ptrID^ := Component.ID;
ListWithLookedCompons.Add(ptrID);
end;
end;
end;
end;
end;
finally
Screen.Cursor := crHourGlass;
end;
GFormMode := fmRSpecification;
Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog(': '+E.Message);
end;
finally
FreeList(ListWithLookedCompons);
FreeList(FolderIDComponList);
if Component <> nil then
Component.Free;
end;
end;
*)
procedure TF_ResourceReport.ShowFolderExplanatoryReport(AFolder: TSCSCatalog; AParams: TReportItemParams);
var
CurrencyM: TCurrency;
CurrencyS: TCurrency;
ProjectID: Integer;
i: Integer;
ProjectOwner: TSCSProject;
SprCurrency: TNBCurrency;
SCSLists: TSCSCatalogs;
SCSList: TSCSCatalog;
SCSObject: TSCSCatalog;
// Added by Tolik
// стоимость материалов, ресурсов, работ и общая стоимость - из названия понятно...
TotalCost,MaterialsCost,WorksCost,ResourcesCost : double;
Main_TotalCost,Main_MaterialsCost,Main_WorksCost,Main_ResourcesCost : double;
NormResources: TSCSNormsResources;
ResourceRel: TSCSResourceRel;
Price, Kolvo : double;
ResourceCompon: TSCSComponent;
SprSuppliesKind: TNBSuppliesKind;
GroupedNorms: TSCSNormsResources;
GroupNorm: TSCSNorm;
Component : TSCSCatalog;
{ ProjectOwner: TSCSProject;
OldTick, CurrTick: Cardinal;
TotalCost: Double;
InterfaceNormList: TList;
CurrInterfaceNormList: TList;
TempList: TList;
SCSComponent: TSCSComponent;
SCSCatalog: TSCSCatalog;
TraceLength: Double;
Interfac: TSCSInterface;
ptrJoinedInterf: TSCSInterface;
ptrComplectInterf: TSCSInterface;
ptrResultInterface: TSCSInterface;
//IOfIRel: TSCSIOfIRel;
ptrInterfaceNormInfo: PInterfaceNormInfo;
ptrInterfaceNormInfoI: PInterfaceNormInfo;
ptrInterfaceNormInfoJ: PInterfaceNormInfo;
}
{
procedure AddListToExplanatoryReport(AList: TSCSList);
begin
mtExplanatoryList.Append;
mtExplanatoryList.FieldByName(fnID).AsInteger := AList.ID;
mtExplanatoryList.FieldByName(fnProjectID).AsInteger := ProjectID;
mtExplanatoryList.FieldByName(fnMarkID).AsInteger := AList.MarkID;
mtExplanatoryList.FieldByName(fnName).AsString := AList.GetNameForVisible;
mtExplanatoryList.FieldByName(fnHeightRoom).AsFloat := Round2(FloatInUOM(AList.Setting.HeightRoom, umMetr, TF_Main(GForm).FUOM)); //Высота этажа
mtExplanatoryList.FieldByName(fnHeightCeiling).AsFloat := Round2(FloatInUOM(AList.Setting.HeightCeiling, umMetr, TF_Main(GForm).FUOM)); //Высота фальш потолка
mtExplanatoryList.FieldByName(fnHeightSocket).AsFloat := Round2(FloatInUOM(AList.Setting.HeightSocket, umMetr, TF_Main(GForm).FUOM)); //Высота размещ точ объектов
mtExplanatoryList.FieldByName(fnHeightCorob).AsFloat := Round2(FloatInUOM(AList.Setting.HeightCorob, umMetr, TF_Main(GForm).FUOM)); //Высота размещ трасс
mtExplanatoryList.FieldByName(fnCableCanalFullnessKoef).AsFloat := AList.Setting.CableCanalFullnessKoef; //Коэффициент заполненности кабельных каналов
mtExplanatoryList.FieldByName(fnLengthKoef).AsFloat := AList.Setting.LengthKoef; //Процент запаса длины кабеля
mtExplanatoryList.FieldByName(fnPortReserv).AsFloat := Round2(FloatInUOM(AList.Setting.PortReserv, umMetr, TF_Main(GForm).FUOM)); //Резерв со стороны порта
mtExplanatoryList.FieldByName(fnMultiportReserv).AsFloat := Round2(FloatInUOM(AList.Setting.MultiportReserv, umMetr, TF_Main(GForm).FUOM)); //Резерв со стороны мультипорта
mtExplanatoryList.FieldByName(fnTwistedPairMaxLength).AsFloat := Round2(FloatInUOM(AList.Setting.TwistedPairMaxLength, umMetr, TF_Main(GForm).FUOM)); //Ограничение по максимальной длине (для витой пары)
mtExplanatoryList.Post;
end;
}
procedure AddListToExplanatoryReport(AList: TSCSList);
var i,j,k : integer;
Compon : TSCSComponent;
ComponCount, ComponPrice : double;
MKolvo: Double;
ExpenseForMetr_L: Double;
begin
if AList.IsNormalType then // Tolik 31/08/2020 -- добавлена проверка листа, потому что иначе в отчет попадают
// все листы проекта, в том числе, например, листы с дизайном шкафа ...
begin
TotalCost := 0;
MaterialsCost := 0;
WorksCost := 0;
ResourcesCost := 0;
ComponPrice := 0;
ComponCount := 0;
//работы
GroupedNorms := AList.GetAllNormsResources([nrNorms], false, true,
false, true, false, true, false, True);
for i := 0 to GroupedNorms.Norms.Count - 1 do
begin
GroupNorm := GroupedNorms.Norms[i];
WorksCost := WorksCost + GroupNorm.Price*GroupNorm.Kolvo;
end;
NormResources := AList.GetAllNormsResources([nrResources, nrAccessories, nrComponents], false,
true, true, true, false, true, true);
//Tolik 13/10/2020 -- а от здеся может быть бо-бо...проверять нуно!
if NormResources <> nil then
begin
//
for i := 0 to NormResources.Resources.Count - 1 do
begin
ResourceRel := NormResources.Resources[i];
ResourceCompon := nil;
if ResourceRel.ServIsResource then
if TSCSResourceGroup(ResourceRel).ObjectList.Count > 0 then
if TSCSResourceGroup(ResourceRel).ObjectList[0] is TSCSComponent then
begin
ResourceCompon := TSCSComponent(TSCSResourceGroup(ResourceRel).ObjectList[0]);
end;
if ResourceCompon <> nil then
begin
SprSuppliesKind := nil;
if ResourceRel.GUIDSuppliesKind <> '' then
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(ResourceRel.GUIDSuppliesKind);
//*** Учитывать поставочные величины
if SprSuppliesKind <> nil then
begin
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
begin
ResourceRel.Izm := SprSuppliesKind.Data.NameTradUOM;
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
// Для кабелей и каналов в традиционной системы США нужно юзать ФУТЫ
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := FloatInUOM(ResourceRel.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
end
else
begin
ResourceRel.Izm := SprSuppliesKind.Data.Name;
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvo;
end;
ResourceRel.CalcCost;
end
else
begin
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
ResourceRel.Izm := GetNameUOM(TF_Main(GForm).FUOM, true);
if TF_Main(GForm).FUOM <> umMetr then
begin
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, TF_Main(GForm).FUOM);
ResourceRel.Price := FloatInUOM(ResourceRel.Price, TF_Main(GForm).FUOM, umMetr);
ResourceRel.CalcCost;
end;
end;
end;
end;
end;
// стоимость ресурсов
for i := 0 to NormResources.Resources.Count - 1 do
begin
// отбираем cтоимость ресурсов (лист)
if NormResources.Resources[i].ServIsResource then
begin
ResourceRel := NormResources.Resources[i];
Kolvo := RoundX(ResourceRel.Kolvo,4);
Price := RoundX(ResourceRel.Price, 4);
ResourcesCost := ResourcesCost+RoundX(Kolvo*Price,2);
end;
end;
Main_ResourcesCost := Main_ResourcesCost+ResourcesCost;
end;
// стоимость работ (лист)
// вытаскиваем стоимость работ из всех компонентов на листе
{ for i := 0 to AList.ChildCatalogs.Count-1 do
begin
for j := 0 to AList.ChildCatalogs[i].ComponentReferences.Count - 1 do
begin
for k := 0 to AList.ChildCatalogs[i].ComponentReferences[j].NormsResources.Norms.Count -1 do
begin
WorksCost := WorksCost + AList.ChildCatalogs[i].ComponentReferences[j].NormsResources.Norms[k].Price*
AList.ChildCatalogs[i].ComponentReferences[j].NormsResources.Norms[k].Kolvo;
end;
end;
end;
}
WorksCost := RoundX(WorksCost,2);
Main_WorksCost := Main_WorksCost + WorksCost;
// стоимость материалов (лист)
for i := 0 to AList.ComponentReferences.Count - 1 do
begin
//if AList.ComponentReferences[i].IsLine=bitrue then
// MaterialsCost := MaterialsCost+(AList.ComponentReferences[i].Price*AList.ComponentReferences[i].Length)
//else
// MaterialsCost := MaterialsCost+(AList.ComponentReferences[i].Price);
//RoundCP((Price + AdditionalPrice) * Kolvo);
//Tolik
// по типу сети
if AllNetTypes then
begin
if AList.ComponentReferences[i].IsLine=bifalse then
begin
MKolvo := 1;
if ((AList.ComponentReferences[i].ComponentType.SysName = ctsnCableChannelAccessory) or
(AList.ComponentReferences[i].ComponentType.SysName = ctsnAccessory)) then
begin
ExpenseForMetr_L := AList.ComponentReferences[i].GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
MKolvo := Round(AList.ComponentReferences[i].Length * ExpenseForMetr_L);
end
end;
MaterialsCost := MaterialsCost + RoundCP((AList.ComponentReferences[i].Price) * MKolvo);
end
else
begin
// Расход на ед.длины
ExpenseForMetr_L := AList.ComponentReferences[i].GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
MKolvo := Round(AList.ComponentReferences[i].Length * ExpenseForMetr_L);
end
else
MKolvo := AList.ComponentReferences[i].Length;
MaterialsCost := MaterialsCost + RoundCP((AList.ComponentReferences[i].Price) * MKolvo);
end;
end
else
begin
if NetTypeGuidListSelected.IndexOf(AList.ComponentReferences[i].GUIDNetType) <> -1 then
begin
if AList.ComponentReferences[i].IsLine=bifalse then
begin
MKolvo := 1;
if ((AList.ComponentReferences[i].ComponentType.SysName = ctsnCableChannelAccessory) or
(AList.ComponentReferences[i].ComponentType.SysName = ctsnAccessory)) then
begin
ExpenseForMetr_L := AList.ComponentReferences[i].GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
MKolvo := Round(AList.ComponentReferences[i].Length * ExpenseForMetr_L);
end
end;
MaterialsCost := MaterialsCost + RoundCP((AList.ComponentReferences[i].Price) * MKolvo);
end
else
begin
// Расход на ед.длины
ExpenseForMetr_L := AList.ComponentReferences[i].GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
MKolvo := Round(AList.ComponentReferences[i].Length * ExpenseForMetr_L);
end
else
MKolvo := AList.ComponentReferences[i].Length;
MaterialsCost := MaterialsCost + RoundCP((AList.ComponentReferences[i].Price) * MKolvo);
end;
end;
end;
end;
MaterialsCost := Roundx(MaterialsCost, 2);
Main_MaterialsCost := Main_MaterialsCost + MaterialsCost;
TotalCost := MaterialsCost + WorksCost + ResourcesCost;
Main_TotalCost := Main_TotalCost + TotalCost;
mtExplanatoryList.Append;
mtExplanatoryList.FieldByName(fnID).AsInteger := AList.ID;
mtExplanatoryList.FieldByName(fnProjectID).AsInteger := ProjectID;
mtExplanatoryList.FieldByName(fnMarkID).AsInteger := AList.MarkID;
mtExplanatoryList.FieldByName(fnName).AsString := AList.GetNameForVisible;
mtExplanatoryList.FieldByName(fnHeightRoom).AsFloat := Round2(FloatInUOM(AList.Setting.HeightRoom, umMetr, TF_Main(GForm).FUOM)); //Высота этажа
mtExplanatoryList.FieldByName(fnHeightCeiling).AsFloat := Round2(FloatInUOM(AList.Setting.HeightCeiling, umMetr, TF_Main(GForm).FUOM)); //Высота фальш потолка
mtExplanatoryList.FieldByName(fnHeightSocket).AsFloat := Round2(FloatInUOM(AList.Setting.HeightSocket, umMetr, TF_Main(GForm).FUOM)); //Высота размещ точ объектов
mtExplanatoryList.FieldByName(fnHeightCorob).AsFloat := Round2(FloatInUOM(AList.Setting.HeightCorob, umMetr, TF_Main(GForm).FUOM)); //Высота размещ трасс
mtExplanatoryList.FieldByName(fnCableCanalFullnessKoef).AsFloat := AList.Setting.CableCanalFullnessKoef; //Коэффициент заполненности кабельных каналов
mtExplanatoryList.FieldByName(fnLengthKoef).AsFloat := AList.Setting.LengthKoef; //Процент запаса длины кабеля
mtExplanatoryList.FieldByName(fnPortReserv).AsFloat := Round2(FloatInUOM(AList.Setting.PortReserv, umMetr, TF_Main(GForm).FUOM)); //Резерв со стороны порта
mtExplanatoryList.FieldByName(fnMultiportReserv).AsFloat := Round2(FloatInUOM(AList.Setting.MultiportReserv, umMetr, TF_Main(GForm).FUOM)); //Резерв со стороны мультипорта
mtExplanatoryList.FieldByName(fnTwistedPairMaxLength).AsFloat := Round2(FloatInUOM(AList.Setting.TwistedPairMaxLength, umMetr, TF_Main(GForm).FUOM)); //Ограничение по максимальной длине (для витой пары)
// added by Tolik
mtExplanatoryList.FieldByName(fnMaterialsCost).AsFloat := MaterialsCost;
mtExplanatoryList.FieldByName(fnResourcesCost).AsFloat := ResourcesCost;
mtExplanatoryList.FieldByName(fnWorksCost).AsFloat := WorksCost;
mtExplanatoryList.FieldByName(fnTotalCost).AsFloat := TotalCost;
mtExplanatoryList.Post;
end;
end;
begin
if TF_Main(GForm).GDBMode <> bkProjectManager then
Exit; ///// EXIT /////
if Not CheckCanShowReport(AFolder) then
Exit; ///// EXIT /////
try
Main_TotalCost :=0;
Main_MaterialsCost := 0;
Main_WorksCost := 0;
Main_ResourcesCost := 0;
FCatalog := AFolder;
ProjectOwner := nil;
BeginProgress(pcPreparingReport);
try
//Tolik
INeedNormsRecources := True;
//
mtExplanatoryList.Active := false;
mtExplanatoryProj.Active := false;
mtExplanatoryProj.Active := true;
mtExplanatoryList.Active := true;
//свойства проекта
mtExplanatoryProj.Append;
if AFolder.ItemType = itProject then
begin
ProjectOwner := TSCSProject(AFolder);
ZeroMemory(@CurrencyM, SizeOf(TCurrency));
ZeroMemory(@CurrencyS, SizeOf(TCurrency));
SprCurrency := ProjectOwner.Spravochnik.GetCurrencyByType(ctMain);
if SprCurrency <> nil then
CurrencyM := SprCurrency.Data
else
CurrencyM := F_NormBase.DM.GetCurrencyByID(TSCSProject(AFolder).Setting.IDCurrency);
SprCurrency := ProjectOwner.Spravochnik.GetCurrencyByType(ctSecond);
if SprCurrency <> nil then
CurrencyS := SprCurrency.Data
else
CurrencyS := F_NormBase.DM.GetCurrencyByID(TSCSProject(AFolder).Setting.CurrensySID);
ProjectID := TSCSProject(AFolder).ID;
mtExplanatoryProj.FieldByName(fnMarkID).AsInteger := TSCSProject(AFolder).MarkID;
mtExplanatoryProj.FieldByName(fnName).AsString := TSCSProject(AFolder).GetNameForVisible;
mtExplanatoryProj.FieldByName(fnCurrencyMName).AsString := CurrencyM.Name;
mtExplanatoryProj.FieldByName(fnCurrencySName).AsString := CurrencyS.Name;
mtExplanatoryProj.FieldByName(fnNDS).AsFloat := TSCSProject(AFolder).Setting.NDS;
mtExplanatoryProj.FieldByName(fnCustomerName).AsString := TSCSProject(AFolder).Setting.CustomerName;
mtExplanatoryProj.FieldByName(fnContractorName).AsString := TSCSProject(AFolder).Setting.ContractorName;
mtExplanatoryProj.FieldByName(fnHeightThroughFloor).AsFloat := Round2(FloatInUOM(TSCSProject(AFolder).Setting.HeightThroughFloor, umMetr, TF_Main(GForm).FUOM));
mtExplanatoryProj.FieldByName(fnIsVisible).AsBoolean := true;
end
else
begin
if AFolder.GetTopParentCatalog <> nil then
ProjectID := AFolder.GetTopParentCatalog.ID;
mtExplanatoryProj.FieldByName(fnIsVisible).AsBoolean := false;
end;
mtExplanatoryProj.FieldByName(fnID).AsInteger := ProjectID;
mtExplanatoryProj.Post;
if AFolder.ItemType = itProject then
begin
for i := 0 to TSCSProject(AFolder).ProjectLists.Count - 1 do
AddListToExplanatoryReport(TSCSProject(AFolder).ProjectLists[i]);
end
else
if AFolder.ItemType = itList then
AddListToExplanatoryReport(TSCSList(AFolder))
else
if AFolder.ItemType = itDir then
begin
SCSLists := GetChildCatalogsInPlacingOrder(AFolder, [itList]);
for i := 0 to SCSLists.Count - 1 do
begin
SCSList := SCSLists[i];
if SCSList is TSCSCatalog then
AddListToExplanatoryReport(TSCSList(SCSList));
end;
FreeAndNil(SCSLists);
end;
finally
//Tolik
INeedNormsRecources := False;
//
EndProgress;
end;
mtExplanatoryProj.Edit;
mtExplanatoryProj.FieldByName(fnMaterialsCost).AsFloat := Main_MaterialsCost;
mtExplanatoryProj.FieldByName(fnResourcesCost).AsFloat := Main_ResourcesCost;
mtExplanatoryProj.FieldByName(fnWorksCost).AsFloat := Main_WorksCost;
mtExplanatoryProj.FieldByName(fnTotalCost).AsFloat := Main_TotalCost;
mtExplanatoryProj.Post;
GFormMode := fmRExplanatoryReport;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowFolderExplanatoryReport: '+E.Message);
end;
end;
procedure TF_ResourceReport.ShowPriorCostOfProjectReport(AParams: TReportItemParams);
begin
try
SortMemTableByParams(mtReport, AParams, nil);
GFormMode := fmRPriorCostOfProject;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowPriorCostOfProjectReport', E.Message);
end;
end;
procedure TF_ResourceReport.ShowPriorCostOfProjectReportWizard(AMemTable, ATotalParams: TkbmMemTable;
ACostOfProjectReportParams: TCostOfProjectReportParams; AShowTotalParams, AShowTemplates: Boolean);
begin
try
if AMemTable <> nil then
begin
//mtReport.Active := false;
// mtReport.FieldDefs.Clear;
// mtReport.FieldDefs.Assign(AMemTable.FieldDefs);
// mtReport.LoadFromDataSet(AMemTable, []);
// mtReport.Active := true;
FCostOfProjectReportParams := ACostOfProjectReportParams;
mtReportDetail.MasterSource := nil;
mtReportDetail.MasterFields := '';
AssignMemTable(mtReport, AMemTable, true);
if AShowTotalParams then
AssignMemTable(mtReportFirst, ATotalParams, true)
else
begin
mtReportFirst.Active := false;
mtReportFirst.FieldDefs.Assign(ATotalParams.FieldDefs);
mtReportFirst.Active := true;
end;
// В mtReport оставляем материалы, а в mtReportDetail перекидываем нормы
//mtReportDetail.Active := false;
//mtReportDetail.FieldDefs.Assign(mtReport.FieldDefs);
ShowWizard([rkCalc], AShowTemplates);
//if mtReportFirst.Active then
// mtReportFirst.Close;
//mtReport.Close;
end;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowPriorCostOfProjectReportWizard', E.Message);
end;
end;
procedure TF_ResourceReport.ShowMarkPages(AFolder: TSCSCatalog; AParams: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode;
AReportItemParamValues: TReportItemParams);
var
CanHaveActiveComponents: Boolean;
CanHaveDismountAccount: Boolean;
SprCompType: TNBComponentType;
SCSCatalog: TSCSCatalog;
SCSCatalogFirst: TSCSCatalog;
SCSComponent: TSCSComponent;
ChildComponent: TSCSComponent;
TempComponent: TSCSComponent;
ComunicationCompon: TSCSComponent;
ComunicationComponInFirstSide: TSCSComponent;
ComunicationPort: TSCSInterface;
ComunicationPortMark: string;
LastSideCompon: TSCSComponent;
SocketFrameComponent: TSCSComponent; // Рамка розекти/порта
i, j: Integer;
CableMark: String;
RoomOwner: TSCSCatalog;
RoomOwnerFirst: TSCSCatalog;
RoomMark: String;
RoomMarkFirst: String;
ListOwner: TSCSList;
ListOwnerFirst: TSCSList;
ListMark: String;
ListMarkFirst: String;
LookedObjects: TRapList;
LookedWholeIDs: TIntList;
LookedSocketFrams: TSCSComponents;
LookedSocketFramsIndex: Integer;
RoomsOfSocketFrames: TRapList; // Список списков комнат, с которых идет подключение на рамки портов
SocketFrameRooms: TRapList; // Список комнат, с которых идет подключение на рамки портов
FindedForI: Boolean;
SocketFrameSysNames: TStringList;
IsLookedSocketFrame: Boolean;
mtRep: TkbmMemTable;
//Tolik 11/06/2024 -- не были цчтены порты, заданные количественно
{
procedure AddComponPortsToMemTable(AComponent: TSCSComponent);
var
i: Integer;
Interfac: TSCSInterface;
begin
for i := 0 to AComponent.Interfaces.Count - 1 do
begin
Interfac := AComponent.Interfaces[i];
if Interfac.IsPort = biTrue then
begin
AddStrToMemTable(mtRep, fnNameMark, IntToStrF(Interfac.NppPort, 2));
//mtRep.Append;
//mtRep.FieldByName(fnNameMark).AsString := IntToStrF(Interfac.NppPort, 2);
//mtRep.Post;
end;
end;
end;
}
procedure AddComponPortsToMemTable(AComponent: TSCSComponent);
var
i, j, kolvo: Integer;
Interfac: TSCSInterface;
begin
kolvo := -1;
for i := 0 to AComponent.Interfaces.Count - 1 do
begin
Interfac := AComponent.Interfaces[i];
if Interfac.IsPort = biTrue then
begin
if kolvo = -1 then
kolvo := Interfac.NppPort;
if Interfac.Kolvo = 1 then
begin
//AddStrToMemTable(mtRep, fnNameMark, IntToStrF(Interfac.NppPort, 2))
AddStrToMemTable(mtRep, fnNameMark, IntToStrF(kolvo, 2));
inc(kolvo);
end
else
begin
for j := 0 to Interfac.Kolvo - 1 do
begin
AddStrToMemTable(mtRep, fnNameMark, IntToStrF(kolvo, 2));
inc(kolvo);
end;
end;
//mtRep.Append;
//mtRep.FieldByName(fnNameMark).AsString := IntToStrF(Interfac.NppPort, 2);
//mtRep.Post;
end;
end;
end;
//
function GetRoomMark(ARoom: TSCSCatalog): String;
begin
Result := '';
if ARoom <> nil then
begin
if ARoom.NameShort <> '' then
Result := ARoom.NameShort
else
begin
if rbShowRoomName.Checked then
Result := ARoom.Name + IntToStr(ARoom.MarkID)
else
Result := edNoCabinetNameShort.Text;
end;
end
else
Result := edNoCabinet.Text;
end;
begin
try
mtRep := mtReport;
case AParams.Mode of
fmRMarkRoomTS:
mtRep := FmtMarkRoomTS;
fmRMarkPathPanel:
mtRep := FmtMarkPathPanel;
fmRMarkPathPanelPorts:
mtRep := FmtMarkPathPanelPorts;
fmRMarkSocket:
mtRep := FmtMarkSocket;
fmRMarkSocketPanel:
mtRep := FmtMarkSocketPanel;
fmRMarkCable:
mtRep := FmtMarkCable;
end;
mtRep.Active := false;
mtRep.FieldDefs.Clear;
mtRep.FieldDefs.Add(fnNameMark, ftString, 255);
mtRep.Active := true;
LookedObjects := TRapList.Create;
FCatalog := AFolder;
CanHaveActiveComponents := IntToBool(AReportItemParamValues.CanHaveActiveComponents);
CanHaveDismountAccount := IntToBool(AReportItemParamValues.CanHaveDismountAccount);
case AResourceReportFormMode of
fmRMarkRoomTS:
begin
// Перебераем все комнаты
for i := 0 to FCatalog.ChildCatalogReferences.Count - 1 do
begin
SCSCatalog := FCatalog.ChildCatalogReferences[i];
if SCSCatalog.ItemType = itRoom then
begin
FindedForI := false;
// Ищем телекомуникационное оборудование в кабинете
for j := 0 to SCSCatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSCatalog.ComponentReferences[j];
SprCompType := SCSComponent.ProjectOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
// Принадлежит ли тип к комуникационному оборудованию
if SprCompType <> nil then
if (SprCompType.ComponentType.SysName = ctsnCupBoard) or
IsPatchPanelSysName(SprCompType.ComponentType.SysName) or
(SprCompType.ComponentType.PortKind = pkMultiport) then
begin
ListOwner := SCSCatalog.GetListOwner;
if ListOwner <> nil then
begin
AddStrToMemTable(mtRep, fnNameMark, IntToStr(ListOwner.MarkID) + GetRoomMark(SCSCatalog));
end;
FindedForI := true;
Break; //// BREAK ////
end;
end;
if FindedForI then
Break; //// BREAK ////
end;
end;
end;
fmRMarkPathPanel:
begin
// Перебераем телекомуникационное оборудование
for i := 0 to FCatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := FCatalog.ComponentReferences[i];
SprCompType := SCSComponent.ProjectOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
// Принадлежит ли тип к ратч-панели или мультипорту
if SprCompType <> nil then
if IsPatchPanelSysName(SprCompType.ComponentType.SysName) or
(SprCompType.ComponentType.PortKind = pkMultiport) then
if LookedObjects.IndexOf(SCSComponent) = -1 then
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
AddStrToMemTable(mtRep, fnNameMark, SCSComponent.NameMark);
LookedObjects.Add(SCSComponent);
end;
end;
end;
fmRMarkPathPanelPorts:
begin
// Перебераем телекомуникационное оборудование
for i := 0 to FCatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := FCatalog.ComponentReferences[i];
SprCompType := SCSComponent.ProjectOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
// Принадлежит ли тип к ратч-панели или мультипорту
if SprCompType <> nil then
if IsPatchPanelSysName(SprCompType.ComponentType.SysName) or
(SprCompType.ComponentType.PortKind = pkMultiport) then
if LookedObjects.IndexOf(SCSComponent) = -1 then
begin
// Выносим все порты патчпанели
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
AddComponPortsToMemTable(SCSComponent);
for j := 0 to SCSComponent.ChildReferences.Count - 1 do
begin
ChildComponent := SCSComponent.ChildReferences[j];
if CheckCanLookComponInReportRsrc(ChildComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
AddComponPortsToMemTable(ChildComponent);
end;
LookedObjects.Add(SCSComponent);
end;
end;
end;
fmRMarkSocket, fmRMarkSocketPanel, fmRMarkCable:
begin
LookedWholeIDs := TIntList.Create;
SocketFrameSysNames := TStringList.Create;
SocketFrameSysNames.Add(ctsnSocket);
SocketFrameSysNames.Add(ctsnFrame);
LookedSocketFrams := TSCSComponents.Create(false);
RoomsOfSocketFrames := TRapList.Create;
// Перебераем все кабели
for i := 0 to FCatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := FCatalog.ComponentReferences[i];
if SCSComponent.IsLine = biTrue then
if LookedWholeIDs.IndexOf(SCSComponent.Whole_ID) = -1 then
begin
SCSComponent.LoadWholeComponent(false);
SCSComponent.DefineFirstLast;
if SCSComponent.LastConnectedConnCompon <> nil then
begin
// Получить парент телекоминационную панель или шкаф
ComunicationCompon := GetParentComunicationCompon(SCSComponent.LastConnectedConnCompon);
if ComunicationCompon <> nil then
begin
RoomOwner := nil;
ListOwner := nil;
RoomMark := '';
ListMark := '';
// Получаем Объект
SCSCatalog := ComunicationCompon.GetFirstParentCatalog;
if SCSCatalog <> nil then
begin
// Получаем кабинет
RoomOwner := SCSCatalog.GetParentCatalogByItemType(itRoom);
RoomMark := GetRoomMark(RoomOwner);
ListOwner := SCSCatalog.GetListOwner;
if ListOwner <> nil then
ListMark := IntToStr(ListOwner.MarkID);
end;
// Получаем порт панели, к которой подключен кабель
ComunicationPort := nil;
ComunicationPortMark := ' ';
LastSideCompon := SCSComponent.LastConnectedConnCompon.JoinedComponents.GetComponenByID(SCSComponent.LastIDCompon);
if LastSideCompon <> nil then
ComunicationPort := SCSComponent.LastConnectedConnCompon.GetPortJoinedToLine(LastSideCompon);
if ComunicationPort <> nil then
ComunicationPortMark := IntToStrF(ComunicationPort.NppPort, 2)
else
ComunicationPortMark := IntToStrF(SCSComponent.LastConnectedConnCompon.MarkID, 2);
case AResourceReportFormMode of
fmRMarkSocket, fmRMarkSocketPanel:
if SCSComponent.FirstConnectedConnCompon <> nil then
begin
if AResourceReportFormMode = fmRMarkSocket then
begin
if CheckCanLookComponInReportRsrc(SCSComponent.FirstConnectedConnCompon, CanHaveActiveComponents, CanHaveDismountAccount) then
if AReportItemParamValues.CanFloorNppWithRoom = biTrue then
AddStrToMemTable(mtRep, fnNameMark,
ListMark + RoomMark+'-'+ComunicationCompon.NameMark + ComunicationPortMark)
else
AddStrToMemTable(mtRep, fnNameMark, ComunicationCompon.NameMark + ComunicationPortMark)
end
else
if AResourceReportFormMode = fmRMarkSocketPanel then
begin
SocketFrameComponent := GetComponTopByCTSysNames(SCSComponent.FirstConnectedConnCompon, SocketFrameSysNames, true);
if SocketFrameComponent <> nil then
if CheckCanLookComponInReportRsrc(SocketFrameComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
IsLookedSocketFrame := false;
// Проверяем - была ли расмотрена такая панель с таким кабинетом
LookedSocketFramsIndex := LookedSocketFrams.IndexOf(SocketFrameComponent);
if LookedSocketFramsIndex <> -1 then
begin
SocketFrameRooms := RoomsOfSocketFrames[LookedSocketFramsIndex];
if SocketFrameRooms.IndexOf(RoomOwner) <> -1 then
IsLookedSocketFrame := true;
end;
if Not IsLookedSocketFrame then
begin
AddStrToMemTable(mtRep, fnNameMark, ListMark + RoomMark+'-');
// Занести рамку и комнату в список просмотренных
SocketFrameRooms := nil;
if LookedSocketFramsIndex = -1 then
begin
LookedSocketFrams.Add(SocketFrameComponent);
SocketFrameRooms := TRapList.Create;
RoomsOfSocketFrames.Add(SocketFrameRooms);
end
else
SocketFrameRooms := RoomsOfSocketFrames[LookedSocketFramsIndex];
if SocketFrameRooms <> nil then
if SocketFrameRooms.IndexOf(RoomOwner) = -1 then
SocketFrameRooms.Add(RoomOwner);
end;
end;
end;
end;
fmRMarkCable:
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
CableMark := '';
// Подключен ли кабель на обоих концах к телекомуникацтонной панеле
ComunicationComponInFirstSide := GetParentComunicationCompon(SCSComponent.FirstConnectedConnCompon);
// Выводим маркировку по формату fs1/fs2-n
if ComunicationComponInFirstSide <> nil then
begin
RoomOwnerFirst := nil;
ListOwnerFirst := nil;
RoomMarkFirst := '';
ListMarkFirst := '';
// Получаем Объект
SCSCatalogFirst := ComunicationComponInFirstSide.GetFirstParentCatalog;
if SCSCatalogFirst <> nil then
begin
// Получаем кабинет
RoomOwnerFirst := SCSCatalogFirst.GetParentCatalogByItemType(itRoom);
RoomMarkFirst := GetRoomMark(RoomOwnerFirst);
ListOwnerFirst := SCSCatalogFirst.GetListOwner;
if ListOwnerFirst <> nil then
ListMarkFirst := IntToStr(ListOwnerFirst.MarkID);
end;
if (ListMark+RoomMark) < (ListMarkFirst+RoomMarkFirst) then
CableMark := ListMark + RoomMark +'/'+ ListMarkFirst + RoomMarkFirst
else
CableMark := ListMarkFirst + RoomMarkFirst +'/'+ ListMark + RoomMark;
CableMark := CableMark +'-'+IntToStr(SCSComponent.MarkID);
end
else
// Ввыводить маркировку по формату fs-an
begin
CableMark := ListMark + RoomMark +'-'+ ComunicationCompon.NameMark + ComunicationPortMark;
end;
if CableMark <> '' then
begin
AddStrToMemTable(mtRep, fnNameMark, CableMark);
if AReportItemParamValues.CanInTwoCopies = biTrue then
AddStrToMemTable(mtRep, fnNameMark, CableMark);
end;
end;
end;
end;
end;
LookedWholeIDs.Add(SCSComponent.Whole_ID);
end;
end;
// Очистить SocketFrameRooms
for i := 0 to RoomsOfSocketFrames.Count - 1 do
TObject(RoomsOfSocketFrames[i]).Free;
RoomsOfSocketFrames.Free;
FreeAndNil(LookedSocketFrams);
FreeAndNil(SocketFrameSysNames);
FreeAndNil(LookedWholeIDs);
end;
end;
if cbSortOn.Checked then // Tolik 13/06/2024
mtRep.SortOn(fnNameMark, []);
FreeAndNil(LookedObjects);
GFormMode := AResourceReportFormMode;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowMarkPages', E.Message);
end;
end;
procedure TF_ResourceReport.ShowExplicationRoom(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
var
CatalogList: TSCSCatalogs;
SCSCatalog: TSCSCatalog;
SCSList: TSCSList;
SCSRoom: TSCSCatalog;
HeightRoom: Double;
SquareInside: Double;
IsLoadedMaster: Boolean;
i, j: Integer;
mtRep: TkbmMemTable;
mtRepDetail: TkbmMemTable;
procedure SetRoomDataToMemTable(AMemTable: TkbmMemTable; AAppend: Boolean);
begin
if AAppend then
AMemTable.Append;
if AMemTable.State <> dsBrowse then
begin
AMemTable.FieldByName(fnFloor).AsInteger := SCSList.MarkID;
AMemTable.FieldByName(fnRoomNum).AsInteger := SCSRoom.MarkID;
AMemTable.FieldByName(fnNameShort).AsString := SCSRoom.NameShort;
AMemTable.FieldByName(fnAppointmentRoom).AsString := SCSRoom.Name;
AMemTable.FieldByName(fnSquareInside).AsFloat := RoundCP(FloatInUOM(SquareInside, umMetr, TF_Main(GForm).FUOM, 2));
AMemTable.FieldByName(fnHeightRoom).AsFloat := RoundCP(FloatInUOM(HeightRoom, umMetr, TF_Main(GForm).FUOM));
if AAppend then
AMemTable.Post;
end;
end;
begin
try
mtRep := FmtExplicationRoom; //mtReport;
mtRepDetail := FmtExplicationRoomDetail; //mtReportDetail;
ClearFieldsInMemTable(mtRep, mtRepDetail);
mtRep.FieldDefs.Add(fnID, ftAutoInc);
mtRep.FieldDefs.Add(fnFloor, ftInteger);
mtRep.FieldDefs.Add(fnRoomNum, ftInteger);
mtRep.FieldDefs.Add(fnNameShort, ftString, 255);
mtRep.FieldDefs.Add(fnAppointmentRoom, ftString, 255);
mtRep.FieldDefs.Add(fnSquareInside, ftFloat);
mtRep.FieldDefs.Add(fnHeightRoom, ftFloat);
mtRepDetail.FieldDefs.Add(fnIDMaster, ftInteger);
mtRepDetail.FieldDefs.Add(fnFloor, ftInteger);
mtRepDetail.FieldDefs.Add(fnRoomNum, ftInteger);
mtRepDetail.FieldDefs.Add(fnNameShort, ftString, 255);
mtRepDetail.FieldDefs.Add(fnAppointmentRoom, ftString, 255);
mtRepDetail.FieldDefs.Add(fnSquareInside, ftFloat);
mtRepDetail.FieldDefs.Add(fnHeightRoom, ftFloat);
ConnectDetailMemTable(FdsrcExplicationRoom, mtRepDetail, fnID, fnIDMaster);
mtRep.Active := true;
mtRepDetail.Active := true;
CatalogList := TSCSCatalogs.Create(false);
CatalogList.Add(ACatalog);
CatalogList.AddItems(ACatalog.ChildCatalogReferences);
BeginProgress(pcPreparingReport);
try
FCatalog := ACatalog;
for i := 0 to CatalogList.Count - 1 do
begin
SCSCatalog := CatalogList[i];
if (SCSCatalog.ItemType = itList) and (SCSCatalog is TSCSList) then
begin
SCSList := TSCSList(SCSCatalog);
IsLoadedMaster := false;
for j := 0 to SCSList.ChildCatalogReferences.Count - 1 do
begin
SCSCatalog := SCSList.ChildCatalogReferences[j];
if SCSCatalog.ItemType = itRoom then
begin
SCSRoom := SCSCatalog;
// Узнаем высоту кабинета
HeightRoom := SCSList.Setting.HeightRoom;
if SCSRoom.RoomSetting.HeightCeiling > 0 then
HeightRoom := SCSList.Setting.HeightRoom - SCSRoom.RoomSetting.HeightCeiling
else
HeightRoom := SCSList.Setting.HeightRoom - SCSList.Setting.HeightCeiling;
// Ищем площадь кабинета
SquareInside := GetRoomSquare(SCSList.CurrID, SCSRoom.SCSID);
if Not IsLoadedMaster then
begin
mtRep.Append;
//mtRep.FieldByName(fnFloor).AsInteger := SCSList.MarkID;
SetRoomDataToMemTable(mtRep, false);
mtRep.Post;
IsLoadedMaster := true;
end
else
begin
//SetRoomDataToMemTable(mtRepDetail, true);
//mtRepDetail.Append;
//mtRepDetail.FieldByName(fnRoomNum).AsInteger := SCSRoom.MarkID;
//mtRepDetail.FieldByName(fnAppointmentRoom).AsString := SCSRoom.Name;
//mtRepDetail.FieldByName(fnSquareInside).AsFloat := HeightRoom;
//mtRepDetail.FieldByName(fnHeightRoom).AsFloat := SquareInside;
//mtRepDetail.Post;
end;
SetRoomDataToMemTable(mtRepDetail, true);
end;
end;
end;
end;
finally
EndProgress;
end;
FreeAndNil(CatalogList);
// Отсортировать по этажам
mtRep.SortOn(fnFloor, []);
// Отсортировать кабинеты по этажу
SortMemTableByParams(mtRepDetail, AParams, AReportItemParamValues);
GFormMode := fmRExplicationRoom;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowExplicationRoom', E.Message);
end;
//ClearFieldsInMemTable(mtRep, mtRepDetail);
end;
procedure TF_ResourceReport.ShowExplicationComponentOLD(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
var
CanHaveActiveComponents: Boolean;
CanHaveDismountAccount: Boolean;
CatalogList: TSCSCatalogs;
SCSCatalog: TSCSCatalog;
SCSList: TSCSList;
SCSRoom: TSCSCatalog;
SCSObject: TSCSCatalog;
SCSComponent: TSCSComponent;
PartSCSComponent: TSCSComponent;
LookedWholeIDs: TIntList;
IsLoadedMaster: Boolean;
IsLoadedSubMaster: Boolean;
IsFindedCompType: Boolean;
ComponLists: TStringList;
ptrTwoID: PTwoID;
MaxListNumLength: Integer;
MaxRoomNumLength: Integer;
RoomMarkID: Integer;
FindedListRoom: Boolean;
IsInsertedRecord: Boolean;
RecordCount: Integer;
RecNo: Integer;
IsGroupByCompType: Boolean;
IsProjOrder: Boolean;
i, j, k, l: Integer;
mtRep: TkbmMemTable;
mtRepDetail: TkbmMemTable;
mtRepSubDetail: TkbmMemTable;
procedure SetComponDataToMemTable;
var
IsFindedCompType: Boolean;
begin
if Not IsLoadedMaster then
begin
mtRep.Append;
mtRep.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID);
if SCSRoom <> nil then
mtRep.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID)
else
mtRep.FieldByName(fnRoomNum).AsString := '';
mtRep.Post;
IsLoadedMaster := true;
end;
// Поиск типа компненты для текушего кабинета
IsFindedCompType := false;
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
if (IsGroupByCompType and
(mtRepDetail.FieldByName(fnGuidComponentType).AsString = SCSComponent.GUIDComponentType)) or
(Not IsGroupByCompType and
(mtRepDetail.FieldByName(fnGuidComponentType).AsString = '')) then
begin
IsFindedCompType := true;
Break; //// BREAK ////
end;
mtRepDetail.Next;
end;
if Not IsFindedCompType then
begin
mtRepDetail.Append;
if IsGroupByCompType then
begin
mtRepDetail.FieldByName(fnGuidComponentType).AsString := SCSComponent.GUIDComponentType;
mtRepDetail.FieldByName(fnName).AsString := SCSComponent.ComponentType.NamePlural;
end
else
mtRepDetail.FieldByName(fnGuidComponentType).AsString := '';
mtRepDetail.Post;
end;
if (SCSComponent.Whole_ID = 0) or Not mtRepSubDetail.Locate(fnWholeID, SCSComponent.Whole_ID, []) then
begin
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID);
if SCSRoom <> nil then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID)
else
mtRepSubDetail.FieldByName(fnRoomNum).AsString := '';
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnWholeID).AsInteger := SCSComponent.Whole_ID;
mtRepSubDetail.Post;
end;
end;
begin
try
mtRep := FmtExplicationCompon;
mtRepDetail := FmtExplicationComponDetail;
mtRepSubDetail := FmtExplicationComponSubDetail;
DisconnectDetailMemTable(mtRepSubDetail);
DisconnectDetailMemTable(mtRepDetail);
ClearFieldsInMemTable(mtRepSubDetail, nil);
ClearFieldsInMemTable(mtRepDetail, nil);
ClearFieldsInMemTable(mtRep, nil);
// Добавление общих палей
mtRep.FieldDefs.Add(fnID, ftAutoInc);
mtRep.FieldDefs.Add(fnFloor, ftString, 20);
mtRep.FieldDefs.Add(fnRoomNum, ftString, 20);
mtRep.FieldDefs.Add(fnMarkID, ftInteger);
mtRep.FieldDefs.Add(fnName, ftString, 255);
mtRep.FieldDefs.Add(fnNameMark, ftString, 255);
mtRepDetail.FieldDefs.Assign(mtRep.FieldDefs);
mtRepDetail.FieldDefs.Add(fnIDMaster, ftInteger);
mtRepSubDetail.FieldDefs.Assign(mtRepDetail.FieldDefs);
// Добавление дополнительных полей
mtRep.FieldDefs.Add(fnGuidComponentType, ftString, cnstGUIDLength);
mtRepDetail.FieldDefs.Add(fnGuidComponentType, ftString, cnstGUIDLength);
mtRepSubDetail.FieldDefs.Add(fnIDComponent, ftInteger);
mtRepSubDetail.FieldDefs.Add(fnObjectAddress, ftInteger);
mtRepSubDetail.FieldDefs.Add(fnWholeID, ftInteger);
ConnectDetailMemTable(FdsrcExplicationCompon, mtRepDetail, fnID, fnIDMaster);
ConnectDetailMemTable(FdsrcExplicationComponDetail, mtRepSubDetail, fnID, fnIDMaster);
mtRep.Active := true;
mtRepDetail.Active := true;
mtRepSubDetail.Active := true;
CanHaveActiveComponents := IntToBool(AReportItemParamValues.CanHaveActiveComponents);
CanHaveDismountAccount := IntToBool(AReportItemParamValues.CanHaveDismountAccount);
CatalogList := TSCSCatalogs.Create(false);
CatalogList.Add(ACatalog);
CatalogList.AddItems(ACatalog.ChildCatalogReferences);
SortSCSObjectsByPMOrder(CatalogList);
IsGroupByCompType := IntToBool(AReportItemParamValues.CanGroupByCompType);
IsProjOrder := IntToBool(AReportItemParamValues.CanAsPlacingInProj);
BeginProgress(pcPreparingReport);
try
FCatalog := ACatalog;
if IsProjOrder then
begin
for i := 0 to CatalogList.Count - 1 do
begin
SCSCatalog := CatalogList[i];
if (SCSCatalog.ItemType = itList) and (SCSCatalog is TSCSList) then
begin
SCSList := TSCSList(SCSCatalog);
IsLoadedMaster := false;
for j := 0 to SCSList.ChildCatalogs.Count - 1 do
begin
SCSCatalog := SCSList.ChildCatalogs[j];
if SCSCatalog.ItemType = itRoom then
begin
SCSRoom := SCSCatalog;
IsLoadedMaster := false;
// Объекты кабинета
for k := 0 to SCSRoom.ChildCatalogs.Count - 1 do
begin
SCSObject := SCSRoom.ChildCatalogs[k];
SCSObject.ReloadComponentReferences;
// Компоненты кабинета
for l := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[l];
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
SetComponDataToMemTable;
end;
end;
end;
end;
// Объекты Листа
for j := 0 to SCSList.ChildCatalogs.Count - 1 do
begin
SCSObject := SCSList.ChildCatalogs[j];
if IsSCSObjectItemType(SCSObject.ItemType) then
begin
SCSObject.ReloadComponentReferences;
// Компоненты листа
IsLoadedMaster := false;
SCSRoom := nil;
for k := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[k];
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
SetComponDataToMemTable;
end;
end;
end;
end;
end;
// Сортировка
mtRep.First;
while Not mtRep.Eof do
begin
if IsGroupByCompType then
mtRepDetail.SortOn(fnName, []);
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
mtRepSubDetail.SortOn(fnMarkID, [mtcoNonMaintained]);
mtRepDetail.Next;
end;
mtRep.Next;
end;
end
else
begin
LookedWholeIDs := TIntList.Create;
// Создаем список листов кабинетов: В стрингах бедет сигнатура для сортировки, а в объектах индексы листа и комнаты
ComponLists := TStringList.Create;
MaxListNumLength := 0;
MaxRoomNumLength := 0;
IsLoadedMaster := false;
for i := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := ACatalog.ComponentReferences[i];
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
if (SCSComponent.Whole_ID = 0) or (LookedWholeIDs.IndexOf(SCSComponent.Whole_ID) = -1) then
begin
if Not IsLoadedMaster then
begin
mtRep.Append;
mtRep.Post;
IsLoadedMaster := true;
end;
// Поиск типа компнента
IsFindedCompType := false;
if (Not IsGroupByCompType and mtRepDetail.Locate(fnGuidComponentType, '', [])) or
(IsGroupByCompType and mtRepDetail.Locate(fnGuidComponentType, SCSComponent.GUIDComponentType, [])) then
IsFindedCompType := true;
if Not IsFindedCompType then
begin
mtRepDetail.Append;
if IsGroupByCompType then
begin
mtRepDetail.FieldByName(fnGuidComponentType).AsString := SCSComponent.GUIDComponentType;
mtRepDetail.FieldByName(fnName).AsString := SCSComponent.ComponentType.NamePlural;
end
else
mtRepDetail.FieldByName(fnGuidComponentType).AsString := '';
mtRepDetail.Post;
end;
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := '';
mtRepSubDetail.FieldByName(fnRoomNum).AsString := '';
if SCSComponent.Whole_ID = 0 then
begin
SCSList := SCSComponent.GetListOwner;
SCSRoom := nil;
SCSCatalog := SCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSList <> nil then
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID);
if SCSRoom <> nil then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID);
end;
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.FieldByName(fnObjectAddress).AsInteger := Integer(SCSComponent);
mtRepSubDetail.FieldByName(fnWholeID).AsInteger := SCSComponent.Whole_ID;
mtRepSubDetail.Post;
if SCSComponent.Whole_ID <> 0 then
begin
for j := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
PartSCSComponent := ACatalog.ComponentReferences[j];
if PartSCSComponent.Whole_ID = SCSComponent.Whole_ID then
begin
SCSList := PartSCSComponent.GetListOwner;
SCSRoom := nil;
RoomMarkID := 0;
SCSCatalog := PartSCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSRoom <> nil then
RoomMarkID := SCSRoom.MarkID;
FindedListRoom := false;
for k := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[k]);
if (ptrTwoID.ID1 = SCSList.MarkID) and (ptrTwoID.ID2 = RoomMarkID) then
begin
FindedListRoom := true;
Break; //// BREAK ////
end;
end;
if Not FindedListRoom then
begin
GetZeroMem(ptrTwoID, SizeOf(TTwoID));
ptrTwoID.ID1 := SCSList.MarkID;
if Length(IntToStr(SCSList.MarkID)) > MaxListNumLength then
MaxListNumLength := Length(IntToStr(SCSList.MarkID));
if SCSRoom <> nil then
begin
ptrTwoID.ID2 := SCSRoom.MarkID;
if Length(IntToStr(SCSRoom.MarkID)) > MaxRoomNumLength then
MaxRoomNumLength := Length(IntToStr(SCSRoom.MarkID));
end;
ComponLists.AddObject('', TObject(ptrTwoID));
end;
end;
end;
// Проставить в стринге сигнатуры для сортировки
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
if ptrTwoID.ID2 <> 0 then
ComponLists[j] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+IntToStrF(ptrTwoID.ID2, MaxRoomNumLength)
else
ComponLists[j] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+DupStr('X', MaxRoomNumLength);
end;
ComponLists.Sort;
// Вносим номера
if ComponLists.Count > 0 then
begin
// Экономим строки
ptrTwoID := Pointer(ComponLists.Objects[0]);
mtRepSubDetail.Edit;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.Post;
// Добавляем новые строки с номерами листов и кабинетов
for j := 1 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
IsInsertedRecord := false;
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.Post;
end;
end;
// Очистить список листов / комнат
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
FreeMem(ptrTwoID);
end;
ComponLists.Clear;
end;
if SCSComponent.Whole_ID <> 0 then
LookedWholeIDs.Add(SCSComponent.Whole_ID);
end;
end;
if mtRep.RecordCount > 0 then
begin
// Сортонуть все нах
if IsGroupByCompType then
mtRepDetail.SortOn(fnName, []);
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
{//mtRepSubDetail.SortOn(fnMarkID, []);
mtRepSubDetail.SortFields := fnMarkID+';'+fnFloor+';'+fnRoomNum;
mtRepSubDetail.Sort([]);
//mtRepSubDetail.inSortFields := '';}
SortMemTableByParams(mtRepSubDetail, AParams, AReportItemParamValues);
mtRepDetail.Next;
end;
//SortMemTableByParams(mtRepSubDetail, AParams, AReportItemParamValues);
{
// Для кабелей подгрузить все номера листов и комнат через которые он проходит
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
mtRepSubDetail.First;
RecordCount := mtRepSubDetail.RecordCount;
RecNo := mtRepSubDetail.RecNo;
while RecNo < RecordCount do //while Not mtRepSubDetail.Eof do
begin
if mtRepSubDetail.FieldByName(fnWholeID).AsInteger <> 0 then
begin
// Загрузить список с номерами
SCSComponent := TSCSComponent(mtRepSubDetail.FieldByName(fnObjectAddress).AsInteger);
if SCSComponent = nil then
Continue; //// CONTINUE ////
for i := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
PartSCSComponent := ACatalog.ComponentReferences[i];
if PartSCSComponent.Whole_ID = SCSComponent.Whole_ID then
begin
SCSList := PartSCSComponent.GetListOwner;
SCSRoom := nil;
RoomMarkID := 0;
SCSCatalog := PartSCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSRoom <> nil then
RoomMarkID := SCSRoom.MarkID;
FindedListRoom := false;
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
if (ptrTwoID.ID1 = SCSList.MarkID) and (ptrTwoID.ID2 = RoomMarkID) then
begin
FindedListRoom := true;
Break; //// BREAK ////
end;
end;
if Not FindedListRoom then
begin
GetZeroMem(ptrTwoID, SizeOf(TTwoID));
ptrTwoID.ID1 := SCSList.MarkID;
if Length(IntToStr(SCSList.MarkID)) > MaxListNumLength then
MaxListNumLength := Length(IntToStr(SCSList.MarkID));
if SCSRoom <> nil then
begin
ptrTwoID.ID2 := SCSRoom.MarkID;
if Length(IntToStr(SCSRoom.MarkID)) > MaxRoomNumLength then
MaxRoomNumLength := Length(IntToStr(SCSRoom.MarkID));
end;
ComponLists.AddObject('', TObject(ptrTwoID));
end;
end;
end;
// Проставить в стринге сигнатуры для сортировки
for i := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
if ptrTwoID.ID2 <> 0 then
ComponLists[i] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+IntToStrF(ptrTwoID.ID2, MaxRoomNumLength)
else
ComponLists[i] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+DupStr('X', MaxRoomNumLength);
end;
ComponLists.Sort;
// Вносим номера
if ComponLists.Count > 0 then
begin
// Экономим строки
ptrTwoID := Pointer(ComponLists.Objects[0]);
mtRepSubDetail.Edit;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.Post;
// Добавляем новые строки с номерами листов и кабинетов
for i := 1 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
IsInsertedRecord := false;
if mtRepSubDetail.Eof then
mtRepSubDetail.Append
else
begin
mtRepSubDetail.Next;
mtRepSubDetail.Insert;
IsInsertedRecord := true;
end;
if mtRepSubDetail.State <> dsBrowse then
begin
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.Post;
//if IsInsertedRecord then
// mtRepSubDetail.Prior;
end;
end;
end;
// Очистить список листов / комнат
for i := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
FreeMem(ptrTwoID);
end;
ComponLists.Clear;
end;
mtRepSubDetail.Next;
RecNo := RecNo + 1;
end;
mtRepDetail.Next;
end;}
end;
FreeAndNil(ComponLists);
FreeAndNil(LookedWholeIDs);
end;
finally
EndProgress;
end;
FreeAndNil(CatalogList);
GFormMode := fmRExplicationComponent;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowExplicationComponent', E.Message);
end;
//DisconnectDetailMemTable(mtRepSubDetail);
//DisconnectDetailMemTable(mtRepDetail);
//ClearFieldsInMemTable(mtRepSubDetail, nil);
//ClearFieldsInMemTable(mtRepDetail, nil);
//ClearFieldsInMemTable(mtRep, nil);
end;
// Отчет "Экспликация компонентов"
// Tolik -- 06/03/2018 --
{procedure TF_ResourceReport.ShowExplicationComponent(ACatalog: TSCSCatalog; AParams: TReportItemParams;
AReportItemParamValues: TReportItemParams;ACanHaveActiveComponents, ACanHaveDismountAccount, AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue, ACanShowKabinet, ACanShowObjHierarchy, ACanGroupByName: Boolean);}
procedure TF_ResourceReport.ShowExplicationComponent(ACatalog: TSCSCatalog; AParams: TReportItemParams;
AReportItemParamValues: TReportItemParams;ACanHaveActiveComponents, ACanHaveDismountAccount, AComponsWithZeroPrice,
ACanRoundValue, ACanHaveSupplyValue, ACanShowKabinet, ACanShowObjHierarchy, ACanGroupByName, {AShowHeightOfPlacing,} AGroupByHeightOfPlacing: Boolean);
var
CanHaveActiveComponents: Boolean;
CanHaveDismountAccount: Boolean;
CanHaveComponensWithZeroPrice : Boolean;
CatalogList: TSCSCatalogs;
SCSCatalog: TSCSCatalog;
SCSList: TSCSList;
SCSRoom: TSCSCatalog;
SCSObject: TSCSCatalog;
TopComponent,ParentComponent, SCSComponent: TSCSComponent;
ParentCatalog : TSCSCatalog;
PartSCSComponent: TSCSComponent;
// Added by Tolik
NormResources: TSCSNormsResources;
ResourceRel: TSCSResourceRel;
ResourceCompon: TSCSComponent;
SprSuppliesKind: TNBSuppliesKind;
ProjectOwner: TSCSProject;
// Tolik 28/08/2019 --
//OldTick, CurrTick: Cardinal;
OldTick, CurrTick: DWord;
//
Price,Cost,Kolvo: Double; // цена, стоимость, количество - для компоненты
//***************************************
LookedWholeIDs: TIntList;
IsLoadedMaster: Boolean;
IsLoadedSubMaster: Boolean;
IsFindedCompType: Boolean;
ComponLists: TStringList;
ptrTwoID: PTwoID;
MaxListNumLength: Integer;
MaxRoomNumLength: Integer;
RoomMarkID: Integer;
FindedListRoom: Boolean;
IsInsertedRecord: Boolean;
RecordCount: Integer;
RecNo: Integer;
IsGroupByCompType: Boolean;
//added by Tolik
IsCanShowKabinet: Boolean;
IsCanShowObjHierarchy: Boolean;
IsCanGroupByName: Boolean;
IsAddedString: Boolean;
//IsShowHeightOfPlacing: Boolean; // 06/03/2018
IsCanGroupbyHeightOfPlacing: Boolean; // 06/03/2018
//
IsProjOrder: Boolean;
i, j, k, l: Integer;
mtRep: TkbmMemTable;
mtRepDetail: TkbmMemTable;
mtRepSubDetail: TkbmMemTable;
//added by Tolik
ListHasComponents: boolean; // флажок для проверки наличия компонентов на листе (Tolik)
VirtualRoom: TSCSCatalog; // кабинет для "безкабинетных" компонентов
CompNameWithParents: string;
//****************************************************************************************
// ************************ Added by Tolik Процедура поиска и вычисления цены и стоимости компоненты ***********************************
Procedure FindResourcesForComponent(Component: TSCSComponent; ComponName: string; ComponPrice: double; ComponLength: double; aIsLine: Boolean);
Var
i: integer;
IsFoundResource: boolean;
ExpenseForMetr_L: double;
Begin
IsFoundResource := false;
ComponPrice := RoundX(ComponPrice, FPricePrecision);
for i := 0 to NormResources.Resources.Count - 1 do
begin
if Not Assigned(ResourceRel) then
ResourceRel := TSCSResourceRel.Create(GForm, ntProj);
ResourceRel.Assign(NormResources.Resources[i]);
if ResourceRel.Name = ComponName then
begin
ResourceRel.Price := RoundX(ResourceRel.Price, FPricePrecision);
if ResourceRel.Price = ComponPrice then
begin
//Если компонента не линейная то количество =1, если нет = длина компоненты
//if ComponLength = 0 then
// ResourceRel.Kolvo := 1
//else
// ResourceRel.Kolvo := ComponLength;
//if Not aIsLine then
// ResourceRel.Kolvo := 1
//else
// ResourceRel.Kolvo := ComponLength;
if Not aIsLine then
begin
ResourceRel.Kolvo := 1;
// Если ресурс, то берем количество этого ресурса из поля Length
//if ComponsFromResources.IndexOf(Component) <> -1 then
// ResourceRel.Kolvo := Component.Length;
if ((Component.ComponentType.SysName = ctsnCableChannelAccessory) or
(Component.ComponentType.SysName = ctsnAccessory)) then
begin
ExpenseForMetr_L := Component.GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
ResourceRel.Kolvo := Round(Component.Length * ExpenseForMetr_L);
end
end;
end
else
begin
// Расход на ед.длины
ExpenseForMetr_L := Component.GetPropertyValueAsFloat(pnExpenseForMetr);
if ExpenseForMetr_L > 0 then
begin
ResourceRel.Kolvo := Round(Component.Length * ExpenseForMetr_L);
end
else
ResourceRel.Kolvo := ComponLength; // RoundCP(Component.Length);
end;
//Если цена компоненты - 0 - дальше не считаем
if ComponPrice = 0 then
begin
//if Not aIsLine then
// ResourceRel.Kolvo := 1
//else
// ResourceRel.Kolvo := ComponLength;
ResourceRel.Price := 0;
ResourceRel.Cost := 0;
break;
end;
ResourceCompon := nil;
if Not NormResources.Resources[i].ServIsResource then
if TSCSResourceGroup(NormResources.Resources[i]).ObjectList.Count > 0 then
if TSCSResourceGroup(NormResources.Resources[i]).ObjectList[0] is TSCSComponent then
begin
ResourceCompon := TSCSComponent(TSCSResourceGroup(NormResources.Resources[i]).ObjectList[0]);
end;
if ResourceCompon <> nil then
begin
SprSuppliesKind := nil;
if ACanHaveSupplyValue then
if NormResources.Resources[i].GUIDSuppliesKind <> '' then
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(NormResources.Resources[i].GUIDSuppliesKind);
//*** Учитывать поставочные величины
if SprSuppliesKind <> nil then
begin
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
begin
ResourceRel.Izm := SprSuppliesKind.Data.NameTradUOM;
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
// Для кабелей и каналов в традиционной системы США нужно юзать ФУТЫ
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := FloatInUOM(ResourceRel.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
end
else
begin
ResourceRel.Izm := SprSuppliesKind.Data.Name;
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvo;
end;
ResourceRel.CalcCost;
end
else
begin
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
ResourceRel.Izm := GetNameUOM(TF_Main(GForm).FUOM, true);
if TF_Main(GForm).FUOM <> umMetr then
begin
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, TF_Main(GForm).FUOM);
ResourceRel.Price := FloatInUOM(ResourceRel.Price, TF_Main(GForm).FUOM, umMetr);
ResourceRel.CalcCost;
end;
end;
end;
end;
//*** Учитывать флаг округления в большую сторону
if ACanRoundValue then
begin
ResourceRel.Kolvo := RoundUp(ResourceRel.Kolvo);
ResourceRel.CalcCost;
end;
IsFoundResource:=true;
break;
end;
if IsFoundResource then
break;
end;
if IsFoundResource then
break;
end;
if not IsFoundResource then
begin
if ResourceRel <> nil then
begin
ResourceRel.Cost := 0;
ResourceRel.Price := 0;
end;
//Tolik -- 12/03/2018 -- количество показать надо бы, даже если нет цены
// ResourceRel.Kolvo := 0;
//
end;
End;
// **********************************************************************************************
// ************************ Процедура записи данных в таблицы ***********************************
function GetHeightString(aCompon: TSCSComponent): String;// Tolik 13/03/2018 --
var
CadForm: TF_Cad;
aLine: TOrthoLine;
ParentCatalog: TSCSCatalog;
ComponFigure: TFigure;
s: String;
JoinConn: TconnectorObject;
begin
Result := cMakeEditComponentType_Msg9 + ' 0' + GetUOMString(GCurrProjUnitOfMeasure);
ParentCatalog := SCSComponent.GetFirstParentCatalog;
if ParentCatalog = nil then
exit;
CadForm := GetListById(ParentCatalog.ListId);
if CadForm = nil then
exit;
ComponFigure := GetFigureByID(CadForm, ParentCatalog.SCSID);
if ComponFigure = nil then
exit;
if ParentCatalog.IsLine = biFalse then
Result := cMakeEditComponentType_Msg9 + ' ' + floatTostr(RoundX(TConnectorObject(ComponFigure).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure)
else
if ParentCatalog.IsLine = biTrue then
begin // линейные
aLine := TOrthoLine(ComponFigure);
if aLine.JoinConnector1 <> nil then
if aLine.JoinConnector2 <> nil then
if CompareValue(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], TConnectorObject(aLine.JoinConnector2).ActualZOrder[1]) = 0 then
Result := cMakeEditComponentType_Msg9 + ' ' + floatTostr(RoundX(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure)
else
begin //райз, вертикаль, межэтажка, наклонная трасса или магистраль
s := '';
if aLine.FIsVertical then
s := cRepMsg273 // вертикаль (или простой райз)
else
if aLine.FIsRaiseUpDown then //
begin
JoinConn := TconnectorObject(aLine.JoinConnector1);
if (JoinConn.FConnRaiseType = crt_BetweenFloorUp) or (JoinConn.FConnRaiseType = crt_BetweenFloorDown) then
s := cRepMsg274
else
if (JoinConn.FConnRaiseType = crt_TrunkUp) or (JoinConn.FConnRaiseType = crt_TrunkDown) then
s := cRepMsg272;
if s = '' then
begin
JoinConn := TconnectorObject(aLine.JoinConnector2);
if (JoinConn.FConnRaiseType = crt_BetweenFloorUp) or (JoinConn.FConnRaiseType = crt_BetweenFloorDown) then
s := cRepMsg274
else
if (JoinConn.FConnRaiseType = crt_TrunkUp) or (JoinConn.FConnRaiseType = crt_TrunkDown) then
s := cRepMsg272;
end;
if s = '' then
s := cRepMsg273;
end
else // наклонная трасса
s := cRepMsg275;
if CompareValue(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], TConnectorObject(aLine.JoinConnector2).ActualZOrder[1]) = -1 then
Result := s + ' ' + floatTostr(RoundX(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure) + ' - ' +
floatTostr(Roundx(TConnectorObject(aLine.JoinConnector2).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure)
else
if CompareValue(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], TConnectorObject(aLine.JoinConnector2).ActualZOrder[1]) = 1 then
Result := s + ' ' + floatTostr(RoundX(TConnectorObject(aLine.JoinConnector2).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure) + ' - ' +
floatTostr(RoundX(TConnectorObject(aLine.JoinConnector1).ActualZOrder[1], 2)) + GetUOMString(GCurrProjUnitOfMeasure);
end;
end;
end;
procedure SetComponDataToMemTable(ACanShowKabinet: boolean; AGroupByH: boolean = false);
var
IsFindedCompType: Boolean;
IsCanShowKabinet: Boolean;
IsAddedString : Boolean;
markstring, s : string;
aHStr: String;
begin
//Tolik 13/03/2018 --
if ResourceRel = nil then
exit;
//
IsCanShowKabinet := ACanShowKabinet or AGroupByH;
Kolvo := RoundX(ResourceRel.Kolvo, FKolvoPrecision);
Price := RoundX(ResourceRel.Price, FPricePrecision);
//Cost := RoundX(Kolvo * Price, Max(FKolvoPrecision, FPricePrecision));
if ((FKolvoPrecision<4) and (FPricePrecision<4)) then
Cost := RoundX(Kolvo * Price, max(FKolvoPrecision, FPricePrecision))
else
Cost := RoundX(Kolvo * Price,4);
if AGroupByH then
begin
aHStr := GetHeightString(SCSComponent);
if not mtRep.Locate(fnRoomName, aHStr, []) then
begin
mtRep.Append;
mtRep.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID); //этаж (лист)
mtRep.FieldByName(fnRoomName).AsString := aHStr;
mtRep.FieldByName(fnRoomNum).AsString := '';
mtRep.Post;
end;
end
else
begin
if Not IsLoadedMaster then
begin
mtRep.Append;
mtRep.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID); //этаж (лист)
if SCSRoom <> nil then // если кабинет - добавляем номер и название в таблицу
begin
// Added by Tolik
if SCSRoom.ID = 0 then
mtRep.FieldByName(fnRoomName).AsString := SCSRoom.Name // Название кабинета
else
if SCSRoom.NameShort <> '' then
mtRep.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name + ' ' + SCSRoom.NameShort
else
mtRep.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name;
mtRep.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID);
end
else
mtRep.FieldByName(fnRoomNum).AsString := '';
mtRep.Post;
IsLoadedMaster := true;
end;
end;
// Поиск типа компненты для текушего кабинета
IsFindedCompType := false;
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
{ TODO NEW протестить и пересмотреть какое из условий правильнее будет работать }
if (IsGroupByCompType and (mtRepDetail.FieldByName(fnGuidComponentType).AsString = SCSComponent.GUIDComponentType)) or
((Not IsGroupByCompType) and (mtRepDetail.FieldByName(fnGuidComponentType).AsString = '')) then
begin
//beep;
end;
if ((IsGroupByCompType or IsCanGroupByname) and
(mtRepDetail.FieldByName(fnGuidComponentType).AsString = SCSComponent.GUIDComponentType)) or
(((Not IsGroupByCompType) or IsCanGroupByName) and
(mtRepDetail.FieldByName(fnGuidComponentType).AsString = '')) then
begin
IsFindedCompType := true;
Break; //// BREAK ////
end;
mtRepDetail.Next;
end;
if Not IsFindedCompType then
begin
mtRepDetail.Append;
if SCSRoom.id = 0 then
mtRepDetail.FieldByName(fnRoomName).AsString := SCSRoom.Name
else
if SCSRoom.NameShort <> '' then
mtRepDetail.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name + ' ' + SCSRoom.NameShort
else
mtRepDetail.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name;
if IsGroupByCompType then
begin
mtRepDetail.FieldByName(fnGuidComponentType).AsString := SCSComponent.GUIDComponentType;
mtRepDetail.FieldByName(fnName).AsString := SCSComponent.ComponentType.NamePlural;
//added by Tolik
mtRepDetail.FieldByName(fnfloor).AsString := IntToStr(SCSList.MarkID);
end
else
mtRepDetail.FieldByName(fnGuidComponentType).AsString := '';
mtRepDetail.Post;
end;
{if IsCanShowKabinet or (not IsCanShowKabinet and ((SCSComponent.Whole_ID = 0) or Not mtRepSubDetail.Locate(fnWholeID, SCSComponent.Whole_ID, []))) then
}
IsAddedString := false;
if IsCanGroupByName then //задана группировка объектов по наименованию
begin
s:='...';
mtRepSubdetail.First;
while not mtRepsubDetail.Eof do
begin
if ((SCSComponent.Whole_ID <> 0) and (mtRepSubDetail.FieldValues[fnWholeID] = SCSComponent.Whole_ID) and
((mtRepSubDetail.Fieldvalues[fnName] = SCSComponent.Name) or
(mtRepSubDetail.Fieldvalues[fnName] = CompNameWithParents))
and (mtRepSubDetail.Fieldvalues[fnPrice] = price))
or
((SCSComponent.Whole_ID <> 0) and ((mtRepSubDetail.Fieldvalues[fnName] = SCSComponent.Name) or
(mtRepSubDetail.Fieldvalues[fnName] = CompNameWithParents)) and
(mtRepSubDetail.FieldValues[fnFloor] = Inttostr(SCSList.MarkId)) and
(mtRepSubDetail.FieldValues[fnPrice] = Price))
or
((SCSComponent.Whole_ID <> 0) and ((mtRepSubDetail.Fieldvalues[fnName] = SCSComponent.Name) or
(mtRepSubDetail.Fieldvalues[fnName] = CompNameWithParents)) and
(mtRepSubDetail.FieldValues[fnFloor] = Inttostr(SCSList.MarkId)) and
(mtRepSubDetail.FieldValues[fnRoomNum] = SCSRoom.MarkID) and
(mtRepSubDetail.FieldValues[fnPrice] = Price)) // это кабель
or // Компоненты
((SCSComponent.Whole_ID = 0) and ((mtRepSubDetail.Fieldvalues[fnName] = SCSComponent.Name) or
(mtRepSubDetail.Fieldvalues[fnName] = CompNameWithParents)) and
(mtRepSubDetail.FieldValues[fnFloor] = Inttostr(SCSList.MarkId)) and
(mtRepSubDetail.FieldValues[fnPrice] = Price) and
( mtRepSubDetail.FieldValues[fnRoomNum] = Inttostr(SCSRoom.MarkID)) and IsCanShowKabinet)
or
((SCSComponent.Whole_ID = 0) and (mtRepSubDetail.Fieldvalues[fnName] = SCSComponent.Name)
and (mtRepSubDetail.FieldValues[fnFloor] = Inttostr(SCSList.MarkId)) and
(mtRepSubDetail.FieldValues[fnPrice] = Price) and (not IsCanShowKabinet) and
(mtRepSubDetail.FieldValues[fnRoomNum] = inttostr(SCSRoom.MarkID))) then
begin
mtRepSubDetail.Edit;
mtRepSubDetail.FieldByName('KOLVO').AsFloat := mtRepSubDetail.FieldValues['KOLVO'] + kolvo;
//mtRepSubDetail.FieldByName('PRICE').AsFloat := mtRepSubDetail.FieldValues['PRICE'] + price;
//mtRepSubDetail.FieldByName('COST').AsFloat := mtRepSubDetail.FieldValues['COST'] + cost;
mtRepSubDetail.FieldByName('COST').AsFloat := mtRepSubDetail.FieldByName('COST').AsFloat + cost;
//if SCSComponent.Whole_ID = 0 then
//begin
mtRepSubDetail.FieldbyName(fnMarkID).asInteger := 0;
markstring := mtRepSubDetail.FieldValues[fnNameMark];
if Pos(s, markstring) = 0 then
mtRepSubDetail.FieldbyName(fnNameMark).AsString := markstring + s + SCSComponent.NameMark
else
begin
Delete(markstring, pos(s, markstring) + 1, (Length(markstring) - pos(s, markstring)));
mtRepSubDetail.FieldbyName(fnNameMark).AsString := markstring + s + SCSComponent.NameMark;
end;
//end;
mtRepSubDetail.Post;
IsAddedString := true;
break;
end;
mtRepSubDetail.Next;
end;
end;
if not IsAddedString then
begin
if ((FKolvoPrecision<4) and (FPricePrecision<4)) then
cost := RoundX(cost,max(FKolvoPrecision,FPricePrecision))
else cost := RoundX(cost,4);
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID);
if SCSRoom <> nil then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID)
else
mtRepSubDetail.FieldByName(fnRoomNum).AsString := '';
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
if not isCanShowObjHierarchy then
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name
else
mtRepSubDetail.FieldByName(fnName).AsString := CompNameWithParents;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnWholeID).AsInteger := SCSComponent.Whole_ID;
mtRepSubDetail.FieldByName(fnIzm).AsString := ResourceRel.Izm;
if SCSRoom.ID = 0 then
mtRepSubDetail.FieldByName(fnRoomName).AsString := SCSRoom.Name
else
if SCSRoom.NameShort <> '' then
mtRepSubDetail.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name + ' ' + SCSRoom.NameShort
else
mtRepSubDetail.FieldByName(fnRoomName).AsString := ' / ' + SCSRoom.Name;
mtRepSubDetail.FieldByName('Kolvo').AsFloat := Kolvo;
mtRepSubDetail.FieldByName('Price').AsFloat := Price;
mtRepSubDetail.FieldByName('Cost').AsFloat := Cost;
mtRepSubDetail.FieldByName('Notice').AsString := SCSComponent.Notice;
mtRepSubDetail.Post;
end;
CompNameWithParents := '';
end;
// ****************************************************************************************************************
begin
try
ResourceRel := Nil;
NormResources := nil;
VirtualRoom := nil;
// Tolik 17/07/2020 --
if Assigned(FdsrcExplicationCompon) then
FdsrcExplicationCompon.free;
if Assigned(FdsrcExplicationComponDetail) then
FdsrcExplicationComponDetail.free;
if Assigned(FdsrcExplicationComponSubDetail) then
FdsrcExplicationComponSubDetail.free;
if Assigned(FmtExplicationCompon) then
FmtExplicationCompon.free;
if Assigned(FmtExplicationComponDetail) then
FmtExplicationComponDetail.free;
if Assigned(FmtExplicationComponSubDetail) then
FmtExplicationComponSubDetail.free;
FmtExplicationCompon := TkbmMemTable.Create(Self);
FmtExplicationCompon.Name := 'FmtExplicationCompon';
FmtExplicationComponDetail := TkbmMemTable.Create(Self);
FmtExplicationComponDetail.Name := 'FmtExplicationComponDetail';
FmtExplicationComponSubDetail := TkbmMemTable.Create(Self);
FmtExplicationComponSubDetail.Name := 'FmtExplicationComponSubDetail';
FdsrcExplicationCompon := TDataSource.Create(Self);
FdsrcExplicationCompon.Name := 'FdsrcExplicationCompon';
FdsrcExplicationCompon.DataSet := FmtExplicationCompon;
FdsrcExplicationComponDetail := TDataSource.Create(Self);
FdsrcExplicationComponDetail.Name := 'FdsrcExplicationComponDetail';
FdsrcExplicationComponDetail.DataSet := FmtExplicationComponDetail;
FdsrcExplicationComponSubDetail := TDataSource.Create(Self);
FdsrcExplicationComponSubDetail.Name := 'FdsrcExplicationComponSubDetail';
FdsrcExplicationComponSubDetail.DataSet := FmtExplicationComponSubDetail;
//
mtRep := FmtExplicationCompon;
mtRepDetail := FmtExplicationComponDetail;
mtRepSubDetail := FmtExplicationComponSubDetail;
// Tolik 17/07/2020 --
//DisconnectDetailMemTable(mtRepSubDetail);
//DisconnectDetailMemTable(mtRepDetail);
//
ClearFieldsInMemTable(mtRepSubDetail, nil);
ClearFieldsInMemTable(mtRepDetail, nil);
ClearFieldsInMemTable(mtRep, nil);
// Добавление общих палей
mtRep.FieldDefs.Add(fnID, ftAutoInc);
mtRep.FieldDefs.Add(fnFloor, ftString, 20);
mtRep.FieldDefs.Add(fnRoomNum, ftString, 20);
mtRep.FieldDefs.Add(fnMarkID, ftInteger);
mtRep.FieldDefs.Add(fnName, ftString, 255);
mtRep.FieldDefs.Add(fnNameMark, ftString, 255);
mtRep.FieldDefs.Add(fnRoomName, ftString, 255);
mtRepDetail.FieldDefs.Assign(mtRep.FieldDefs);
mtRepDetail.FieldDefs.Add(fnIDMaster, ftInteger);
mtRepSubDetail.FieldDefs.Assign(mtRepDetail.FieldDefs);
//**************************************************************
mtRep.FieldDefs.Add(fnGuidComponentType, ftString, cnstGUIDLength);
mtRepDetail.FieldDefs.Add(fnGuidComponentType, ftString, cnstGUIDLength);
mtRepSubDetail.FieldDefs.Add(fnIDComponent, ftInteger);
mtRepSubDetail.FieldDefs.Add(fnObjectAddress, ftInteger);
mtRepSubDetail.FieldDefs.Add(fnWholeID, ftInteger);
// Добавлено by Tolik для покабинетной экспликации компонентов
mtRepSubDetail.FieldDefs.Add(fnIZM, ftString, 20);// единицы измерения
mtRepSubDetail.FieldDefs.Add(fnKolvo, ftFloat); // цена
mtRepSubDetail.FieldDefs.Add(fnPrice, ftFloat); // количество
mtRepSubDetail.FieldDefs.Add(fnCost, FtFloat); // стоимость
//***************************************************************************************
mtRepSubDetail.FieldDefs.Add(fnNotice, FtString, 200); // примечание
ConnectDetailMemTable(FdsrcExplicationCompon, mtRepDetail, fnID, fnIDMaster);
ConnectDetailMemTable(FdsrcExplicationComponDetail, mtRepSubDetail, fnID, fnIDMaster);
mtRep.Active := true;
mtRepDetail.Active := true;
mtRepSubDetail.Active := true;
CanHaveActiveComponents := IntToBool(AReportItemParamValues.CanHaveActiveComponents);
CanHaveDismountAccount := IntToBool(AReportItemParamValues.CanHaveDismountAccount);
CatalogList := TSCSCatalogs.Create(false);
CatalogList.Add(ACatalog);
CatalogList.AddItems(ACatalog.ChildCatalogReferences);
SortSCSObjectsByPMOrder(CatalogList);
IsGroupByCompType := IntToBool(AReportItemParamValues.CanGroupByCompType);
IsProjOrder := IntToBool(AReportItemParamValues.CanAsPlacingInProj);
IsCanShowKabinet := IntToBool(AReportItemParamValues.CanShowKabinet);
IsCanShowObjHierarchy := IntToBool(AReportItemParamValues.CanShowObjHierarchy);
IsCanGroupByName := IntToBool(AReportItemParamValues.CanGroupByName);
//IsShowHeightOfPlacing := IntToBool(AReportItemParamValues.ShowHeightOfPlacing);
IsCanGroupbyHeightOfPlacing := IntToBool(AReportItemParamValues.GroupbyHeightOfPlacing);
// **************** Перебор и запись элементов проекта в таблицы (Begin)
BeginProgress(pcPreparingReport);
try
FCatalog := ACatalog;
ProjectOwner := FCatalog.GetProject;
NormResources := ACatalog.GetAllNormsResources([nrResources, nrAccessories, nrComponents], false,
ACanHaveActiveComponents,
ACanHaveDismountAccount,
AComponsWithZeroPrice, false, true, ACanHaveSupplyValue);
ResourceRel := TSCSResourceRel.Create(GForm, ntProj);
isCanShowObjHierarchy := ACanShowObjHierarchy;
// Tolik 06/03/2018
//if true then
begin
// Если задано отображать в порядке размещения
if IsProjOrder or IsCanShowKabinet or IsCanGroupbyHeightOfPlacing then
begin
DefinePrecisions; // Установка точности вывода цены и количества
// По умолчанию - 3 знака, если не определено пользователем;
// Все компоненты листа, не входящие ни в один кабинет, а находящиеся непосредственно на листе,
// собираем в отдельный кабинет, для чего создаем отдельный кабинет, если таковые компоненты есть (Tolik)
for i := 0 to CatalogList.Count - 1 do
begin
SCSCatalog := CatalogList[i];
if (SCSCatalog.ItemType = itList) and (SCSCatalog is TSCSList) then
begin
SCSList := TSCSList(SCSCatalog);
// Added by Tolik ***************************************************
ListHasComponents := false;
//Ищем компоненты на листе
// Объекты Листа (объект - не всегда есть компонент)
for j := 0 to SCSList.ChildCatalogs.Count - 1 do
begin
SCSObject := SCSList.ChildCatalogs[j];
if IsSCSObjectItemType(SCSObject.ItemType) then
begin
SCSObject.ReloadComponentReferences;
// Компоненты листа
SCSRoom := nil;
for k := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[k];
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
ListHasComponents := true;
break;
end;
end;
end;
if ListHasComponents then
break;
end;
end;
// Если есть компоненты на листе, создаем для них отдельный кабинет
if ListHasComponents then
begin
// Создать кабинет
VirtualRoom := TSCSList.Create(F_ProjMan);
VirtualRoom.ItemType := itRoom;
VirtualRoom.ID := 0;
VirtualRoom.Name := cResourceReport_Msg45;
break;
end;
end;
// ******************************************* Tolik *************************************************************
for i := 0 to CatalogList.Count - 1 do
begin
SCSCatalog := CatalogList[i];
// Если объект списка - Лист, то выбираем из него компоненты для отчета
// в два прохода по списку
// в первом - отбираем компоненты кабинетов
// во втором - отбираем компоненты листа
if (SCSCatalog.ItemType = itList) and (SCSCatalog is TSCSList) then
begin
SCSList := TSCSList(SCSCatalog);
IsLoadedMaster := false;
for j := 0 to SCSList.ChildCatalogs.Count - 1 do
begin
SCSCatalog := SCSList.ChildCatalogs[j];
if SCSCatalog.ItemType = itRoom then
begin
SCSRoom := SCSCatalog;
IsLoadedMaster := false;
// Объекты кабинета
for k := 0 to SCSRoom.ChildCatalogs.Count - 1 do
begin
SCSObject := SCSRoom.ChildCatalogs[k];
SCSObject.ReloadComponentReferences;
// Компоненты кабинета
for l := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[l];
if (AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1))) then
begin
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
// Added by Tolik
if (SCSComponent.Price <> 0) or AComponsWithZeroPrice then
begin
if isCanShowObjHierarchy then
begin
CompNameWithParents := SCSComponent.Name;
TopComponent := nil;
if SCSComponent <> SCSComponent.GetTopComponent then
TopComponent := SCSComponent.GetTopComponent;
if ((TopComponent <> nil) and (SCSComponent.ChildReferences.Count = 0)) then
CompNameWithParents := TopComponent.Name + ' ' +
TopComponent.NameMark + ' / ' + CompNameWithParents;
CompNameWithParents := SCSObject.Name + ' ' + IntToStr(SCSObject.MarkID) + ' / ' + CompNameWithParents;
FindResourcesForComponent(SCSComponent, SCSComponent.Name, SCSComponent.Price, SCSComponent.Length, SCSComponent.Isline = biTrue);
SetComponDataToMemTable(ACanShowKabinet, IsCanGroupbyHeightOfPlacing);
end
else
begin
FindResourcesForComponent(SCSComponent, SCSComponent.Name, SCSComponent.Price, SCSComponent.Length, SCSComponent.Isline = biTrue);
SetComponDataToMemTable(ACanShowKabinet, IsCanGroupbyHeightOfPlacing);
end;
end;
end;
end;
end;
end;
end;
end;
if IsCanShowKabinet then
IsLoadedMaster := false
else
begin
//comented by Igor else IsLoadedMaster:=true; // Added by Tolik
end;
// Объекты Листа
for j := 0 to SCSList.ChildCatalogs.Count - 1 do
begin
SCSObject := SCSList.ChildCatalogs[j];
if IsSCSObjectItemType(SCSObject.ItemType) then
begin
SCSObject.ReloadComponentReferences;
// Компоненты листа
// Commented by Tolik
// IsLoadedMaster := false;
SCSRoom := VirtualRoom;
for k := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[k];
if (AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1))) then
begin
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
//Added by Tolik
if (SCSComponent.Price <> 0) or AComponsWithZeroPrice then
begin
if isCanShowObjHierarchy then
begin
CompNameWithParents:=SCSComponent.Name;
TopComponent := nil;
if SCSComponent <> SCSComponent.GetTopComponent then
TopComponent := SCSComponent.GetTopComponent;
if ((TopComponent<>nil) and (SCSComponent.ChildReferences.Count = 0)) then
CompNameWithParents := TopComponent.Name + ' ' +
TopComponent.NameMark + ' / ' + CompNameWithParents;
CompNameWithParents := SCSObject.Name + ' ' +IntToStr(SCSObject.MarkID) + ' / ' + CompNameWithParents;
FindResourcesForComponent(SCSComponent, SCSComponent.Name, SCSComponent.Price, SCSComponent.Length, SCSComponent.Isline = biTrue);
SetComponDataToMemTable(ACanShowKabinet, IsCanGroupbyHeightOfPlacing);
end
else
begin
FindResourcesForComponent(SCSComponent, SCSComponent.Name,SCSComponent.Price, SCSComponent.Length, SCSComponent.Isline = biTrue);
SetComponDataToMemTable(ACanShowKabinet, IsCanGroupbyHeightOfPlacing);
end;
end;
end;
end;
///////////////////////////////////////////////
//IsLoadedMaster := true;
end;
end;
end;
end;
end;
// **************** Перебор и запись элементов проекта в таблицы (End)
// Сортировка данных в таблицах
mtRep.First;
while Not mtRep.Eof do
begin
if IsGroupByCompType then
mtRepDetail.SortOn(fnName, []);
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
mtRepSubDetail.SortOn(fnMarkID, [mtcoNonMaintained]);
mtRepDetail.Next;
end;
mtRep.Next;
end;
end
else
begin
LookedWholeIDs := TIntList.Create;
// Создаем список листов кабинетов: В стрингах будет сигнатура для сортировки, а в объектах индексы листа и комнаты
ComponLists := TStringList.Create;
MaxListNumLength := 0;
MaxRoomNumLength := 0;
IsLoadedMaster := false;
for i := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := ACatalog.ComponentReferences[i];
if (AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1))) then
begin
if CheckCanLookComponInReportRsrc(SCSComponent, CanHaveActiveComponents, CanHaveDismountAccount) then
begin
if (SCSComponent.Whole_ID = 0) or (LookedWholeIDs.IndexOf(SCSComponent.Whole_ID) = -1) then
begin
if Not IsLoadedMaster then
begin
mtRep.Append;
IsLoadedMaster := true;
mtRep.Post;
end;
// Поиск типа компнента
IsFindedCompType := false;
if (Not IsGroupByCompType and mtRepDetail.Locate(fnGuidComponentType, '', [])) or
(IsGroupByCompType and mtRepDetail.Locate(fnGuidComponentType, SCSComponent.GUIDComponentType, [])) then
IsFindedCompType := true;
if Not IsFindedCompType then
begin
mtRepDetail.Append;
if IsGroupByCompType then
begin
mtRepDetail.FieldByName(fnGuidComponentType).AsString := SCSComponent.GUIDComponentType;
mtRepDetail.FieldByName(fnName).AsString := SCSComponent.ComponentType.NamePlural;
end
else
mtRepDetail.FieldByName(fnGuidComponentType).AsString := '';
mtRepDetail.Post;
end;
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := '';
mtRepSubDetail.FieldByName(fnRoomNum).AsString := '';
if SCSComponent.Whole_ID = 0 then
begin
SCSList := SCSComponent.GetListOwner;
SCSRoom := nil;
SCSCatalog := SCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSList <> nil then
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(SCSList.MarkID)
//Tolik
else
mtRepSubDetail.FieldByName(fnFloor).AsString := '0';
//
if SCSRoom <> nil then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(SCSRoom.MarkID);
end;
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.FieldByName(fnObjectAddress).AsInteger := Integer(SCSComponent);
mtRepSubDetail.FieldByName(fnWholeID).AsInteger := SCSComponent.Whole_ID;
mtRepSubDetail.Post;
if SCSComponent.Whole_ID <> 0 then
begin
for j := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
PartSCSComponent := ACatalog.ComponentReferences[j];
if PartSCSComponent.Whole_ID = SCSComponent.Whole_ID then
begin
SCSList := PartSCSComponent.GetListOwner;
SCSRoom := nil;
RoomMarkID := 0;
SCSCatalog := PartSCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSRoom <> nil then
RoomMarkID := SCSRoom.MarkID;
FindedListRoom := false;
for k := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[k]);
if (ptrTwoID.ID1 = SCSList.MarkID) and (ptrTwoID.ID2 = RoomMarkID) then
begin
FindedListRoom := true;
Break; //// BREAK ////
end;
end;
if Not FindedListRoom then
begin
GetZeroMem(ptrTwoID, SizeOf(TTwoID));
ptrTwoID.ID1 := SCSList.MarkID;
if Length(IntToStr(SCSList.MarkID)) > MaxListNumLength then
MaxListNumLength := Length(IntToStr(SCSList.MarkID));
if SCSRoom <> nil then
begin
ptrTwoID.ID2 := SCSRoom.MarkID;
if Length(IntToStr(SCSRoom.MarkID)) > MaxRoomNumLength then
MaxRoomNumLength := Length(IntToStr(SCSRoom.MarkID));
end;
ComponLists.AddObject('', TObject(ptrTwoID));
end;
end;
end;
// Проставить в стринге сигнатуры для сортировки
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
if ptrTwoID.ID2 <> 0 then
ComponLists[j] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+IntToStrF(ptrTwoID.ID2, MaxRoomNumLength)
else
ComponLists[j] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+DupStr('X', MaxRoomNumLength);
end;
ComponLists.Sort;
// Вносим номера
if ComponLists.Count > 0 then
begin
// Экономим строки
ptrTwoID := Pointer(ComponLists.Objects[0]);
mtRepSubDetail.Edit;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2)
// Tolik
else mtRepSubDetail.FieldByName(fnRoomNum).AsString :='0';
mtRepSubDetail.Post;
// Добавляем новые строки с номерами листов и кабинетов
for j := 1 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
IsInsertedRecord := false;
mtRepSubDetail.Append;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2)
//Tolik
else mtRepSubDetail.FieldByName(fnRoomNum).AsString :='0';
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.Post;
end;
end;
// Очистить список листов / комнат
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
FreeMem(ptrTwoID);
end;
ComponLists.Clear;
end;
if SCSComponent.Whole_ID <> 0 then
LookedWholeIDs.Add(SCSComponent.Whole_ID);
end;
end;
end;
end;
{mtRep.SortOn('fnfloor,fnroomnum,fnGuidComponentType',[]);
mtRepDetail.SortOn('fnfloor,fnroomnum,fnGuidComponentType',[]);
mtRepDetail.SortOn('fnfloor,fnroomnum,fnMarkId,fnNameMark,fnidcomponent',[]);
}
//mtRepSubdetail.SortOn('',[]);
if mtRep.RecordCount > 0 then
begin
// Сортонуть все нах
if IsGroupByCompType then
mtRepDetail.SortOn(fnName, []);
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
{//mtRepSubDetail.SortOn(fnMarkID, []);
mtRepSubDetail.SortFields := fnMarkID+';'+fnFloor+';'+fnRoomNum;
mtRepSubDetail.Sort([]);
//mtRepSubDetail.inSortFields := '';}
SortMemTableByParams(mtRepSubDetail, AParams, AReportItemParamValues);
mtRepDetail.Next;
end;
//SortMemTableByParams(mtRepSubDetail, AParams, AReportItemParamValues);
{
// Для кабелей подгрузить все номера листов и комнат через которые он проходит
mtRepDetail.First;
while Not mtRepDetail.Eof do
begin
mtRepSubDetail.First;
RecordCount := mtRepSubDetail.RecordCount;
RecNo := mtRepSubDetail.RecNo;
while RecNo < RecordCount do //while Not mtRepSubDetail.Eof do
begin
if mtRepSubDetail.FieldByName(fnWholeID).AsInteger <> 0 then
begin
// Загрузить список с номерами
SCSComponent := TSCSComponent(mtRepSubDetail.FieldByName(fnObjectAddress).AsInteger);
if SCSComponent = nil then
Continue; //// CONTINUE ////
for i := 0 to ACatalog.ComponentReferences.Count - 1 do
begin
PartSCSComponent := ACatalog.ComponentReferences[i];
if PartSCSComponent.Whole_ID = SCSComponent.Whole_ID then
begin
SCSList := PartSCSComponent.GetListOwner;
SCSRoom := nil;
RoomMarkID := 0;
SCSCatalog := PartSCSComponent.GetFirstParentCatalog;
if SCSCatalog <> nil then
SCSRoom := SCSCatalog.GetParentCatalogByItemType(itRoom);
if SCSRoom <> nil then
RoomMarkID := SCSRoom.MarkID;
FindedListRoom := false;
for j := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[j]);
if (ptrTwoID.ID1 = SCSList.MarkID) and (ptrTwoID.ID2 = RoomMarkID) then
begin
FindedListRoom := true;
Break; //// BREAK ////
end;
end;
if Not FindedListRoom then
begin
GetZeroMem(ptrTwoID, SizeOf(TTwoID));
ptrTwoID.ID1 := SCSList.MarkID;
if Length(IntToStr(SCSList.MarkID)) > MaxListNumLength then
MaxListNumLength := Length(IntToStr(SCSList.MarkID));
if SCSRoom <> nil then
begin
ptrTwoID.ID2 := SCSRoom.MarkID;
if Length(IntToStr(SCSRoom.MarkID)) > MaxRoomNumLength then
MaxRoomNumLength := Length(IntToStr(SCSRoom.MarkID));
end;
ComponLists.AddObject('', TObject(ptrTwoID));
end;
end;
end;
// Проставить в стринге сигнатуры для сортировки
for i := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
if ptrTwoID.ID2 <> 0 then
ComponLists[i] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+IntToStrF(ptrTwoID.ID2, MaxRoomNumLength)
else
ComponLists[i] := IntToStrF(ptrTwoID.ID1, MaxListNumLength)+'-'+DupStr('X', MaxRoomNumLength);
end;
ComponLists.Sort;
// Вносим номера
if ComponLists.Count > 0 then
begin
// Экономим строки
ptrTwoID := Pointer(ComponLists.Objects[0]);
mtRepSubDetail.Edit;
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.Post;
// Добавляем новые строки с номерами листов и кабинетов
for i := 1 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
IsInsertedRecord := false;
if mtRepSubDetail.Eof then
mtRepSubDetail.Append
else
begin
mtRepSubDetail.Next;
mtRepSubDetail.Insert;
IsInsertedRecord := true;
end;
if mtRepSubDetail.State <> dsBrowse then
begin
mtRepSubDetail.FieldByName(fnFloor).AsString := IntToStr(ptrTwoID.ID1);
if ptrTwoID.ID2 <> 0 then
mtRepSubDetail.FieldByName(fnRoomNum).AsString := IntToStr(ptrTwoID.ID2);
mtRepSubDetail.FieldByName(fnMarkID).AsInteger := SCSComponent.MarkID;
mtRepSubDetail.FieldByName(fnName).AsString := SCSComponent.Name;
mtRepSubDetail.FieldByName(fnNameMark).AsString := SCSComponent.NameMark;
mtRepSubDetail.FieldByName(fnIDComponent).AsInteger := SCSComponent.ID;
mtRepSubDetail.Post;
//if IsInsertedRecord then
// mtRepSubDetail.Prior;
end;
end;
end;
// Очистить список листов / комнат
for i := 0 to ComponLists.Count - 1 do
begin
ptrTwoID := Pointer(ComponLists.Objects[i]);
FreeMem(ptrTwoID);
end;
ComponLists.Clear;
end;
mtRepSubDetail.Next;
RecNo := RecNo + 1;
end;
mtRepDetail.Next;
end;}
end;
FreeAndNil(ComponLists);
FreeAndNil(LookedWholeIDs);
end;
end;
finally
EndProgress;
end;
FreeAndNil(CatalogList);
GFormMode := fmRExplicationComponent;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowExplicationComponent', E.Message);
end;
// Tolik -- 13/13/2018 --
if ResourceRel <> nil then
FreeAndNil(ResourceRel);
if NormResources <> nil then
FreeAndNil(NormResources);
if VirtualRoom <> nil then
FreeAndNil(VirtualRoom);
//
//DisconnectDetailMemTable(mtRepSubDetail);
//DisconnectDetailMemTable(mtRepDetail);
//ClearFieldsInMemTable(mtRepSubDetail, nil);
//ClearFieldsInMemTable(mtRepDetail, nil);
//ClearFieldsInMemTable(mtRep, nil);
end;
procedure TF_ResourceReport.ShowComponSpecifications(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
begin
try
if Not rbModePacketPrintToExcel.Checked then
begin
CreateFGuideFileList;
//Tolik
// F_GuideFileList.Execute(gftCompSpecification, ACatalog.ComponentReferences);
if AllNetTypes then
F_GuideFileList.Execute(gftCompSpecification, ACatalog.ComponentReferences, nil)
else
F_GuideFileList.Execute(gftCompSpecification, ACatalog.ComponentReferences, NetTypeGuidListSelected);
end
// Tolik
// При пакетной печати нужно увеличить счетчик, а то будет горе - зависнет форма
// Если это последний отчет, форму прогреса нужно закрыть
else
IncPaketPrintCounter;
{if rbModePacketPrintToExcel.Checked then
begin
Inc(FReportCountPrinted);
if (FReportCountPrinted = FReportCountToPrint) then
begin
if FReportCountPrinted = FReportCountToPrint then
begin
//*** Догнать до 100
for i := TF_Main(GForm).F_ProgressExp.gTotal.Progress + 1 to TF_Main(GForm).F_ProgressExp.gTotal.MaxValue do
begin
TF_Main(GForm).F_ProgressExp.gTotal.Progress := i;
TF_Main(GForm).F_ProgressExp.gTotal.Refresh;
Sleep(500);
end;
if TF_Main(GForm).F_ProgressExp.cbOpen.Checked then
ShellExecute(Handle, nil, PChar(FPackgeDir), nil, nil, SW_SHOW);
end;
FReportCountPrinted := FReportCountToPrint;
TF_Main(GForm).F_ProgressExp.Close;
end;
end;
end;}
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowComponSpecifications', E.Message);
end;
end;
procedure TF_ResourceReport.ShowCrossJournal(AFolder: TSCSCatalog; AParams: TReportItemParams;
AReportItemParamValues: TReportItemParams;
AResourceReportFormMode: TResourceReportFormMode);
var
ListWithLookedCompons: TIntList;
CurrIDCompon: Integer;
i, j: Integer;
SCSComponent: TSCSComponent;
ComponCatagoryStr: String;
ComponCatagory: Integer;
ComponNameMark: String;
ListName: String;
FirstComponent: TSCSComponent;
LastComponent: TSCSComponent;
FromNppPort: Integer;
FromPortName: String;
ToNppPort: Integer;
ToPortName: String;
InterfCount: Integer;
MasterID: Integer;
ComponSignType: Integer;
ComponMarkTemplate: string;
ListOwner: TSCSList;
RoomOwner: TSCSCatalog;
SprComponentType: TNBComponentType;
mtRep: TkbmMemTable;
begin
try
mtRep := FmtCrossJournal;
ClearFieldsInMemTable(mtRep, nil);
mtRep.FieldDefs.Add(fnNameList, ftString, 255);
mtRep.FieldDefs.Add(fnRoomNum, ftString, 255);
mtRep.FieldDefs.Add(fnNameFrom, ftString, 255);
mtRep.FieldDefs.Add(fnNameTo, ftString, 255);
mtRep.FieldDefs.Add(fnNumFrom, ftInteger, 0); //05.02.2011
mtRep.FieldDefs.Add(fnNumTo, ftInteger, 0); //05.02.2011
// Tolik -- 04/05/2017 -- по просьбам трудящихся в отчет добавлен порт ("откуда")
mtRep.FieldDefs.Add(fnPortNameFrom, ftString, 255);
//
mtRep.FieldDefs.Add(fnPortNameTo, ftInteger, 0); //05.02.2011 mtRep.FieldDefs.Add(fnPortNameTo, ftString, 255);
mtRep.FieldDefs.Add(fnCableNameShort, ftString, 255);
mtRep.FieldDefs.Add(fnCableNameMark, ftString, 255);
mtRep.FieldDefs.Add(fnCableNum, ftInteger, 0);
mtRep.Active := true;
FCatalog := AFolder;
ListWithLookedCompons := TIntList.Create;
BeginProgress(pcPreparingReport);
try
for i := 0 to AFolder.ComponentReferences.Count - 1 do
begin
SCSComponent := AFolder.ComponentReferences[i];
if Assigned(SCSComponent) then
begin
if (SCSComponent.IsLine = biFalse) or ((SCSComponent.IsLine = biTrue) and
(AllNetTypes or (NetTypeGuidListSelected.IndexOf(SCSComponent.GUIDNetType) <> -1))) then
begin
ComponSignType := SCSComponent.GetPropertyValueAsInteger(pnSignType);
if (SCSComponent.IsLine = biTrue) and
((ComponSignType = oitProjectible) or (AReportItemParamValues.CanHaveActiveComponents = biTrue)) then
if SCSComponent.HaveInterfaceByType(itFunctional) then //*** Есть ли функциональные интерфейсы
//if (CheckSysNameIsCable(SCSComponent.ComponentType.SysName) and
if (isCableComponent(SCSComponent) and
(not (SCSComponent.IDNetType in [3,{4,}5,7])) and
(ListWithLookedCompons.IndexOf(SCSComponent.ID) = -1)) then
begin
SCSComponent.RefreshWholeLengthIfNecessary;
SCSComponent.LoadWholeComponent(false);
SCSComponent.LoadWholeLength;
SCSComponent.DefineFirstLast;
//if (SCSComponent.FirstIDConnectedConnCompon > 0) and
// (SCSComponent.LastIDConnectedConnCompon > 0) then
if Assigned(SCSComponent.FirstConnectedConnCompon) and
Assigned(SCSComponent.LastConnectedConnCompon) and
CheckCanLookComponInReportCable(SCSComponent.FirstConnectedConnCompon, AReportItemParamValues.CanHaveDismountAccount = biTrue) and
CheckCanLookComponInReportCable(SCSComponent.LastConnectedConnCompon, AReportItemParamValues.CanHaveDismountAccount = biTrue) then
if Not (AReportItemParamValues.CanHaveDismountAccount = biTrue) or
Not CheckHaveWholeComponentDismounted(FCatalog, SCSComponent.WholeComponent) then
begin
//01.04.2009 SCSComponent.RefreshWholeLengthIfNecessary;
ComponCatagoryStr := '';
ComponCatagoryStr := SCSComponent.GetPropertyValueBySysName(pnCategory);
ListName := '';
FirstComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.FirstIDCompon);
LastComponent := TF_Main(GForm).GSCSBase.CurrProject.GetComponentFromReferences(SCSComponent.LastIDCompon);
// Tolik -- 04/05/2017 --
FromNppPort := -1;
FromPortName := '';
//
LoadPortName(SCSComponent.FirstIDConnectedConnCompon, SCSComponent.FirstIDCompon, FromNppPort, FromPortName);
LoadPortName(SCSComponent.LastIDConnectedConnCompon, SCSComponent.LastIDCompon, ToNppPort, ToPortName);
// Определить Лист и кабинет
ListOwner := nil;
RoomOwner := nil;
{//11.03.2009
if FirstComponent <> nil then
ListOwner := FirstComponent.GetListOwner
else
if LastComponent <> nil then
ListOwner := LastComponent.GetListOwner
else
ListOwner := SCSComponent.GetListOwner;
}
ListOwner := SCSComponent.FirstConnectedConnCompon.GetListOwner;
if ListOwner <> nil then
begin
ListName := ListOwner.GetNameForVisible;
RoomOwner := GetComponObjectOwnerByItemType(SCSComponent.FirstConnectedConnCompon, itRoom); //11.03.2009 GetComponObjectOwnerByItemType(FirstComponent, itRoom);
//if RoomOwner <> nil then
// ListName := ListName + '. '+ RoomOwner.GetNameForVisible;
SprComponentType := ListOwner.Spravochnik.GetComponentTypeByGUID(SCSComponent.GUIDComponentType);
if SprComponentType <> nil then
ComponMarkTemplate := SprComponentType.ComponentType.MarkMask;
//*** Удалить обозначение из шаблона маркировки
if ComponMarkTemplate <> '' then
if Pos(mteNameShort, ComponMarkTemplate) <> 0 then
Delete(ComponMarkTemplate, Pos(mteNameShort, ComponMarkTemplate), Length(mteNameShort));
end;
mtRep.Append;
mtRep.FieldByName(fnNameList).AsString := ListName; // Откуда приходит
if RoomOwner <> nil then
mtRep.FieldByName(fnRoomNum).AsString := RoomOwner.GetNameForVisible;
mtRep.FieldByName(fnNameFrom).AsString := GetMultiPortNameMark(SCSComponent.FirstConnectedConnCompon, true); // # розетки или коммутационной панели
mtRep.FieldByName(fnNumFrom).AsInteger := SCSComponent.FirstConnectedConnCompon.MarkID;
ComponNameMark := GetMultiPortNameMark(SCSComponent.LastConnectedConnCompon, false); // # комутационной панели
// Если в панеле пустая маркировка, то выводим тире
if ComponNameMark <> '' then
begin
mtRep.FieldByName(fnNameTo).AsString := ComponNameMark;
mtRep.FieldByName(fnNumTo).AsInteger := SCSComponent.LastConnectedConnCompon.MarkID;
end
else
begin
mtRep.FieldByName(fnNameTo).AsString := '-';
mtRep.FieldByName(fnNumTo).AsInteger := 0;
end;
mtRep.FieldByName(fnPortNameTo).AsInteger := ToNppPort; //05.02.2011 IntToStr(ToNppPort); // Номер порта панели
//mtRep.FieldByName(fnPortNameTo).AsString := IntToStr(ToNppPort); // Номер порта панели
mtRep.FieldByName(fnCableNameShort).AsString := SCSComponent.NameShort;
mtRep.FieldByName(fnCableNameMark).AsString := TF_Main(SCSComponent.ActiveForm).MakeNameMarkComponent(SCSComponent, SCSComponent.GetFirstParentCatalog, false, ComponMarkTemplate); // номер кабеля //SCSComponent.NameMark;
mtRep.FieldByName(fnCableNum).AsInteger := SCSComponent.MarkID;
// Tolik -- 04/05/2017 --
if FromNppPort <> -1 then
mtRep.FieldByName(fnPortNameFrom).AsString := IntToStr(FromNppPort)
else
mtRep.FieldByName(fnPortNameFrom).AsString := ' - ';
mtRep.Post;
end;
for j := 0 to SCSComponent.WholeComponent.Count - 1 do
ListWithLookedCompons.Add(SCSComponent.WholeComponent[j]);
end;
end;
end;
end;
//*** Сортировка
//MemTable_RCableJournal.SortOn(fnNameFrom, []);
SortMemTableByParams(mtRep, AParams, AReportItemParamValues);
finally
EndProgress;
FreeAndNil(ListWithLookedCompons);
end;
GFormMode := AResourceReportFormMode;
ShowPreparedReport(AParams); //Act_ShowReport.Execute;
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowCrossJournal', E.Message);
end;
end;
procedure TF_ResourceReport.ShowHouse(AFolder: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
var
i, j, k: integer;
Catalogs: TSCSCatalogs;
CreatedCatalogs: Boolean;
SCSCatalog: TSCScatalog;
HouseCompon: TSCSComponent;
ApproachCompon: TSCSComponent;
// Tolik 21/03/2017 --
CatalogsAssigned: Boolean;
//
begin
try
// Tolik 21/03/2017 --
CatalogsAssigned := False;
//
DisconnectDetailMemTable(FmtApproach);
FmtApproach.Active := false;
FmtHouse.Active := false;
ConnectDetailMemTable(FdsrcHouse, FmtApproach, fnID, fnIDComponent);
FmtHouse.Active := true;
FmtApproach.Active := true;
FCatalog := AFolder;
Catalogs := nil;
CreatedCatalogs := false;
if AParams.CanAsPlacingInProj = biTrue then
begin
Catalogs := GetChildCatalogsInPlacingOrder(AFolder, [itSCSConnector]);
CreatedCatalogs := true;
end
else
Catalogs := AFolder.ChildCatalogReferences;
for i := 0 to Catalogs.Count - 1 do
begin
SCSCatalog := Catalogs[i];
for j := 0 to SCSCatalog.SCSComponents.Count - 1 do
begin
HouseCompon := SCSCatalog.SCSComponents[j];
if HouseCompon.ComponentType.SysName = ctsnHouse then
begin
FmtHouse.Append;
FmtHouse.FieldByName(fnID).AsInteger := HouseCompon.ID;
FmtHouse.FieldByName(fnName).AsString := HouseCompon.Name;
FmtHouse.FieldByName(fnMarkID).AsInteger := HouseCompon.MarkID;
FmtHouse.FieldByName(fnCooperative).AsString := HouseCompon.GetPropertyValueBySysName(pnCooperative);
FmtHouse.FieldByName(fnHEO).AsString := HouseCompon.GetPropertyValueBySysName(pnHEO);
FmtHouse.FieldByName(fnAgreed).AsInteger := GetPropValueAsBoolGrayedDef(HouseCompon.Properties, pnAgreed, bigFalse);
FmtHouse.Post;
for k := 0 to HouseCompon.ChildComplects.Count - 1 do
begin
ApproachCompon := HouseCompon.ChildComplects[k];
if ApproachCompon.ComponentType.SysName = ctsnApproach then
begin
FmtApproach.Append;
FmtApproach.FieldByName(fnID).AsInteger := ApproachCompon.ID;
FmtApproach.FieldByName(fnIDComponent).AsInteger := HouseCompon.ID;
FmtApproach.FieldByName(fnName).AsString := ApproachCompon.Name;
FmtApproach.FieldByName(fnMarkID).AsInteger := ApproachCompon.MarkID;
FmtApproach.FieldByName(fnBoxInstalled).AsInteger := GetPropValueAsBoolGrayedDef(ApproachCompon.Properties, pnBoxInstalled, bigFalse);
FmtApproach.FieldByName(fnPresencePower200WFromNetwork).AsInteger := GetPropValueAsBoolGrayedDef(ApproachCompon.Properties, pnPresencePower200WFromNetwork, bigFalse);
FmtApproach.FieldByName(fnCableSetToBox).AsInteger := GetPropValueAsBoolGrayedDef(ApproachCompon.Properties, pnCableSetToBox, bigFalse);
FmtApproach.FieldByName(fnFiberOpticWelded).AsInteger := GetPropValueAsBoolGrayedDef(ApproachCompon.Properties, pnFiberOpticWelded, bigFalse);
FmtApproach.FieldByName(fnEquipmentInstalled).AsInteger := GetPropValueAsBoolGrayedDef(ApproachCompon.Properties, pnEquipmentInstalled, bigFalse);
FmtApproach.Post;
end;
end;
end;
end;
end;
// Сортируем
FmtHouse.SortOn(fnName+';'+fnMarkID, []);
if AReportItemParamValues.CanAsPlacingInProj = biFalse then
SortMemTableByParams(FmtApproach, AParams, AReportItemParamValues);
if CreatedCatalogs then
// Tolik 21/03/2017 --
// FreeAndNil(Catalogs);
Catalogs.free;
//
GFormMode := AParams.Mode;
ShowPreparedReport(AParams);
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowHouse', E.Message);
end;
end;
procedure TF_ResourceReport.ShowDefectAct(AFolder: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams; AResourceReportFormMode: TResourceReportFormMode);
var
F_MasterDefectAct: TF_MasterDefectAct;
begin
// Tolik
// при пакетной печати - не формируем
if Not rbModePacketPrintToExcel.Checked then
begin
//
FCatalog := AFolder;
F_MasterDefectAct := TF_MasterDefectAct.Create(GForm, GForm);
F_MasterDefectAct.Execute(fmView, AFolder, true, TF_Main(GForm).FUOM);
FreeAndNil(F_MasterDefectAct);
end
else
IncPaketPrintCounter;
end;
procedure TF_ResourceReport.ShowDefectActForCompon(ACompon: TSCSComponent; AParams: TReportItemParams; ADefectAct: TDefectAct);
var
DefectAct: TDefectAct;
Params: TReportItemParams;
begin
try
Params := AParams;
if Params = nil then
Params := TReportItemParams(tvReports.Selected.Data);
DefectAct := ADefectAct;
if DefectAct = nil then
DefectAct := ACompon.ProjectOwner.GetComponDefectAct(ACompon);
if DefectAct = nil then
DefectAct := TDefectAct.Create(nil);
FmtDefectAct.Active := false;
FmtDefectAct.Active := true;
FmtDefectAct.Append;
FmtDefectAct.FieldByName(fnName).AsString := ACompon.GetNameForVisible;
FmtDefectAct.FieldByName(fnFindDefectChecked).AsBoolean := DefectAct.FindDefectChecked;
TMemoField(FmtDefectAct.FieldByName(fnFindDefectAdress)).Value := DefectAct.FindDefectAdress;
TMemoField(FmtDefectAct.FieldByName(fnFindDefectDescription)).Value := DefectAct.FindDefectDescription;
FmtDefectAct.FieldByName(fnLinkTransportChecked).AsBoolean := DefectAct.LinkTransportChecked;
TMemoField(FmtDefectAct.FieldByName(fnLinkTransportPointA)).Value := DefectAct.LinkTransportPointA;
TMemoField(FmtDefectAct.FieldByName(fnLinkTransportPointB)).Value := DefectAct.LinkTransportPointB;
FmtDefectAct.FieldByName(fnLinkTransportCable).AsFloat := FloatInUOM(DefectAct.LinkTransportCable, umMetr, TF_Main(GForm).FUOM);
TMemoField(FmtDefectAct.FieldByName(fnLinkTransportMaterials)).Value := DefectAct.LinkTransportMaterials;
FmtDefectAct.FieldByName(fnSetEquipmentChecked).AsBoolean := DefectAct.SetEquipmentChecked;
TMemoField(FmtDefectAct.FieldByName(fnSetEquipmentAddress)).Value := DefectAct.SetEquipmentAddress;
TMemoField(FmtDefectAct.FieldByName(fnSetEquipmentEqipm)).Value := DefectAct.SetEquipmentEqipm;
TMemoField(FmtDefectAct.FieldByName(fnSetEquipmentMaterial)).Value := DefectAct.SetEquipmentMaterial;
FmtDefectAct.FieldByName(fnMoveEquipmentChecked).AsBoolean := DefectAct.MoveEquipmentChecked;
TMemoField(FmtDefectAct.FieldByName(fnMoveEquipmentPointA)).Value := DefectAct.MoveEquipmentPointA;
TMemoField(FmtDefectAct.FieldByName(fnMoveEquipmentPointB)).Value := DefectAct.MoveEquipmentPointB;
TMemoField(FmtDefectAct.FieldByName(fnMoveEquipmentEqipm)).Value := DefectAct.MoveEquipmentEqipm;
TMemoField(FmtDefectAct.FieldByName(fnMoveEquipmentMaterial)).Value := DefectAct.MoveEquipmentMaterial;
TMemoField(FmtDefectAct.FieldByName(fnContractorName)).Value := DefectAct.Contractor;
FmtDefectAct.FieldByName(fnDateGetting).AsDateTime := DefectAct.DateGetting;
FmtDefectAct.FieldByName(fnDateExecution).AsDateTime := DefectAct.DateExecution;
FmtDefectAct.Post;
if ADefectAct = nil then
FreeAndNil(DefectAct);
GFormMode := fmRDefectAct;
ShowPreparedReport(Params);
except
on E: Exception do AddExceptionToLogEx('TF_ResourceReport.ShowDefectActForCompon', E.Message);
end;
end;
procedure TF_ResourceReport.ShowCommerceInvoice(ACatalog: TSCSCatalog; AParams: TReportItemParams; AReportItemParamValues: TReportItemParams);
const
// Position Type
ptGroup = 1;
ptEndGroup = 2;
ptCompon = 3;
ptGroupTotal = 4;
ptBreak = 5;
var
// i, j: integer;
// //NBPath: TStringList;
// CatalogOwnerPathID: TIntList;
// Compon: TSCSComponent;
// ComponIDNB: Integer;
// added by Tolik
IsCanShowResources, IsCanShowWorks: Boolean;
NormResources: TSCSNormsResources;
i: Integer;
ResourceRel: TSCSResourceRel;
ResourceCompon: TSCSComponent;
SprSuppliesKind: TNBSuppliesKind;
ProjectOwner: TSCSProject;
// Tolik 28/08/2019 --
//OldTick, CurrTick: Cardinal;
OldTick, CurrTick: DWord;
//
TotalCost: Double;
InterfaceNormList: TList;
CurrInterfaceNormList: TList;
TempList: TList;
SCSComponent: TSCSComponent;
SCSCatalog: TSCSCatalog;
TraceLength: Double;
Interfac: TSCSInterface;
ptrJoinedInterf: TSCSInterface;
ptrComplectInterf: TSCSInterface;
ptrResultInterface: TSCSInterface;
//IOfIRel: TSCSIOfIRel;
ptrInterfaceNormInfo: PInterfaceNormInfo;
ptrInterfaceNormInfoI: PInterfaceNormInfo;
ptrInterfaceNormInfoJ: PInterfaceNormInfo;
GroupedNorms: TSCSNormsResources;
GroupNorm: TSCSNorm;
RootCatalog: TSCSCatalog; // Корневой объект
// ComponCatalog: TSCSCatalog; // Объект для компонента
// CatalogWithNoDefined: TSCSCatalog; // Объект с компонентами, которых нету в БД
// MaxPathLen: Integer; // Минимальная длина пути
// //ptrComponTotalQt: PDouble; // переменная из списка, в которой хранится общее кол-во
// //ComponentQt: Double; // Колво одной компоненты
// GroupCompon: TSCSComponent;
// GroupComponList: TSCSComponents;
// LookedWholeID: TIntList;
// Catalogs: TSCSCatalogs;
LevelColors: TIntList;
CableTypes : TCableTypeArray;
CableIdsList : TIntList;
// GenCatalogNum: Integer;
// // Создаст объект каталога
// function CreateCatalogContainer(ANBID: Integer=0; AParentContainer: TSCSCatalog=nil): TSCSCatalog;
// begin
// Result := TSCSCatalog.Create(GForm);
// //Result.SCSComponents.OwnsObjects := false;
//
// if ANBID <> 0 then
// begin
// Result.ID := ANBID;
// Result.Name := TF_Main(GForm).FNormBase.DM.GetStringFromTableByID(tnCatalog, fnName, Result.ID, qmPhisical);
// end;
// if AParentContainer <> nil then
// AParentContainer.AddChildCatalogToList(Result);
// end;
//
// // Строит структуру (путь) объектов из пути ID, вернет самый внутренний каталог
// function CatalogPathIDToObject(ACatalogPathID: TIntList): TSCSCatalog;
// var
// i: Integer;
// CurrCatalog: TSCSCatalog;
// ChildCatalog: TSCSCatalog;
// begin
// CurrCatalog := RootCatalog;
// for i := 0 to ACatalogPathID.Count - 1 do
// begin
// ChildCatalog := CurrCatalog.ChildCatalogs.GetByID(ACatalogPathID[i]);
// if ChildCatalog = nil then
// ChildCatalog := CreateCatalogContainer(ACatalogPathID[i], CurrCatalog);
// CurrCatalog := ChildCatalog;
//
// //if (i+1) > MaxCatalogLevel then
// // MaxCatalogLevel := i+1;
// end;
// if (MaxPathLen = 0) or (MaxPathLen < ACatalogPathID.Count) then
// MaxPathLen := ACatalogPathID.Count;
// Result := CurrCatalog;
// end;
//
// // Убирает общие верхние объекты - те у которых один дочерний подобъект
// // смотрим чтобы для компонентов был хотя бы один уровень
// // и для самого глубокого по возможности - минимкм три уровня
// procedure RemoveTopCommonObjects;
// var
// CurrTopCatalog: TSCSCatalog;
// //CatalogToRemove: TSCSCatalog;
// RemovedCount: Integer;
// begin
// CurrTopCatalog := RootCatalog;
// RemovedCount := 0;
// //while (MaxPathLen - RemovedCount) >= 3 do
// while true do
// begin
// // Проверки для выхода из цыкла
// if (CurrTopCatalog.ChildCatalogs.Count > 1) or // если несколько объектов, товыходим
// (CurrTopCatalog.SCSComponents.Count > 0) or // если есть компоненты, то выходим
// (CurrTopCatalog.ChildCatalogs.Count = 0) or // на всякий случай
// //((MaxPathLen-RemovedCount) <= 3) then
// ((MaxPathLen-RemovedCount) <= 3) then
// begin
// EmptyProcedure;
// Break; //// BREAK ////
// end;
// RootCatalog := CurrTopCatalog.ChildCatalogs[0];
// //RootCatalog.Parent := nil;
// CurrTopCatalog.RemoveChildCatalogFromList(RootCatalog);
//
// CurrTopCatalog.Free;
// CurrTopCatalog := RootCatalog;
// RemovedCount := RemovedCount + 1;
// end;
// end;
//
// procedure DefineCatalogCodes(AParentCatalogs: TSCSCatalogs);
// var
// i, j: Integer;
// ChildLevelCatalogs: TSCSCatalogs;
// Catalog: TSCSCatalog;
// begin
// ChildLevelCatalogs := TSCSCatalogs.Create(false);
// // Определяем номера Каталогов
// for i := 0 to AParentCatalogs.Count - 1 do
// begin
// Catalog := AParentCatalogs[i];
//
// GenCatalogNum := GenCatalogNum + 1;
// Catalog.MarkID := GenCatalogNum;
//
// // Определяем список каталогов уровнем ниже
// for j := 0 to Catalog.ChildCatalogs.Count - 1 do
// ChildLevelCatalogs.Add(Catalog.ChildCatalogs[j]);
// end;
// if ChildLevelCatalogs.Count > 0 then
// DefineCatalogCodes(ChildLevelCatalogs);
// FreeAndNil(ChildLevelCatalogs);
// end;
//
// function GetGrpCompon(AProjCompon: TSCSComponent): TSCSComponent;
// var
// Compon: TSCSComponent;
// Izm: String;
// i: Integer;
// begin
// Result := nil;
// Izm := AProjCompon.Izm;
// if CheckPriceTransformToUOMByCompType(@AProjCompon.ComponentType) then
// Izm := GetNameUOM(umMetr, true);
//
// for i := 0 to GroupComponList.Count - 1 do
// begin
// Compon := GroupComponList[i];
// if (Compon.ArticulProducer = AProjCompon.ArticulProducer) and
// (Abs(Compon.Price - AProjCompon.Price) < cnstCmpPriceDelta) and
// (Compon.Izm = Izm) and
// (Compon.GUIDProducer = AProjCompon.GUIDProducer) and
// (Compon.Name = AProjCompon.Name) and
// (Compon.IsLine = AProjCompon.IsLine) then
// begin
// Result := Compon;
// Break; //// BREAK ////
// end;
// end;
// end;
procedure AddRecoToMT(const ACode, ANat, AUom, AName: String; AQt, APrice, ACost: Double;
AColor, APositionType: Integer);
//AColor, ACharterLevel: Integer; AIsTotal: Boolean);
begin
FmtCommerceInvoice.Append;
FmtCommerceInvoice.FieldByName(fnCode).AsString := ACode;
FmtCommerceInvoice.FieldByName(fnNat).AsString := ANat;
FmtCommerceInvoice.FieldByName(fnUOM).AsString := AUom;
FmtCommerceInvoice.FieldByName(fnName).AsString := AName;
//15.08.2012 FmtCommerceInvoice.FieldByName(fnQt).AsFloat := AQt;
//15.08.2012 FmtCommerceInvoice.FieldByName(fnPrice).AsFloat := APrice;
//15.08.2012 FmtCommerceInvoice.FieldByName(fnCost).AsFloat := ACost;
// commented by Tolik
{ FmtCommerceInvoice.FieldByName(fnQt).AsString := FormatFloat(ffMask, AQt);
FmtCommerceInvoice.FieldByName(fnPrice).AsString := FormatFloat(ffMask, APrice);
FmtCommerceInvoice.FieldByName(fnCost).AsString := FormatFloat(ffMask, ACost);}
// выполнено округления цен и количества до заданных пользователем(Tolik)
FmtCommerceInvoice.FieldByName(fnQt).AsString := FloatToStr(RoundX(AQt,FKolvoPrecision));
FmtCommerceInvoice.FieldByName(fnPrice).AsString := FloatToStr(RoundX(APrice,FPricePrecision));
FmtCommerceInvoice.FieldByName(fnCost).AsString := FloatToStr(RoundX(ACost,Max(FKolvoPrecision,FPricePrecision)));
//
// ServFields
FmtCommerceInvoice.FieldByName(fnColor).AsInteger := AColor;
FmtCommerceInvoice.FieldByName(fnPosType).AsInteger := APositionType;
//FmtCommerceInvoice.FieldByName(fnCharterLevel).AsInteger := ACharterLevel;
//FmtCommerceInvoice.FieldByName(fnIsCharter).AsBoolean :=
//FmtCommerceInvoice.FieldByName(fnIsTotal).AsBoolean := AIsTotal;
FmtCommerceInvoice.Post;
end;
procedure CatalogComponsToMT(ACatalog: TSCSCatalog; ACatalogCost: PDouble);
var
i, j: Integer;
Compon: TSCSComponent;
ComponPrice: Double;
ComponCount: Double;
ComponCost: Double;
//Tolik 23/10/2020 --
SprSuppliesKind: TNBSuppliesKind;
SupplyName, SupplyIzm: string;
SupplyCost: double;
SupplyCount: double;
SCount, AllCount: Double;
//
begin
for i := 0 to ACatalog.SCSComponents.Count - 1 do
begin
Compon := ACatalog.SCSComponents[i];
// Tolik
// по типу сети
if (AllNetTypes or ((not AllNetTypes) and (NetTypeGuidListSelected.Indexof(Compon.GUIDNetType)<> -1))) then
begin
// Tolik 23/10/2020 -- если нужно учесть поставочные величины --
if cbCanHaveSupplyValue.Checked then
begin
if ProjectOwner <> nil then
begin
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(Compon.GUIDSuppliesKind);
if SprSuppliesKind <> nil then
begin
SCount := 0;
if CheckisTradUom(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure) then
begin
SupplyName := SprSuppliesKind.Data.NameTradUOM;
SupplyIzm := SprSuppliesKind.Data.IzmTradUOM;
SupplyCount := SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
SupplyName := SprSuppliesKind.Data.Name;
SupplyIzm := SprSuppliesKind.Data.Izm;
SupplyCount := SprSuppliesKind.Data.UnitKolvo;
end;
GetComponQtPriceInUOM(Compon, TF_Main(GForm).FUOM, @ComponPrice, @ComponCount);
ComponCount := 0;
if SupplyCount <> 0 then // если определено количество в поставке
begin
//SCount := 1;
ComponPrice := ComponPrice * SupplyCount; // за единицу поставки
if ComponCount > SupplyCount then
begin
ComponCount := 1;
AllCount := SupplyCount;
while AllCount < ComponCount do
begin
//SCount := SCount + 1;
ComponCount := ComponCount + 1;
AllCount := AllCount + SupplyCount;
end;
ComponPrice := ComponPrice * ComponCount;
end
else
ComponCount := 1;
end;
ComponCount := RoundX(ComponCount,FKolvoPrecision);
ComponPrice := RoundX(ComponPrice,FPricePrecision);
//Округлаем стоимость в пределах разумного до 5 знаков
if ((FPricePrecision<4) and (FKolvoPrecision<4)) then
ComponCost := RoundX(ComponPrice * ComponCount,Max(FPricePrecision,FKolvoPrecision))
else ComponCost :=RoundX(ComponPrice * ComponCount,4);
// Tolik 03/11/2020 -- проставочные величины (количество для кабеля )
if Compon.isLine = biTrue then
begin
if isCableComponent(Compon) then
begin
if cbCanHaveSupplyValue.Checked then
begin
if not cbNone.Checked then
begin
if Length(CableTypes) > 0 then
begin
for j := 0 to Length(CableTypes) - 1 do
begin
if Compon.Cypher = CableTypes[j].CableCypher then
begin
if Length(CableTypes[j].Reels) > 0 then
ComponCount := Length(CableTypes[j].Reels); // это, если округлять величины
if not cbCanRoundValue.Checked then
begin
ComponCount := RoundX((Compon.Length/SupplyCount), FKolvoPrecision); // не округлять величины
end;
if ComponCount <> 0 then
begin
ComponCost := RoundX(ComponPrice * ComponCount, FPricePrecision); // цена
//ComponCost := RoundX((Compon.Length/SupplyCount * ComponPrice, FPricePrecision);
end;
break;
end;
end;
end;
end
else
begin // если нет учета бухт кабеля - вывести как есть (ВАЖНО!!! -- в единицах измерения проекта)
ComponCount := Compon.Length;
ComponCost := RoundX(ComponPrice * ComponCount, FPricePrecision); // ценаComponPrice * ComponCount
SupplyName := GetNameUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure, true);
end;
end;
end;
end;
//
// Tolik 19/10/2020 для линейных компонент следует указать единицы измерения согласно настроек проекта,
// а не те, что в компоненте прописаны ...
//AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, Compon.Izm, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon);
if Compon.isLine = biFalse then
//AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, Compon.Izm, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon)
AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, SupplyName, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon)
else
//AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, GetNameUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure,
// true), Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon);
AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, SupplyName, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon);
//
if ACatalogCost <> nil then
ACatalogCost^ := ACatalogCost^ + ComponCost;
end;
end;
end
else
begin
//ComponPrice := Compon.Price;
//ComponCount := Compon.Length;
//// Цена компонента по СИ
//if CheckPriceTransformToUOMByCompType(@Compon.ComponentType) then
//begin
// if TF_Main(GForm).FUOM <> umMetr then
// begin
// ComponCount := FloatInUOM(Compon.Length, umMetr, TF_Main(GForm).FUOM);
// ComponPrice := FloatInUOM(Compon.Price, TF_Main(GForm).FUOM, umMetr);
// end;
//end;
GetComponQtPriceInUOM(Compon, TF_Main(GForm).FUOM, @ComponPrice, @ComponCount);
// commented by Toik
{ ComponCost := RoundCP(ComponPrice * ComponCount);
AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, Compon.Izm, Compon.Name,
RoundCP(ComponCount), RoundCP(ComponPrice), ComponCost, clNone, ptCompon);}
// выполнено округление (Tolik)
ComponCount := RoundX(ComponCount,FKolvoPrecision);
ComponPrice := RoundX(ComponPrice,FPricePrecision);
//Округлаем стоимость в пределах разумного до 5 знаков
if ((FPricePrecision<4) and (FKolvoPrecision<4)) then
ComponCost := RoundX(ComponPrice * ComponCount,Max(FPricePrecision,FKolvoPrecision))
else ComponCost :=RoundX(ComponPrice * ComponCount,4);
// Tolik 19/10/2020 для линейных компонент следует указать единицы измерения согласно настроек проекта,
// а не те, что в компоненте прописаны ...
//AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, Compon.Izm, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon);
//Tolik 06/07/2022 -- проверить на нулевую цену
if ((AReportItemParamValues.CanHaveZeroPriceComponents = 1) or ((AReportItemParamValues.CanHaveZeroPriceComponents = 0) and (ComponPrice <> 0))) then
begin
if Compon.isLine = biFalse then
AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, Compon.Izm, Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon)
else
AddRecoToMT(Compon.ArticulProducer, cBaseCommon75, GetNameUOM(F_ProjMan.GSCSBase.CurrProject.Setting.UnitOfMeasure,
true), Compon.Name, ComponCount, ComponPrice, ComponCost, clNone, ptCompon);
end;
//
if ACatalogCost <> nil then
ACatalogCost^ := ACatalogCost^ + ComponCost;
end;
end;
end;
end;
// Загрузка ресурсов в таблицу
procedure LoadResourcesOnlyToMT(AResources: TSCSResources);
var i: Integer;
ResourceRel: TSCSResourceRel;
Kolvo, Price, Cost: Double;
begin
MemTable_RResources.Close;
MemTable_RResources.Open;
for i := 0 to AResources.Count - 1 do
begin
// отбираем только ресурсы
if AResources[i].ServIsResource then
begin
ResourceRel := AResources[i];
MemTable_RResources.Append;
MemTable_RResources.FieldByName('ID').AsInteger := ResourceRel.ID;
MemTable_RResources.FieldByName(fnName).AsString := ResourceRel.Name;
// Шифр ресурса помещаем в поле ArtProducer (показываем шифр ресурса в поле 'КОД' отчета )
MemTable_RResources.FieldByName(fnArticulProducer).AsString := ResourceRel.Cypher; //ResourceRel.ArtProducer;
MemTable_RResources.FieldByName(fnArticulDistributor).AsString := ResourceRel.ArtDistributor;
MemTable_RResources.FieldByName(fnProducerName).AsString := TF_Main(GForm).FNormBase.DM.GetStringFromTableByGUID(tnProducers, fnName, ResourceRel.GUIDProducer, qmPhisical);
MemTable_RResources.FieldByName(fnIzm).AsString := ResourceRel.Izm;
Kolvo := RoundX(ResourceRel.Kolvo, FKolvoPrecision);
Price := RoundX(ResourceRel.Price, FPricePrecision);
//Округляем стоимость в пределах разумного (до 4 знаков)
if ((FKolvoPrecision<4) and (FPricePrecision<4)) then
Cost := RoundX(Kolvo * Price, Max(FKolvoPrecision, FPricePrecision) )
else
Cost := RoundX(Kolvo*Price,4);
MemTable_RResources.FieldByName('Kolvo').AsFloat := Kolvo;
MemTable_RResources.FieldByName('Price').AsFloat := Price;
MemTable_RResources.FieldByName('Cost').AsFloat := Cost;
MemTable_RResources.Post;
TotalCost := TotalCost + Cost;
end;
end;
MemTable_RResources.SortOn(fnName, []);
end;
procedure ObjectstsToMT(ACatalog: TSCSCatalog; ALevel: Integer=-1; AParentCatalogCost: PDouble=nil);
var
i: Integer;
Catalog: TSCSCatalog;
Nat: String;
Color: Integer;
PositionType: Integer;
CatalogCost: Double;
begin
PositionType := ptEndGroup; //ptGroup;
CatalogCost := 0;
if ALevel >= 0 then
begin
Nat := '';
//ptGroup = 1;
//ptEndGroup = 2;
//ptCompon = 3;
//ptGroupTotal = 4;
//ptBreak = 5;
// Если есть компоненты, тогда раздел, иначе глава
if ACatalog.SCSComponents.Count > 0 then
begin
//PositionType := ptEndGroup;
Nat := cBaseCommon74;
end
else
begin
//PositionType := ptGroup;
Nat := cBaseCommon73;
end;
// Цвет группы
Color := clNone;
if ALevel < LevelColors.Count then
begin
Color := LevelColors[ALevel];
PositionType := ptGroup;
end;
//Tolik 03/04/2022 -- заголовки типа секйи и глав - тоже убрать ...
//AddRecoToMT(IntToStrF(ACatalog.MarkID, 2), Nat, '', ACatalog.Name, 0, 0, 0, Color, PositionType);
//
CatalogComponsToMT(ACatalog, @CatalogCost);
end;
// Загружаем подкаталоги
for i := 0 to ACatalog.ChildCatalogs.Count - 1 do
begin
Catalog := ACatalog.ChildCatalogs[i];
//CatalogComponsToMT(Catalog);
ObjectstsToMT(Catalog, ALevel+1, @CatalogCost);
end;
if ALevel >= 0 then
begin
// Итого группы
//Tolik 03/04/2022 -- все итоги отсюда нах
//AddRecoToMT('', '', '', IntToStrF(ACatalog.MarkID, 2), 0, 0, CatalogCost, clNone, ptGroupTotal);
//
// Черная полоска
//Tolik 18/02/2022 -- Здесь Рома сказа сделать белую полоску
//AddRecoToMT('', '', '', '', 0, 0, 0, clBlack, ptBreak);
//AddRecoToMT('', '', '', '', 0, 0, 0, clWhite, ptBreak);
//
end
else
begin
// Общее итого
// commented by Tolik, потому что считать общие суммы будем в отчете
// AddRecoToMT('', '', '', cRepMsg32, 0, 0, CatalogCost, clNone, ptGroupTotal);
end;
if AParentCatalogCost <> nil then
AParentCatalogCost^ := AParentCatalogCost^ + CatalogCost;
end;
begin
//Tolik 26/02/2022 --
FPricePrecision := 2;
FKolvoPrecision := 2;
//
//Tolik 12/11/2019 --
OldTick := GetTickCount;
CableIdsList := nil;
//
MemTable_RResources.Close;
MemTable_RResources.Open;
MemTable_RNorms.Close;
MemTable_RNorms.Open;
DefinePrecisions; // Получить точность цены и количества
ProjectOwner := nil;
if cbCanHaveSupplyValue.Checked then
ProjectOwner := ACatalog.GetProject;
try
if FmtCommerceInvoice = nil then
begin
//Tolik
// по типу сети
INeedNormsRecources :=True;
//
FmtCommerceInvoice := TkbmMemTable.Create(Self);
FmtCommerceInvoice.Name := 'FmtCommerceInvoice';
FdsrcCommerceInvoice := TDataSource.Create(Self);
FdsrcCommerceInvoice.Name := 'FdsrcCommerceInvoice';
FdsrcCommerceInvoice.DataSet := FmtCommerceInvoice;
FmtCommerceInvoice.FieldDefs.Add(fnID, ftAutoInc);
FmtCommerceInvoice.FieldDefs.Add(fnCode, ftString, 255);
FmtCommerceInvoice.FieldDefs.Add(fnNat, ftString, 255);
FmtCommerceInvoice.FieldDefs.Add(fnUOM, ftString, 255);
FmtCommerceInvoice.FieldDefs.Add(fnName, ftString, 255);
//15.08.2012 FmtCommerceInvoice.FieldDefs.Add(fnQt, ftFloat);
//15.08.2012 FmtCommerceInvoice.FieldDefs.Add(fnPrice, ftFloat);
//15.08.2012 FmtCommerceInvoice.FieldDefs.Add(fnCost, ftFloat);
FmtCommerceInvoice.FieldDefs.Add(fnQt, ftString, 255);
FmtCommerceInvoice.FieldDefs.Add(fnPrice, ftString, 255);
FmtCommerceInvoice.FieldDefs.Add(fnCost, ftString, 255);
// ServFields
FmtCommerceInvoice.FieldDefs.Add(fnColor, ftInteger);
FmtCommerceInvoice.FieldDefs.Add(fnPosType, ftInteger);
//FmtCommerceInvoice.FieldDefs.Add(fnCharterLevel, ftInteger);
//FmtCommerceInvoice.FieldDefs.Add(fnIsCharter, ftBoolean);
//FmtCommerceInvoice.FieldDefs.Add(fnIsTotal, ftBoolean);
end;
FmtCommerceInvoice.Active := false;
FmtCommerceInvoice.Active := true;
// RootCatalog := CreateCatalogContainer;
// LookedWholeID := TIntList.Create;
// GroupComponList := TSCSComponents.Create(false); // групповые кобъекты будут удаляться из каталогов
// LevelColors := TIntList.Create;
// try
// CatalogWithNoDefined := nil;
// MaxPathLen := 0;
// for i := 0 to ACatalog.ComponentReferences.Count - 1 do
// begin
// Compon := ACatalog.ComponentReferences[i];
// // Можем ли использовать этот компонент по параметрам
// if ((Compon.Isline = biFalse) or (LookedWholeID.IndexOf(Compon.Whole_ID) = -1)) and
// CheckCanLookComponInReportRsrc(Compon, AReportItemParamValues.CanHaveActiveComponents=biTrue,
// AReportItemParamValues.CanHaveDismountAccount=biTrue) then
// begin
// GroupCompon := GetGrpCompon(Compon);
//
// if GroupCompon = nil then
// begin
// GroupCompon := TSCSComponent.Create(GForm);
// GroupCompon.AssignOnlyComponent(Compon);
// GroupCompon.Length := 0;
// if CheckPriceTransformToUOMByCompType(@GroupCompon.ComponentType) then
// GroupCompon.Izm := GetNameUOM(umMetr, true);
//
// CatalogOwnerPathID := nil;
// ComponIDNB := TF_Main(GForm).FNormBase.DM.GetIntFromTableByGUID(tnComponent, fnID, Compon.GuidNB, qmPhisical);
// if ComponIDNB <> 0 then
// CatalogOwnerPathID := GetComponCatalogOwnerPathIDByLevel(ComponIDNB, 0, TF_Main(GForm).FNormBase.DM.Query_Select);
// // Если есть папка в НБ, то кидаем в объект этой папки
// if (CatalogOwnerPathID <> nil) and (CatalogOwnerPathID.Count > 0) then
// begin
// ComponCatalog := CatalogPathIDToObject(CatalogOwnerPathID);
// //ComponCatalog.SCSComponents.Add(Compon);
//
// ComponCatalog.AddComponentToList(GroupCompon);
// end
// else
// // Иначе кидаем в спец. папку с компонентами которых нету в НБ
// begin
// if CatalogWithNoDefined = nil then
// begin
// CatalogWithNoDefined := CreateCatalogContainer;
// CatalogWithNoDefined.Name := cResourceReport_Msg43;
// CatalogWithNoDefined.AddComponentToList(GroupCompon);
// end;
// end;
// GroupComponList.Add(GroupCompon);
// end;
// GroupCompon.Length := GroupCompon.Length + GetComponQuantityByParams(Compon, AReportItemParamValues.CanHaveDismountAccount=biTrue);
//
// // Запоминаем кабель
// if (Compon.Isline = biTrue) and (Compon.Whole_ID <> 0) then
// LookedWholeID.Add(Compon.Whole_ID);
// end;
// end;
// RemoveTopCommonObjects;
// RootCatalog.AddChildCatalogToList(CatalogWithNoDefined);
//
// // Определяем коды (номера папок) по уровням
// GenCatalogNum := -1;
// Catalogs := TSCSCatalogs.Create(false);
// Catalogs.Add(RootCatalog);
// DefineCatalogCodes(Catalogs);
// FreeAndNil(Catalogs);
//
// // Цвета BGR - blue green red
// LevelColors.Add($FFCC99);
// LevelColors.Add($CCFFCC);
// //LevelColors.Add($CCFFFF);
//
// // насыпаем MemTable
// ObjectstsToMT(RootCatalog);
// finally
// FreeAndNil(LevelColors);
// FreeAndNil(GroupComponList);
// FreeAndNil(LookedWholeID);
// FreeAndNil(RootCatalog);
// end;
RootCatalog := PrepareCommerceInvoiceObjects(ACatalog, AParams, AReportItemParamValues);
LevelColors := TIntList.Create;
try
// Цвета BGR - blue green red
LevelColors.Add($FFCC99); // $FFCC99
LevelColors.Add($CCFFCC); // $CCFFCC
//Tolik 03/11/2020 --
// если учитывать поставочные величины - просчитать наперед количество кабеля в поставочных величинах ...
if cbCanHaveSupplyValue.Checked then
begin
if not cbNone.Checked then
begin
CableIdsList := TIntList.Create;
if ReelsCableFlow <> nil then
ReelsCableFlow.Clear
else
// нет строк для отчета - создаем пустой список ()
ReelsCableFlow := TStringList.Create;
if Length(CableTypes) > 0 then
FreeCableTypes(CableTypes);
SetLength(CableTypes, 0);
for i := 0 to aCatalog.ComponentReferences.Count - 1 do
begin
SCSComponent := aCatalog.ComponentReferences[i];
if isCableComponent(SCSComponent) then
begin
if CableIdsList.IndexOf(SCSComponent.Whole_ID) = -1 then
begin
SCSComponent.LoadWholeLength;
CableTypesAdd(SCSComponent, CableTypes, CableIdsList, SCSComponent.ID, Self);
CableIdsList.Add(SCSComponent.Whole_ID);
end;
end;
end;
if cbMaxScrapRate.Checked then
CableReelCalculate(CableTypes, 'MaxScrapRate',ReelsCableFlow, Self);
if cbMaxEfficiency.Checked then
CableReelCalculate(CableTypes, 'MaxEfficiency',ReelsCableFlow, Self);
//CableReelNamesToMemTable(MemTable_RCable ,CableTypes);
end;
// если нет - сбросим результаты предидущих расчетов,
// в случае наличия таковых
if cbMaxEfficiency.Checked then
begin
end
else
if cbMaxScrapRate.Checked then;
end;
//
// насыпаем MemTable
ObjectstsToMT(RootCatalog);
IsCanShowResources := IntToBool(AReportItemParamValues.CanShowResources); //ACanShowResources;
IsCanShowWorks := IntToBool(AReportItemParamValues.CanShowWorks); //ACanShowWorks;
// Если показывать работы, то формируем таблицу значений
if IsCanShowWorks then
begin
// frdbdataset1.Assign(MemTable_RNorms);
try
if Assigned(ACatalog) then
begin
// LookedInterfaces := TList.Create;
// InterfaceNormList := TList.Create;
// GroupedNorms := TSCSNorms.Create(true);
FCatalog := ACatalog;
BeginProgress(pcPreparingReport);
try
//GroupedNorms := AFolder.GetAllNormsResources(nrAll, false, ACanHaveActiveComponents, false, true);
//24.09.2010 GroupedNorms := AFolder.GetAllNormsResources([nrNorms], false, ACanHaveActiveComponents, false, true);
// 21/02/2018 Tolik -- с учетом флажка "учитывать поставочные величины" --
{GroupedNorms := ACatalog.GetAllNormsResources([nrNorms], false, true,
false, true, false, true, false, True); ////24.09.2010 aAllowNormPriceForGroup = True}
GroupedNorms := ACatalog.GetAllNormsResources([nrNorms], false, true,
false, true, false, false, inttobool(AReportItemParamValues.CanHaveSupplyValue), True);
//*** Засыпать нормы в MemTable
MemTable_RNorms.Active := false;
MemTable_RNorms.Active := true;
for i := 0 to GroupedNorms.Norms.Count - 1 do
begin
GroupNorm := GroupedNorms.Norms[i];
MemTable_RNorms.Append;
MemTable_RNorms.FieldByName(fnCypher).AsString := GroupNorm.Cypher;
MemTable_RNorms.FieldByName(fnName).AsString := GroupNorm.Name;
//Tolik 27/02/2022 --
//MemTable_RNorms.FieldByName(fnExpense).AsFloat := RoundX(GroupNorm.Kolvo, PrecisionNormKolvo);
MemTable_RNorms.FieldByName(fnExpense).AsFloat := RoundX(GroupNorm.Kolvo, 2);
//
MemTable_RNorms.FieldByName(fnIzm).AsString := GroupNorm.Izm_;
//24.09.2010
//Tolik 27/02/2022 --
//MemTable_RNorms.FieldByName(fnPrice).AsFloat := RoundX(GroupNorm.Price, PrecisionNormKolvo);
//MemTable_RNorms.FieldByName(fnTotalCost).AsFloat := RoundX(GroupNorm.TotalCost, PrecisionNormKolvo);
MemTable_RNorms.FieldByName(fnPrice).AsFloat := RoundX(GroupNorm.Price, 2);
MemTable_RNorms.FieldByName(fnTotalCost).AsFloat := RoundX(GroupNorm.TotalCost, 2);
//
MemTable_RNorms.Post;
end;
//MemTable_RNorms.SortOn(fnCypher, []);
SortMemTableByParams(MemTable_RNorms, AParams, nil);
finally
EndProgress;
FreeAndNil(GroupedNorms);
//FreeList(InterfaceNormList);
//FreeAndNil(LookedInterfaces);
end;
end;
finally
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
finally
FreeAndNil(RootCatalog);
FreeAndNil(LevelColors);
end;
// Если показывать ресурсы, то выбираем ресурсы в табличку
if IsCanShowResources then
begin
TotalCost := 0;
if Assigned(ACatalog) then
begin
try
FCatalog := ACatalog;
ProjectOwner := ACatalog.GetProject;
DefinePrecisions;
NormResources := nil;
BeginProgress(pcPreparingReport);
try
// Tolik -- 21/02/2018 --
{ NormResources := ACatalog.GetAllNormsResources([nrResources, nrAccessories, nrComponents], false,
IntToBool(AReportItemParamValues.CanHaveActiveComponents), IntToBool(AReportItemParamValues.CanHaveDismountAccount),
true, false, true, true);}
NormResources := ACatalog.GetAllNormsResources([nrResources, nrAccessories, nrComponents], false,
IntToBool(AReportItemParamValues.CanHaveActiveComponents), IntToBool(AReportItemParamValues.CanHaveDismountAccount),
true, false, true, inttobool(AReportItemParamValues.CanHaveSupplyValue));
//
//if ACanHaveSupplyValue or ACanRoundValue then
for i := 0 to NormResources.Resources.Count - 1 do
begin
ResourceRel := NormResources.Resources[i];
ResourceCompon := nil;
if Not ResourceRel.ServIsResource then
if TSCSResourceGroup(ResourceRel).ObjectList.Count > 0 then
if TSCSResourceGroup(ResourceRel).ObjectList[0] is TSCSComponent then
begin
ResourceCompon := TSCSComponent(TSCSResourceGroup(ResourceRel).ObjectList[0]);
end;
if ResourceCompon <> nil then
begin
SprSuppliesKind := nil;
// if ACanHaveSupplyValue then
if ResourceRel.GUIDSuppliesKind <> '' then
SprSuppliesKind := ProjectOwner.Spravochnik.GetSuppliesKindByGUID(ResourceRel.GUIDSuppliesKind);
//*** Учитывать поставочные велечины
if SprSuppliesKind <> nil then
begin
if CheckIsTradUOM(TF_Main(GForm).FUOM) then
begin
ResourceRel.Izm := SprSuppliesKind.Data.NameTradUOM;
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
// Для кабелей и каналов в традиционной системы США нужно юзать ФУТЫ
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, umFoot) / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := FloatInUOM(ResourceRel.Price, umFoot, umMetr) * SprSuppliesKind.Data.UnitKolvoTradUOM;
end
else
begin
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvoTradUOM;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvoTradUOM;
end;
end
else
begin
ResourceRel.Izm := SprSuppliesKind.Data.Name;
ResourceRel.Kolvo := ResourceRel.Kolvo / SprSuppliesKind.Data.UnitKolvo;
ResourceRel.Price := ResourceRel.Price * SprSuppliesKind.Data.UnitKolvo;
end;
ResourceRel.CalcCost;
end
else
begin
if CheckPriceTransformToUOMByCompType(@ResourceCompon.ComponentType) then
begin
ResourceRel.Izm := GetNameUOM(TF_Main(GForm).FUOM, true);
if TF_Main(GForm).FUOM <> umMetr then
begin
ResourceRel.Kolvo := FloatInUOM(ResourceRel.Kolvo, umMetr, TF_Main(GForm).FUOM);
ResourceRel.Price := FloatInUOM(ResourceRel.Price, TF_Main(GForm).FUOM, umMetr);
ResourceRel.CalcCost;
end;
end;
end;
end;
//*** Учитывать флаг округления в большую сторону
//if ACanRoundValue then
if AReportItemParamValues.CanRoundValue = biTrue then
begin
ResourceRel.Kolvo := RoundUp(ResourceRel.Kolvo);
ResourceRel.CalcCost;
end;
end;
MemTable_RResources.Active := false;
MemTable_RResources.Active := true;
while not MemTable_RResources.Eof do
MemTable_RResources.Delete;
LoadResourcesOnlyToMT(NormResources.Resources);
SortMemTableByParams(MemTable_RResources, AParams, nil);
MemTable_RResources.First;
finally
EndProgress;
if NormResources <> nil then
FreeAndNil(NormResources);
end;
except
on E: Exception do AddExceptionToLog('TF_ResourceReport.ShowListResourceReport: '+E.Message);
end;
end;
CurrTick := GetTickCount - OldTick;
CurrTick := GetTickCount - OldTick;
end;
GFormMode := AParams.Mode;
ShowPreparedReport(AParams);
except
on E: Exception do AddExceptionToLogExt(ClassName, 'ShowCommerceInvoice', E.Message);
end;
// Tolik
// по типу сети (отключаем)
INeedNormsRecources :=True;
end;
// Tolik
// отчет путь кабеля
// взят старый за образец и немножко переделан совсем
procedure TF_ResourceReport.ShowCablePaths(AParams: TReportItemParams);
var
//Params: TReportItemParams;
Interf: TSCSInterface;
i, j, k, l, m: Integer;
//Tolik
// EndComponents, EndPathListConnected: TObjectList;
AllConnectedCompons, ConnectedCompons: TSCSComponents;
SCSComponent, currCompon: TSCSComponent;
currCable: TSCSComponent;
Interfaces: TSCSInterfaces;
ComponIndex: integer;
ConnectedCable : TSCSComponent;
BeginSide, EndSide : integer;
FromName : TStringList;
InterfName : string;
InterfaceFrom, InterFaceTo: integer;
// пути и компоненты концов подключения
currID: integer;
AddInterfaces: boolean;
EndPathList, PathList: TCabPaths;
DescriptionList: TCabPathInfos;
PathListLength, DescriptionListLength: Integer;
HasConnection, Passed: Boolean; // присоединен ли кабель к чему-нибудь
BeginCompon, EndCompon, BeginCable, EndCable: TSCSComponent;
BeginCompons, EndCompons: TSCSComponents;
CablesPassed: TSCSComponents;
CablePath : TStringList;
WasChangedInterFaces, WasChangedBeginEnd: boolean;
currInterfaces, AllCableInterFaces : TSCSInterfaces;
InterFacesNpp : integer;
InterfPos : integer; // позиции интерфейсов (практически - распиновка)
s, BeginName, EndName : string;
path1 : TInterfPath;
InterfacePosition, InterfacePosition1 : TSCSInterfPosition;
InterfNames : TStringList;
CableBusyInterfaces: integer;
BeginCableSide, EndCableSide: integer; //стороны подключения кабеля в начале и в конце (бывает 1 или 2)
PosNumber: Integer;
BeginPos, EndPos : Integer;
WasChanged: Boolean;
NameList: TStringList;
InterfacePositions : TIntList; // занятые позиции интерфейса
HasCableCanals: boolean;
PassedPositions: TIntList;
BeginPortInfo, EndPortInfo: PortInform;
NumPairEqual: Boolean;
ComponList: CList;
Counter: Integer;
ConnectedCables, StrangeCables: TSCSComponents;
// Tolik 04/09/2016 --
Side1InterfList, Side2InterfList: TList;
Side1CableCompon, Side2CableCompon: TSCSComponent;
CanSeekCable : Boolean;
ConnectedPosFound: Boolean;
ConnectInerfSide1, ConnectInterfSide2 : integer;
FCableCatalog: TSCSCatalog;
FCableFigure: TOrthoLine;
CableWayCompon: TCableWayCompon;
FCableNpp: Integer; // количество функциональных интерфейсов кабеля;
currNPP: Integer;
CableWay : TList;
CurrentInterface: TSCSInterface;
//InterfPos : TSCSInterfPosition;
//
// формирует строку из списка чисел
Function GetNumberCount(AList : TIntList) : string;
Var
i,j: Integer;
Passed: Boolean;
BeginPos, EndPos: Integer;
Begin
//сортируем список
Passed := true;
while Passed do
begin
Passed := false;
for i := 0 to AList.Count - 2 do
begin
if AList[i] > AList[i+1] then
begin
Passed := true;
j := AList[i];
AList[i] := AList[i+1];
AList[i+1] := j;
end;
end;
end;
Result := '(';
// если портов меньше трех, то выведем по порядку через запятую
if AList.Count < 2 then
begin
for i := 0 to AList.Count - 1 do
begin
if Result[Length(Result)] <> '(' then
Result := Result + ',';
Result := Result + inttostr(AList[i]);
end;
Passed := true;
end
else
// если портов больше трех, смотрим, что можно вывести в сокращенной записи типа(1-3)
begin
Passed := false;
BeginPos := AList[0];
EndPos := AList[0];
for i := 0 to AList.Count - 2 do
begin
// порты подключены подряд
if ((AList[i+1] - EndPos) = 1) then
begin
inc(EndPos);
// Passed := true;
end
// не подряд - записываем отработанные
else
begin
// если прошли один порт
if (BeginPos = EndPos) then
begin
if Result[Length(Result)] <> '(' then
Result := Result + ',';
Result := Result + inttostr(BeginPos);
Passed := false;
end
//если прошли несколько портов
else
begin
if Result[Length(Result)] <> '(' then
Result := Result + ',';
if ((EndPos - BeginPos) > 1) then
Result := Result + inttostr(BeginPos) + '-'+inttostr(EndPos)
else
Result := Result + inttostr(BeginPos) + ','+inttostr(EndPos);
Passed := False;
end;
// следующая позиция
BeginPos := AList[i+1];
EndPos := AList[i+1];
Passed := false;
end;
end;
end;
if not Passed then
begin
if (BeginPos = EndPos) then
begin
if Result[Length(Result)] <> '(' then
Result := Result + ',' + inttostr(BeginPos)
else
Result := Result + inttostr(BeginPos);
Passed := false;
end
//если прошли несколько портов
else
begin
if Result[Length(Result)] <> '(' then
Result := Result + ',';
if ((EndPos - BeginPos) > 1) then
Result := Result + inttostr(BeginPos) + '-'+inttostr(EndPos)
else
Result := Result + inttostr(BeginPos) + ','+inttostr(EndPos);
Passed := False;
end;
end;
Result := Result+')';
End;
// Tolik -- 04/09/2016 --
Procedure GetCableWayBySide(aSide, aNpp, ACurrNpp: Integer; aCableCompon: TSCSComponent; aWayListSide: Integer);
var i, j, k: Integer;
InterfPos, CableInterfPos: TSCSInterfPosition;
TempNpp, CurrNpp: Integer;
CurrInterface, PointComponInterface, InternalInterface: TSCSInterface;
InterfSide: Integer;
ConnectedPosFound: Boolean;
//CanSeekCable: Boolean;
InternalConnection: Boolean;
PointCompon, InternalConnectedCompon: TSCSComponent;
InternalConnSide: Integer;
CanSeekCable: Boolean;
// Tolik
PassedCableList: TList;
//
begin
PassedCableList := TList.Create;
CurrNpp := ACurrNpp;
TempNpp := 0; //смещение позиции интерфейса
InterfSide := aSide;
CanSeekCable := True;
ConnectedPosFound := False;
InterfPos := Nil;
// сброс конечного компонента
if aWayListSide = 1 then
begin
TCableWayCompon(CableWay[aNpp-1]).FirstCompon := nil;
TCableWayCompon(CableWay[aNpp-1]).Side1ConnectedInterface := nil;
end
else
if aWayListSide = 2 then
begin
TCableWayCompon(CableWay[aNpp-1]).LastCompon := nil;
TCableWayCompon(CableWay[aNpp-1]).Side2ConnectedInterface := nil;
end;
// определить позицию жилы
for j := 0 to aCableCompon.Interfaces.Count - 1 do
begin
CurrInterface := TSCSInterface(aCableCompon.Interfaces[j]);
//if (CurrInterface.TypeI = itFunctional) and (CurrInterface.Side = ConnectInerfSide1) then
if (CurrInterface.TypeI = itFunctional) and (CurrInterface.Side = aSide) then
begin
if ((CurrInterface.IsBusy = biTrue) or (CurrInterface.BusyPositions.Count > 0)) then
begin
for k := 0 to CurrInterface.BusyPositions.Count - 1 do
begin
InterfPos := TSCSInterfPosition(CurrInterface.BusyPositions[k]);
if (((InterfPos.FromPos + TempNpp) <= ACurrNpp) and ((InterfPos.ToPos + TempNpp) >= ACurrNpp)) then
begin
ConnectedPosFound := True;
CableInterfPos := InterfPos;
InterfPos := InterfPos.GetConnectedPos;
break;
end;
end;
if ConnectedPosFound then
Break; //// BREAK ////
end;
TempNpp := TempNpp + CurrInterface.Kolvo;
end;
end;
if ConnectedPosFound then
begin
InternalInterface := nil;
if ((InterfPos.InterfOwner.ComponentOwner <> nil) and (InterfPos.InterfOwner.ComponentOwner.isLine = biFalse)) then
begin
InternalConnection := False;
PointComponInterface := TSCSInterface(InterfPos.InterfOwner);
// прописать конец пути (пришли на поинт)
if aWayListSide = 1 then
begin
TCableWayCompon(CableWay[aNpp-1]).FirstCompon := PointComponInterface.ComponentOwner;
TCableWayCompon(CableWay[aNpp-1]).Side1ConnectedInterface := InterfPos.InterfOwner;
end
else
if aWayListSide = 2 then
begin
TCableWayCompon(CableWay[aNpp-1]).LastCompon := PointComponInterface.ComponentOwner;
TCableWayCompon(CableWay[aNpp-1]).Side2ConnectedInterface := InterfPos.InterfOwner;
end;
// если это проходящее соединение --
TempNpp := 0;
for i := 0 to PointComponInterface.InternalConnected.Count - 1 do
begin
InternalInterface := TSCSInterface(PointComponInterface.InternalConnected[i]);
if ((TempNpp <= ACurrNpp) and ((InternalInterface.Kolvo + TempNpp) >= ACurrNpp)) then
begin
//ShowMessage('InternalConnection Found on ' + PointComponInterface.ComponentOwner.Name);
break;
end
else
begin
CurrNpp := CurrNpp - InternalInterface.Kolvo;
TempNpp := TempNpp + InternalInterface.Kolvo;
end;
end;
end;
if InternalInterface <> nil then
begin
TempNpp := 0;
if InternalInterface.Kolvo > InterfPos.InterfOwner.Kolvo then
begin
for i := 0 to InternalInterface.InternalConnected.Count - 1 do
begin
if InternalInterface.InternalConnected[i] <> InterfPos.InterfOwner then
begin
TempNpp := TempNpp + InternalInterface.InternalConnected[i].Kolvo;
end
else
begin
CurrNpp := currNpp + TempNpp;
TempNpp := 0;
Break; //// BREAK ////;
end;
end;
end;
// определить позицию пришедшего интерфейса по отношению к подключенному через точку
for i := 0 to InternalInterface.BusyPositions.Count - 1 do
begin
InterfPos := TSCSInterfPosition(InternalInterface.BusyPositions[i]);
if (InterfPos.FromPos <= CurrNpp) and (InterfPos.ToPos >= currNpp) then
begin
InterfPos := InterfPos.GetConnectedPos;
if InterfPos <> nil then
begin
InterNalConnectedCompon := InterfPos.InterfOwner.ComponentOwner;
if ((InternalConnectedCompon <> nil) and IsCableComponent(InternalConnectedCompon)) then
begin
if InterfPos.InterfOwner.Side = 1 then
InternalConnSide := 2
else
if InterfPos.InterfOwner.Side = 2 then
InternalConnSide := 1;
// вписать путь
if aWayListSide = 1 then
begin
TCableWayCompon(CableWay[aNpp - 1]).WayList.Insert(0, TCableWayCompon(CableWay[aNpp - 1]).FirstCompon);
TCableWayCompon(CableWay[aNpp - 1]).FirstCompon := nil;
TCableWayCompon(CableWay[aNpp - 1]).Side1ConnectedInterface := Nil;
TCableWayCompon(CableWay[aNpp - 1]).WayList.Insert(0, InterNalConnectedCompon);
end
else
if aWayListSide = 2 then
begin
TCableWayCompon(CableWay[aNpp - 1]).WayList.Add(TCableWayCompon(CableWay[aNpp - 1]).LastCompon);
TCableWayCompon(CableWay[aNpp - 1]).LastCompon := nil;
TCableWayCompon(CableWay[aNpp - 1]).Side2ConnectedInterface := Nil;
TCableWayCompon(CableWay[aNpp - 1]).WayList.Add(InterNalConnectedCompon);
end;
CanSeekCable := True;
while CanSeekCable do
begin
CanSeekCable := False;
for j := 0 to InterNalConnectedCompon.Interfaces.Count - 1 do
begin
if (TSCSInterface(InterNalConnectedCompon.Interfaces[j]).TypeI = itFunctional) and
(TSCSInterface(InterNalConnectedCompon.Interfaces[j]).Side = InternalConnSide) and
((TSCSInterface(InterNalConnectedCompon.Interfaces[j]).isBusy = biTrue) or
((TSCSInterface(InterNalConnectedCompon.Interfaces[j]).BusyPositions.Count > 0 ))) then
begin
InterfPos := TSCSInterfPosition(TSCSInterface(InterNalConnectedCompon.Interfaces[j]).BusyPositions[0]);
InterfPos := InterfPos.GetConnectedPos;
if InterfPos <> nil then
begin
// присоединен кабель
if IsCableComponent(InterfPos.InterfOwner.ComponentOwner) then
begin
//сторона для последующего соединения
if InterfPos.InterfOwner.Side = 1 then
InternalConnSide := 2
else
if InterfPos.InterfOwner.Side = 2 then
InternalConnSide := 1;
// переопределяем текущий кабель
InterNalConnectedCompon := TSCSComponent(InterfPos.InterfOwner.ComponentOwner);
// вписать путь
if aWayListSide = 1 then
TCableWayCompon(CableWay[aNpp -1]).WayList.Insert(0, InterNalConnectedCompon)
else
if aWayListSide = 2 then
TCableWayCompon(CableWay[aNpp -1]).WayList.Add(InterNalConnectedCompon);
CanSeekCable := True;
Break; //// BREAK ////
end
// дошли до точки
else
begin
if TSCSComponent(InterfPos.InterfOwner.ComponentOwner).isLine = biFalse then
begin
// точка
PointCompon := TSCSComponent(InterfPos.InterfOwner.ComponentOwner);
if aWayListSide = 1 then
begin
TCableWayCompon(CableWay[aNpp -1]).FirstCompon := TSCSComponent(InterfPos.InterfOwner.ComponentOwner);
TCableWayCompon(CableWay[aNpp -1]).Side1ConnectedInterface := InterfPos.InterfOwner;
end
else
if aWayListSide = 2 then
begin
TCableWayCompon(CableWay[aNpp -1]).LastCompon := TSCSComponent(InterfPos.InterfOwner.ComponentOwner);
TCableWayCompon(CableWay[aNpp -1]).Side2ConnectedInterface := InterfPos.InterfOwner;
end;
CanSeekCable := False;
Break; //// BREAK ////
end;
end;
end;
end;
end;
end;
// GetCableWayBySide(aSide, aNpp, CurrNpp, InterNalConnectedCompon, aWayListSide);
GetCableWayBySide(InternalConnSide, aNpp, CurrNpp, InterNalConnectedCompon, aWayListSide);
end;
end;
end;
end;
end;
end;
PassedCableList.Free;
end;
//Tolik 05/09/2016 --
Procedure SortWayList;
var i: Integer;
CanSort: Boolean;
CurrWay: TCableWayCompon;
begin
CanSort := True;
while CanSort do
begin
CanSort := False;
for i := (CableWay.Count - 1) downto 1 do
begin
if (TCableWayCompon(CableWay[i-1]).FirstCompon = nil) and (TCableWayCompon(CableWay[i-1]).LastCompon = nil) and
((TCableWayCompon(CableWay[i]).FirstCompon <> nil) or (TCableWayCompon(CableWay[i]).LastCompon <> nil)) then
begin
CurrWay := TCableWayCompon(CableWay[i]);
CableWay[i] := CableWay[i - 1];
CableWay[i] := CurrWay;
Cansort := True;
break;
end;
end;
end;
end;
Procedure PackWayList;
Var i, j, TempVal: Integer;
CanPack: Boolean;
CurrWay: TCableWayCompon;
CanSort: Boolean;
begin
CanPack := True;
// слить до кучи одинаковые
if CableWay.Count > 1 then
begin
CurrWay := TCableWayCompon(CableWay[CableWay.Count - 1]);
for i := (CableWay.Count - 2) downto 0 do
begin
if (CurrWay.FirstCompon = TCableWayCompon(CableWay[i]).FirstCompon) and
(CurrWay.LastCompon = TCableWayCompon(CableWay[i]).LastCompon) and
(CurrWay.WayList.Count = TCableWayCompon(CableWay[i]).WayList.Count) then
begin
CanPack := True;
for j := 0 to CurrWay.WayList.Count - 1 do
begin
if TSCSComponent(CurrWay.WayList[j]).ID <> TSCSComponent(TCableWayCompon(CableWay[i]).WayList[j]).Id then
begin
CanPack := False;
Break; //// BREAK ////;
end;
end;
if CanPack then
begin
TCableWayCompon(CableWay[i]).Passed := True;
// CurrWay.GroupedNpp := CurrWay.GroupedNpp + ',' + IntToStr(TCableWayCompon(CableWay[i]).Npp);
if CurrWay.GroupedNpp.IndexOf(TCableWayCompon(CableWay[i]).Npp) = -1 then
CurrWay.GroupedNpp.Add(TCableWayCompon(CableWay[i]).Npp);
end;
end
else
CurrWay := TCableWayCompon(CableWay[i]);
end;
// удалить лишние
for i := CableWay.Count - 1 downto 0 do
begin
if TCableWayCompon(CableWay[i]).Passed then
begin
CurrWay := TCableWayCompon(CableWay[i]);
FreeAndNil(CurrWay);
CableWay.Delete(i);
end;
end;
// сортануть номера интерфейсов и портов
for i := 0 to CableWay.Count - 1 do
begin
if TCableWayCompon(CableWay[i]).GroupedNpp.Count > 1 then
begin
CanSort := True;
while CanSort do
begin
CanSort:= False;
for j := 0 to TCableWayCompon(CableWay[i]).GroupedNpp.Count - 2 do
begin
if TCableWayCompon(CableWay[i]).GroupedNpp[j] > TCableWayCompon(CableWay[i]).GroupedNpp[j+1] then
begin
CanSort := True;
TempVal := TCableWayCompon(CableWay[i]).GroupedNpp[j];
TCableWayCompon(CableWay[i]).GroupedNpp[j] := TCableWayCompon(CableWay[i]).GroupedNpp[j+1];
TCableWayCompon(CableWay[i]).GroupedNpp[j+1] := TempVal;
end;
end;
end;
end;
end;
end;
end;
//6/09/2016 --
Procedure SaveWayListToTables;
var i, j, k, l, m, ParentID: Integer;
TempCableWayCompon, currCableWayCompon: TCableWayCompon;
ComponName: String;
ParentCompon: TSCSComponent;
s: String;
CanSave: Boolean;
Side1ComponList, Side2ComponList: TList;
Side1InterfList, Side2InterfList: TList;
CableInterfCount: Integer;
SavedPosCount: Integer;
SaveList: TList;
EqualCableWay: Boolean;
TopCompon1, TopCompon2: TSCSComponent;
List1, List2, List3, List4: TList;
CableInterfList, Side1PortList, Side2PortList: TIntList;
Side1PortNameList, Side2PortNameList: TStringList;
TempPortList: TIntList; // для сборки
MasterId: Integer;//для связки
InterfGuideList: TStringList; // список идентификаторов интерфейсов в кабеле
TempList: TList;
PortListString1, PortListString2: string;
PortNameList1, PortNameList2: TStringList;
CanLookPort: Boolean;
ComponInterfList: TIntList;
ComponInterfCount: Integer;
Function IsEqualWay(aCompon1, aCompon2: TCableWayCompon): Boolean;
var i: Integer;
begin
Result := True;
if (aCompon1.CableInterface.GUIDInterface <> aCompon2.CableInterface.GUIDInterface) or
(aCompon1.WayList.Count <> aCompon2.WayList.Count) then
begin
Result := False;
exit;
end;
for i := 0 to aCompon1.WayList.Count - 1 do
begin
if TSCSComponent(aCompon1.WayList[i]).ID <> TSCSComponent(aCompon2.WayList[i]).ID then
begin
Result := False;
Break; //// BREAK ////;
end;
end;
end;
begin
// инициализация списков (чтобы не проебать)
Side1ComponList := nil;
Side2ComponList := nil;
Side1InterfList := nil;
Side2InterfList := nil;
SaveList := nil;
List1 := nil;
List2 := nil;
List3 := nil;
List4 := nil;
CableInterfList := nil;
Side1PortList := nil;
Side2PortList := nil;
Side1PortNameList := nil;
Side2PortNameList := nil;
TempPortList := nil;
InterfGuideList := nil;
TempList := nil;
PortNameList1 := nil;
PortNameList2 := nil;
ComponInterfList := nil;
// если расключать интерфейсы кабеля
if cbCablePathShowConnInSeparatePaths.Checked then
begin
for i := 0 to CableWay.Count - 1 do
begin
currCableWayCompon := TCableWayCompon(CableWay[i]);
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := i+1;
FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName + ' ' + '('+ Inttostr(i+1) + ')';
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
if currCableWayCompon.FirstCompon <> nil then
begin
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.FirstCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false)+ #13#10 // + currCableWayCompon.FirstCompon.GetNameForVisible(false)
else
s := {currCableWayCompon.FirstCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 +} currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
//currCableWayCompon.FirstCompon.GetNameForVisible(False);
if (currCableWayCompon.Side1ConnectedInterface <> nil) and (currCableWayCompon.Side1ConnectedInterface.PortOwner <> nil) then
s := s + currCableWayCompon.Side1ConnectedInterface.PortOwner.LoadName+ ' ('+Inttostr(currCableWayCompon.Side1ConnectedInterface.PortOwner.NppPort) + ')'+ #13#10;
FmtCablePaths.FieldByName(fnNameFrom).AsString := s;
end
else
FmtCablePaths.FieldByName(fnNameFrom).AsString := cRepMsg270;
if currCableWayCompon.LastCompon <> nil then
begin
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.LastCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false)+ #13#10 // + currCableWayCompon.LastCompon.GetNameForVisible(False)
else
s := {currCableWayCompon.LastCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 +} currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
//currCableWayCompon.LastCompon.GetNameForVisible(False);
if (currCableWayCompon.Side2ConnectedInterface <> nil) and (currCableWayCompon.Side2ConnectedInterface.PortOwner <> nil) then
s := s + currCableWayCompon.Side2ConnectedInterface.PortOwner.LoadName+ ' ('+Inttostr(currCableWayCompon.Side2ConnectedInterface.PortOwner.NppPort) + ')'+ #13#10;
FmtCablePaths.FieldByName(fnNameTo).AsString := s;
end
else
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg270;
FmtCablePaths.Post;
if currCableWayCompon.FirstCompon <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := i+1;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
// FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 1;
ComponName := currCableWayCompon.FirstCompon.GetNameForVisible(False);
ParentCompon := currCableWayCompon.FirstCompon.GetParentComponent;
While ParentCompon <> nil do
begin
ComponName := ParentCompon.GetNameForVisible(False) + ' / ' + ComponName;
ParentCompon := ParentCompon.GetParentComponent;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
for j := 0 to currCableWayCompon.WayList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := i+1;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
// FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 1;
ComponName := TSCSComponent(currCableWayCompon.WayList[j]).GetNameForVisible(False);
if IsCableComponent(TSCSComponent(currCableWayCompon.WayList[j])) then
begin
if cbCablePathShowCableCanals.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[j]).GetParentComponent <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[j]).GetParentComponent.GetNameForVisible(false) + ' / ' + ComponName;
end;
if cbCablePathShowObjName.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[j]).GetFirstParentCatalog <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[j]).GetFirstParentCatalog.GetNameForVisible(False) + ' / ' + ComponName;
end;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
if currCableWayCompon.LastCompon <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := i+1;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
// FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 1;
ComponName := currCableWayCompon.LastCompon.GetNameForVisible(False);
ParentCompon := currCableWayCompon.LastCompon.GetParentComponent;
While ParentCompon <> nil do
begin
ComponName := ParentCompon.GetNameForVisible(False) + ' / ' + ComponName;
ParentCompon := ParentCompon.GetParentComponent;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end
end;
// сбросить путь
for i := (CableWay.Count - 1) downto 0 do
begin
currCableWayCompon := TCableWayCompon(CableWay[i]);
CableWay.Delete(i);
FreeAndNil(currCableWayCompon);
end;
FreeAndNil(CableWay);
end
else
// не расключать интерфейсы кабеля
begin
List1 := TList.Create; // point - to - point
List2 := TList.Create; // Point - to - Nil
List3 := TList.Create; // Nil - To - Point
List4 := TList.Create; // Nil - to - Nil
// разбить по типам конечных подключений
for i := 0 to CableWay.Count - 1 do
begin
if (TCableWayCompon(CableWay[i]).FirstCompon <> nil) and (TCableWayCompon(CableWay[i]).LastCompon <> nil) then
List1.Add(TCableWayCompon(CableWay[i]))
else
if (TCableWayCompon(CableWay[i]).FirstCompon <> nil) and (TCableWayCompon(CableWay[i]).LastCompon = nil) then
List2.Add(TCableWayCompon(CableWay[i]))
else
if (TCableWayCompon(CableWay[i]).FirstCompon = nil) and (TCableWayCompon(CableWay[i]).LastCompon <> nil) then
List3.Add(TCableWayCompon(CableWay[i]))
else
if (TCableWayCompon(CableWay[i]).FirstCompon = nil) and (TCableWayCompon(CableWay[i]).LastCompon = nil) then
List4.Add(TCableWayCompon(CableWay[i]));
end;
// сложить то, что получилось
CableInterfList := TIntList.Create;
Side1PortList := TIntList.Create;
Side2PortList := TIntList.Create;
Side1PortNameList := TStringList.Create;
Side2PortNameList := TStringList.Create;
TempPortList := TIntList.Create; // для сборки
MasterId := 1;
InterfGuideList := TStringList.Create;
TempList := TList.Create;
PortNameList1 := TStringList.Create;
PortNameList2 := TstringList.Create;
Side1ComponList := TList.Create;
Side2ComponList := TList.Create;
ComponInterfList := TIntList.Create;
// PointToPoint
if List1.Count > 0 then
begin
CanSave := True;
for i := 0 to List1.Count - 1 do
begin
if InterfGuideList.IndexOf(TCableWayCompon(List1[i]).CableInterface.GUIDInterface) = -1 then
InterfGuideList.Add(TCableWayCompon(List1[i]).CableInterface.GUIDInterface);
end;
While CanSave do
begin
CanSave := False;
for i := 0 to InterfGuideList.Count - 1 do
begin
currCableWayCompon := Nil;
for j := 0 to List1.Count - 1 do
begin
if (not TCableWayCompon(List1[j]).Passed) and (TCableWayCompon(List1[j]).CableInterface.GUIDInterface = InterfGuideList[i]) then
begin
currCableWayCompon := TCableWayCompon(List1[j]);
TCableWayCompon(List1[j]).Passed := True;
Break; //// BREAK ////;
end;
end;
if currCableWayCompon <> nil then
begin
CanSave := True;
TempList.Clear;
TempList.Add(currCableWayCompon);
for j := 0 to List1.Count - 1 do
begin
if (not TCableWayCompon(List1[j]).Passed) and IsEqualWay(currCableWayCompon, List1[j]) then
begin
TCableWayCompon(List1[j]).Passed := true;
TempList.Add(TCableWayCompon(List1[j]));
end;
end;
TempPortList.Clear;
PortNameList1.Clear;
PortNameList2.Clear;
PortListString1 := '';
PortListString2 := '';
// порты (для верхнего компонента)
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 1)
s := '';
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1.IndexOf(s) = -1 then
PortNameList1.Add(s);
end;
// порты (сторона 2)
s := '';
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2.IndexOf(s) = -1 then
PortNameList2.Add(s);
end;
end;
Side1PortList.Clear;
Side2PortList.Clear;
// side1
for k := 0 to PortNameList1.Count - 1 do
begin
for j := 0 to TempList.Count - 1 do
begin
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.LoadName;
if (s = PortNameList1[k]) and
(Side1PortList.IndexOf(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort)= -1) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort);
end;
end;
if PortListString1 = '' then
PortListString1 := PortListString1 + ' ' + PortNameList2[k] + GetNumberCount(Side1PortList)
else
PortListString1 := PortListString1 + ',' + ' ' + PortNameList2[k] + GetNumberCount(Side1PortList);
Side1PortList.Clear;
end;
// side2
for k := 0 to PortNameList2.Count - 1 do
begin
for j := 0 to TempList.Count - 1 do
begin
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.LoadName;
if (s = PortNameList2[k]) and
(Side2PortList.IndexOf(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort)= -1) then
Side2PortList.Add(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort);
end;
end;
if PortListString2 = '' then
PortListString2 := PortListString2 + ' ' + PortNameList2[k] + GetNumberCount(Side2PortList)
else
PortListString2 := PortListString2 + ',' + ' ' + PortNameList2[k] + GetNumberCount(Side2PortList);
Side2PortList.Clear;
end;
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 1)
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort);
// порты (сторона 2)
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort);
// пины кабеля
TempPortList.Add(TCableWayCompon(TempList[j]).Npp);
end;
currCableWayCompon := TCableWayCompon(TempList[0]);
TopCompon1 := currCableWayCompon.FirstCompon.GetTopComponent;
TopCompon2 := currCableWayCompon.LastCompon.GetTopComponent;
// ЗАПИСЬ
// заголовок
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName +
' ' + IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
s := '';
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.FirstCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false)+ #13#10
else
s := currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
s := s + PortListString1;
FmtCablePaths.FieldByName(fnNameFrom).AsString := s;
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.LastCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false)+ #13#10 // + currCableWayCompon.LastCompon.GetNameForVisible(False)
else
s := currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
s := s + PortListString2;
FmtCablePaths.FieldByName(fnNameTo).AsString := s;
FmtCablePaths.Post;
// путь
// компоненты сторон
Side1ComponList.Clear;
Side2ComponList.Clear;
for j := 0 to TempList.Count - 1 do
begin
if Side1ComponList.IndexOf(TCableWayCompon(TempList[j]).FirstCompon) = -1 then
Side1ComponList.Add(TCableWayCompon(TempList[j]).FirstCompon);
if Side2ComponList.IndexOf(TCableWayCompon(TempList[j]).LastCompon) = -1 then
Side2ComponList.Add(TCableWayCompon(TempList[j]).LastCompon);
end;
// вкатать в таблицу начальные компоненты
for k := 0 to Side1ComponList.Count - 1 do
begin
ComponInterfList.Clear;
ComponInterfCount := 0;
// жилы, подключенные к компоненту
for j := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[j]).FirstCompon.ID = TSCSComponent(Side1ComponList[k]).ID then
begin
Inc(ComponInterfCount);
if ComponInterfList.IndexOf(TCableWayCompon(TempList[j]).Npp) = -1 then
ComponInterfList.Add(TCableWayCompon(TempList[j]).Npp);
end;
end;
// определить порты компонента, подключенные к жилам
Side1PortList.Clear;
PortNameList1.Clear;
// наименования портов
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1.IndexOf(s) = -1 then
PortNameList1.Add(s);
end;
end;
end;
end;
// формируем наименование + нумерация
PortListString1 := '';
for m := 0 to PortNameList1.count - 1 do
begin
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1[m] = s then
if Side1PortList.IndexOf(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.NppPort) = -1 then
Side1PortList.Add(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.NppPort);
end;
end;
end;
end;
if PortListString1 = '' then
PortListString1 := PortListString1 + s + GetNumberCount(Side1PortList)
else
PortListString1 := PortListString1 + ', ' + s + GetNumberCount(Side1PortList);
Side1PortList.Clear;
end;
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := ComponInterfCount;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
TopCompon1 := TSCSComponent(Side1ComponList[k]);
ComponName := TSCSComponent(Side1ComponList[k]).GetNameForVisible(False);
if TopCompon1 <> nil then
begin
while not TopCompon1.IsTop do
begin
TopCompon1 := TopCompon1.GetParentComponent;
if TopCompon1 <> nil then
begin
if not TopCompon1.IsTop then
ComponName := TopCompon1.GetNameForVisible(false) + '/' + ComponName;
end
else
Break; //// BREAK ////
end;
end;
if PortListString1 = '' then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName + ' ' + PortListString1;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' '; // currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
// вкатать путь -- кабель с транзитными компонентами
for k := 0 to currCableWayCompon.WayList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetNameForVisible(False);
if IsCableComponent(TSCSComponent(currCableWayCompon.WayList[k])) then
begin
if cbCablePathShowCableCanals.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent.GetNameForVisible(false) + ' / ' + ComponName;
end;
if cbCablePathShowObjName.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog.GetNameForVisible(False) + ' / ' + ComponName;
end;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList) + ' ' + ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' ';{IntToStr(TempList.Count) +
' ' + GetNumberCount(TempPortList) + ' ' + ComponName;}
FmtCablePathsInfo.Post;
end;
// вкатать конечные компоненты
for k := 0 to Side2ComponList.Count - 1 do
begin
ComponInterfList.Clear;
ComponInterfCount := 0;
for j := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[j]).LastCompon.ID = TSCSComponent(Side2ComponList[k]).ID then
begin
Inc(ComponInterfCount);
if ComponInterfList.IndexOf(TCableWayCompon(TempList[j]).Npp) = -1 then
ComponInterfList.Add(TCableWayCompon(TempList[j]).Npp);
end;
end;
// определить порты компонента, подключенные к жилам
Side2PortList.Clear;
PortNameList2.Clear;
// наименования портов
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2.IndexOf(s) = -1 then
PortNameList2.Add(s);
end;
end;
end;
end;
// формируем наименование + нумерация
PortListString2 := '';
for m := 0 to PortNameList2.count - 1 do
begin
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2[m] = s then
if Side2PortList.IndexOf(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.NppPort) = -1 then
Side2PortList.Add(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.NppPort);
end;
end;
end;
end;
if PortListString2 = '' then
PortListString2 := PortListString2 + s + GetNumberCount(Side2PortList)
else
PortListString2 := PortListString2+ ', ' + s + GetNumberCount(Side2PortList);
Side2PortList.Clear;
end;
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponName := TSCSComponent(Side2ComponList[k]).GetNameForVisible(False);
TopCompon2 := TSCSComponent(Side2ComponList[k]);
if TopCompon2 <> nil then
begin
while not TopCompon2.IsTop do
begin
TopCompon2 := TopCompon2.GetParentComponent;
if TopCompon2 <> nil then
begin
if not TopCompon2.IsTop then
ComponName := TopCompon2.GetNameForVisible(false) + '/' + ComponName;
end
else
Break; //// BREAK ////
end;
end;
if PortListString2 = '' then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName + ' ' + PortListString2;
// FmtCablePathsInfo.FieldByName(fnDescription).AsString := ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' '; {inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName;}
FmtCablePathsInfo.Post;
end;
Inc(MasterId);
end;
end;
end;
end
else
FreeAndNil(List1);
//PointToNil
if List2.Count > 0 then
begin
CanSave := True;
for i := 0 to List2.Count - 1 do
begin
if InterfGuideList.IndexOf(TCableWayCompon(List2[i]).CableInterface.GUIDInterface) = -1 then
InterfGuideList.Add(TCableWayCompon(List2[i]).CableInterface.GUIDInterface);
end;
While CanSave do
begin
CanSave := False;
for i := 0 to InterfGuideList.Count - 1 do
begin
currCableWayCompon := Nil;
for j := 0 to List2.Count - 1 do
begin
if (not TCableWayCompon(List2[j]).Passed) and (TCableWayCompon(List2[j]).CableInterface.GUIDInterface = InterfGuideList[i]) then
begin
currCableWayCompon := TCableWayCompon(List2[j]);
TCableWayCompon(List2[j]).Passed := True;
Break; //// BREAK ////;
end;
end;
if currCableWayCompon <> nil then
begin
CanSave := True;
TempList.Clear;
TempList.Add(currCableWayCompon);
for j := 0 to List2.Count - 1 do
begin
if (not TCableWayCompon(List2[j]).Passed) and IsEqualWay(currCableWayCompon, List2[j]) then
begin
TCableWayCompon(List2[j]).Passed := true;
TempList.Add(TCableWayCompon(List2[j]));
end;
end;
TempPortList.Clear;
PortNameList1.Clear;
PortNameList2.Clear;
PortListString1 := '';
PortListString2 := '';
// порты (для верхнего компонента)
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 1)
s := '';
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1.IndexOf(s) = -1 then
PortNameList1.Add(s);
end;
end;
Side1PortList.Clear;
Side2PortList.Clear;
// side1
for k := 0 to PortNameList1.Count - 1 do
begin
for j := 0 to TempList.Count - 1 do
begin
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.LoadName;
if (s = PortNameList1[k]) and
(Side1PortList.IndexOf(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort)= -1) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort);
end;
end;
if PortListString1 = '' then
PortListString1 := PortListString1 + ' ' + PortNameList1[k] + GetNumberCount(Side1PortList)
else
PortListString1 := PortListString1 + ',' + ' ' + PortNameList1[k] + GetNumberCount(Side1PortList);
Side1PortList.Clear;
end;
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 1)
if (TCableWayCompon(TempList[j]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner <> nil) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side1ConnectedInterface.PortOwner.NppPort);
// пины кабеля
TempPortList.Add(TCableWayCompon(TempList[j]).Npp);
end;
currCableWayCompon := TCableWayCompon(TempList[0]);
// ЗАПИСЬ
// заголовок
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName +
' ' + IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList);
// FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName + GetNumberCount(TempPortList);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
s := '';
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.FirstCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false)+ #13#10
else
s := currCableWayCompon.FirstCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
s := s + PortListString1;
FmtCablePaths.FieldByName(fnNameFrom).AsString := s;
{ if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.LastCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false)+ #13#10 // + currCableWayCompon.LastCompon.GetNameForVisible(False)
else
s := currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
s := s + PortListString2;
}
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg270;
FmtCablePaths.Post;
// путь
// компоненты сторон
Side1ComponList.Clear;
Side2ComponList.Clear;
for j := 0 to TempList.Count - 1 do
begin
if Side1ComponList.IndexOf(TCableWayCompon(TempList[j]).FirstCompon) = -1 then
Side1ComponList.Add(TCableWayCompon(TempList[j]).FirstCompon);
end;
// вкатать в таблицу начальные компоненты
for k := 0 to Side1ComponList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponInterfList.Clear;
ComponInterfCount := 0;
for j := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[j]).FirstCompon.ID = TSCSComponent(Side1ComponList[k]).ID then
begin
Inc(ComponInterfCount);
if ComponInterfList.IndexOf(TCableWayCompon(TempList[j]).Npp) = -1 then
ComponInterfList.Add(TCableWayCompon(TempList[j]).Npp);
end;
end;
// определить порты компонента, подключенные к жилам
Side1PortList.Clear;
PortNameList1.Clear;
// наименования портов
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1.IndexOf(s) = -1 then
PortNameList1.Add(s);
end;
end;
end;
end;
// формируем наименование + нумерация
PortListString1 := '';
for m := 0 to PortNameList1.count - 1 do
begin
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side1ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.LoadName;
if PortNameList1[m] = s then
if Side1PortList.IndexOf(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.NppPort) = -1 then
Side1PortList.Add(TCableWayCompon(TempList[l]).Side1ConnectedInterface.PortOwner.NppPort);
end;
end;
end;
end;
if PortListString1 = '' then
PortListString1 := PortListString1 + s + GetNumberCount(Side1PortList)
else
PortListString1 := PortListString1 + ', ' + s + GetNumberCount(Side1PortList);
Side1PortList.Clear;
end;
TopCompon1 := TSCSComponent(Side1ComponList[k]);
ComponName := TSCSComponent(Side1ComponList[k]).GetNameForVisible(False);
if TopCompon1 <> nil then
begin
while not TopCompon1.IsTop do
begin
TopCompon1 := TopCompon1.GetParentComponent;
if TopCompon1 <> nil then
begin
if not TopCompon1.IsTop then
ComponName := TopCompon1.GetNameForVisible(false) + '/' + ComponName;
end
else
Break; //// BREAK ////
end;
end;
// ComponName := TSCSComponent(Side1ComponList[k]).GetNameForVisible(False);
if PortListString1 = '' then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName + ' ' + PortListString1;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' '; // currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
// вкатать путь -- кабель с транзитными компонентами
for k := 0 to currCableWayCompon.WayList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetNameForVisible(False);
if IsCableComponent(TSCSComponent(currCableWayCompon.WayList[k])) then
begin
if cbCablePathShowCableCanals.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent.GetNameForVisible(false) + ' / ' + ComponName;
end;
if cbCablePathShowObjName.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog.GetNameForVisible(False) + ' / ' + ComponName;
end;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList) + ' ' +ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' ';// currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
Inc(MasterId);
end;
end;
end;
end
else
FreeAndNil(List2);
//NilToPoint
if List3.Count > 0 then
begin
CanSave := True;
for i := 0 to List3.Count - 1 do
begin
if InterfGuideList.IndexOf(TCableWayCompon(List3[i]).CableInterface.GUIDInterface) = -1 then
InterfGuideList.Add(TCableWayCompon(List3[i]).CableInterface.GUIDInterface);
end;
While CanSave do
begin
CanSave := False;
for i := 0 to InterfGuideList.Count - 1 do
begin
currCableWayCompon := Nil;
for j := 0 to List3.Count - 1 do
begin
if (not TCableWayCompon(List3[j]).Passed) and (TCableWayCompon(List3[j]).CableInterface.GUIDInterface = InterfGuideList[i]) then
begin
currCableWayCompon := TCableWayCompon(List3[j]);
TCableWayCompon(List3[j]).Passed := True;
Break; //// BREAK ////;
end;
end;
if currCableWayCompon <> nil then
begin
CanSave := True;
TempList.Clear;
TempList.Add(currCableWayCompon);
for j := 0 to List3.Count - 1 do
begin
if (not TCableWayCompon(List3[j]).Passed) and IsEqualWay(currCableWayCompon, List3[j]) then
begin
TCableWayCompon(List3[j]).Passed := true;
TempList.Add(TCableWayCompon(List3[j]));
end;
end;
TempPortList.Clear;
PortNameList1.Clear;
PortNameList2.Clear;
PortListString1 := '';
PortListString2 := '';
// порты (для верхнего компонента)
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 2)
s := '';
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2.IndexOf(s) = -1 then
PortNameList2.Add(s);
end;
end;
// side2
Side2PortList.Clear;
for k := 0 to PortNameList2.Count - 1 do
begin
for j := 0 to TempList.Count - 1 do
begin
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.LoadName;
if (s = PortNameList2[k]) and
(Side2PortList.IndexOf(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort)= -1) then
Side2PortList.Add(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort);
end;
end;
if PortListString2 = '' then
PortListString2 := PortListString2 + ' ' + PortNameList2[k] + GetNumberCount(Side2PortList)
else
PortListString2 := PortListString2 + ',' + ' ' + PortNameList2[k] + GetNumberCount(Side2PortList);
Side2PortList.Clear;
end;
for j := 0 to TempList.Count - 1 do
begin
// порты (сторона 2)
if (TCableWayCompon(TempList[j]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner <> nil) then
Side1PortList.Add(TCableWayCompon(TempList[j]).Side2ConnectedInterface.PortOwner.NppPort);
// пины кабеля
TempPortList.Add(TCableWayCompon(TempList[j]).Npp);
end;
currCableWayCompon := TCableWayCompon(TempList[0]);
// ЗАПИСЬ
// заголовок
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName +
' ' + IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList);
// FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName + GetNumberCount(TempPortList);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
s := '';
FmtCablePaths.FieldByName(fnNameFrom).AsString := cRepMsg270;
if cbCablePathShowEndObjName.Checked then
s := currCableWayCompon.LastCompon.GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false)+ #13#10 // + currCableWayCompon.LastCompon.GetNameForVisible(False)
else
s := currCableWayCompon.LastCompon.GetTopComponent.GetNameForVisible(false) + #13#10;
s := s + PortListString2;
FmtCablePaths.FieldByName(fnNameTo).AsString := s;
FmtCablePaths.Post;
// путь
// компоненты сторон
Side1ComponList.Clear;
Side2ComponList.Clear;
for j := 0 to TempList.Count - 1 do
begin
if Side2ComponList.IndexOf(TCableWayCompon(TempList[j]).LastCompon) = -1 then
Side2ComponList.Add(TCableWayCompon(TempList[j]).LastCompon);
end;
// вкатать путь -- кабель с транзитными компонентами
for k := 0 to currCableWayCompon.WayList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetNameForVisible(False);
if IsCableComponent(TSCSComponent(currCableWayCompon.WayList[k])) then
begin
if cbCablePathShowCableCanals.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent.GetNameForVisible(false) + ' / ' + ComponName;
end;
if cbCablePathShowObjName.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog.GetNameForVisible(False) + ' / ' + ComponName;
end;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList) + ' ' +ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' '; //currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
// вкатать конечные компоненты
for k := 0 to Side2ComponList.Count - 1 do
begin
ComponInterfList.Clear;
ComponInterfCount := 0;
for j := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[j]).LastCompon.ID = TSCSComponent(Side2ComponList[k]).ID then
begin
Inc(ComponInterfCount);
if ComponInterfList.IndexOf(TCableWayCompon(TempList[j]).Npp) = -1 then
ComponInterfList.Add(TCableWayCompon(TempList[j]).Npp);
end;
end;
// определить порты компонента, подключенные к жилам
Side2PortList.Clear;
PortNameList2.Clear;
// наименования портов
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2.IndexOf(s) = -1 then
PortNameList2.Add(s);
end;
end;
end;
end;
// формируем наименование + нумерация
PortListString2 := '';
for m := 0 to PortNameList2.count - 1 do
begin
for j := 0 to ComponInterfList.Count - 1 do
begin
s := '';
for l := 0 to TempList.Count - 1 do
begin
if TCableWayCompon(TempList[l]).Npp = ComponInterfList[j] then
begin
if (TCableWayCompon(TempList[l]).Side2ConnectedInterface <> nil) and
(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner <> nil) then
begin
s := TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.LoadName;
if PortNameList2[m] = s then
if Side2PortList.IndexOf(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.NppPort) = -1 then
Side2PortList.Add(TCableWayCompon(TempList[l]).Side2ConnectedInterface.PortOwner.NppPort);
end;
end;
end;
end;
if PortListString2 = '' then
PortListString2 := PortListString2 + s + GetNumberCount(Side2PortList)
else
PortListString2 := PortListString2+ ', ' + s + GetNumberCount(Side2PortList);
Side2PortList.Clear;
end;
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
// ComponName := TSCSComponent(Side2ComponList[k]).GetNameForVisible(False);
TopCompon2 := TSCSComponent(Side2ComponList[k]);
ComponName := TSCSComponent(Side2ComponList[k]).GetNameForVisible(False);
if TopCompon2 <> nil then
begin
while not TopCompon2.IsTop do
begin
TopCompon2 := TopCompon2.GetParentComponent;
if TopCompon2 <> nil then
begin
if not TopCompon2.IsTop then
ComponName := TopCompon2.GetNameForVisible(false) + '/' + ComponName;
end
else
Break; //// BREAK ////
end;
end;
// FmtCablePathsInfo.FieldByName(fnDescription).AsString := ComponName;
if PortListString2 = '' then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := inttostr(ComponInterfCount) +
' ' + GetNumberCount(ComponInterfList) + ' ' + ComponName + ' ' + PortListString2;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' ';//currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
Inc(MasterId);
end;
end;
end;
end
else
FreeANdNil(List3);
//NilToNil
if List4.Count > 0 then
begin
CanSave := True;
for i := 0 to List4.Count - 1 do
begin
if InterfGuideList.IndexOf(TCableWayCompon(List4[i]).CableInterface.GUIDInterface) = -1 then
InterfGuideList.Add(TCableWayCompon(List4[i]).CableInterface.GUIDInterface);
end;
While CanSave do
begin
CanSave := False;
for i := 0 to InterfGuideList.Count - 1 do
begin
currCableWayCompon := Nil;
for j := 0 to List4.Count - 1 do
begin
if (not TCableWayCompon(List4[j]).Passed) and (TCableWayCompon(List4[j]).CableInterface.GUIDInterface = InterfGuideList[i]) then
begin
currCableWayCompon := TCableWayCompon(List4[j]);
TCableWayCompon(List4[j]).Passed := True;
Break; //// BREAK ////;
end;
end;
if currCableWayCompon <> nil then
begin
CanSave := True;
TempList.Clear;
TempList.Add(currCableWayCompon);
for j := 0 to List4.Count - 1 do
begin
if (not TCableWayCompon(List4[j]).Passed) and IsEqualWay(currCableWayCompon, List4[j]) then
begin
TCableWayCompon(List4[j]).Passed := true;
TempList.Add(TCableWayCompon(List4[j]));
end;
end;
TempPortList.Clear;
PortNameList1.Clear;
PortNameList2.Clear;
PortListString1 := '';
PortListString2 := '';
for j := 0 to TempList.Count - 1 do
begin
// пины кабеля
TempPortList.Add(TCableWayCompon(TempList[j]).Npp);
end;
currCableWayCompon := TCableWayCompon(TempList[0]);
// ЗАПИСЬ
// заголовок
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName +
' ' + IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList);
// FmtCablePaths.FieldByName(fnName).AsString := currCableWayCompon.CableInterfName + GetNumberCount(TempPortList);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
s := '';
FmtCablePaths.FieldByName(fnNameFrom).AsString := cRepMsg270;
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg270;
FmtCablePaths.Post;
// путь
// вкатать путь -- кабель с транзитными компонентами
for k := 0 to currCableWayCompon.WayList.Count - 1 do
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldbyName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := 1;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetNameForVisible(False);
if IsCableComponent(TSCSComponent(currCableWayCompon.WayList[k])) then
begin
if cbCablePathShowCableCanals.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetParentComponent.GetNameForVisible(false) + ' / ' + ComponName;
end;
if cbCablePathShowObjName.Checked then
begin
if TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog <> nil then
ComponName := TSCSComponent(currCableWayCompon.WayList[k]).GetFirstParentCatalog.GetNameForVisible(False) + ' / ' + ComponName;
end;
end;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := IntToStr(TempList.Count) + ' ' + GetNumberCount(TempPortList) + ' ' + ComponName;
FmtCablePathsInfo.FieldByName(fnNameTo).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnNameFrom).AsInteger := 0;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' ';// currCableWayCompon.CableInterfName;
FmtCablePathsInfo.Post;
end;
Inc(MasterId);
end;
end;
end;
end
else
FreeAndNil(List4);
// сбросить путь
for i := (CableWay.Count - 1) downto 0 do
begin
currCableWayCompon := TCableWayCompon(CableWay[i]);
CableWay.Delete(i);
FreeAndNil(currCableWayCompon);
end;
FreeAndNil(CableWay);
end;
// почистить и сбросить списки
if Side1ComponList <> nil then
FreeAndNil(Side1ComponList);
if Side2ComponList <> nil then
FreeAndNil(Side2ComponList);
if Side1InterfList <> nil then
FreeAndNil(Side1InterfList);
if Side2InterfList <> nil then
FreeAndNil(Side2InterfList);
if SaveList <> nil then
FreeAndNil(SaveList);
if List1 <> nil then
FreeAndNil(List1);
if List2 <> nil then
FreeAndNil(List2);
if List3 <> nil then
FreeAndNil(List3);
if List4 <> nil then
FreeAndNil(List4);
if CableInterfList <> nil then
FreeAndNil(CableInterfList);
if Side1PortList <> nil then
FreeAndNil(Side1PortList);
if Side2PortList <> nil then
FreeAndNil(Side2PortList);
if Side1PortNameList <> nil then
FreeAndNil(Side1PortNameList);
if Side2PortNameList <> nil then
FreeAndNil(Side2PortNameList);
if TempPortList <> nil then
FreeAndNil(TempPortList);
if InterfGuideList <> nil then
FreeAndNil(InterfGuideList);
if TempList <> nil then
FreeAndNil(TempList);
if PortNameList1 <> nil then
FreeAndNil(PortNameList1);
if PortNameList2 <> nil then
FreeAndNil(PortNameList2);
if ComponInterfList <> nil then
FreeAndNil(ComponInterfList);
end;
//
// Tolik
// строит список всех точечных компонент, подключенных к кабелю
Function GetConnectedPoints(Component: TSCSComponent; LoadWholeComponent : boolean): TSCSComponents;
Var i, j : integer;
SCSComponent, JoinCompon: TSCSComponent;
Begin
Result := TSCSComponents.Create(false);
// если нужны подключенные точечные ко всему кабелю
if LoadWholeComponent then
begin
Component.LoadWholeComponent(true);
for i := 0 to Component.WholeComponent.Count - 1 do
begin
// кабель берем весь по WHOLE_ID
SCSComponent := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferences(Component.WholeComponent[i]);
if SCSComponent <> nil then
begin
for j := 0 to SCSComponent.JoinedComponents.Count - 1 do
begin
JoinCompon := SCSComponent.JoinedComponents[j];
// подключенный точечный
if JoinCompon.IsLine = biFalse then
begin
if Result.IndexOf(JoinCompon) = -1 then
Result.Add(JoinCompon);
end;
end;
end;
end;
end
else
begin
// подключенные точечные к одному куску кабеля
for j := 0 to Component.JoinedComponents.Count - 1 do
begin
JoinCompon := Component.JoinedComponents[j];
// подключенный точечный
if JoinCompon.IsLine = biFalse then
begin
if Result.IndexOf(JoinCompon) = -1 then
Result.Add(JoinCompon);
end;
end;
end;
End;
// отбирает из всех точечных компонент, подключенных к кабелю,
// подключенные с заданной стороны
Function GetConnectedPointsBySide(Compons : TSCSComponents; Cable: TSCSComponent; Side: Integer): TSCSComponents;
Var i,j: integer;
InterF: TSCSInterFace;
Begin
Result := TSCSComponents.Create(false);
for i := 0 to Cable.Interfaces.Count - 1 do
begin
if Cable.Interfaces[i].TypeI = itFunctional then
begin
if Cable.Interfaces[i].IsBusy or Cable.Interfaces[i].KolvoBusy > 0 then
begin
Interf := Cable.Interfaces[i];
if Interf.Side = Side then
begin
for j := 0 to Compons.Count - 1 do
begin
if Interf.CheckJoinToComponent(Compons[j]) and (Result.IndexOf(Compons[j]) = -1) then
Result.Add(Compons[j]);
end;
end;
end;
end;
end;
End;
Function GetConnectedToCable(Compons: TSCSComponents; Cable: TSCSComponent): TSCSComponents;
Var i : integer;
Begin
Result := TSCSComponents.Create(false);
for i := 0 to Compons.Count - 1 do
begin
if Compons[i].JoinedComponents.IndexOf(Cable) <> -1 then
Result.Add(Compons[i]);
end;
End;
Function GetBusyInterfCountByType(InterfType : string; Cable: TSCSComponent; bySide: boolean; Side : integer): integer;
Var i : integer;
Begin
Result := 0;
if not bySide then
begin
for i := 0 to Cable.Interfaces.Count - 1 do
begin
if (Cable.Interfaces[i].TypeI = itFunctional) and
(Cable.Interfaces[i].GUIDInterface = InterfType) then
if Cable.Interfaces[i].IsBusy or Cable.Interfaces[i].KolvoBusy > 0 then
begin
// showmessage('Npp = ' +inttostr(Cable.Interfaces[i].Npp) + ','+ ' Kolvo = '+inttostr(Cable.Interfaces[i].kolvoBusy)+ ' Side = '+ inttostr(Cable.Interfaces[i].Side));
Result := Result + Cable.Interfaces[i].KolvoBusy;
end;
end;
end
else
begin
for i := 0 to Cable.Interfaces.Count - 1 do
begin
if (Cable.Interfaces[i].TypeI = itFunctional) and
(Cable.Interfaces[i].Side = Side) and
(Cable.Interfaces[i].GUIDInterface = InterfType) then
if Cable.Interfaces[i].IsBusy or Cable.Interfaces[i].KolvoBusy > 0 then
begin
// showmessage('Npp = ' +inttostr(Cable.Interfaces[i].Npp) + ','+ ' Kolvo = '+inttostr(Cable.Interfaces[i].kolvoBusy)+ ' Side = '+ inttostr(Cable.Interfaces[i].Side));
Result := Result + Cable.Interfaces[i].KolvoBusy;
end;
end;
end;
End;
// определяет количество интерфейсов объекта (компонент - топовый)
function GetCountInterfObject(Component: TSCSComponent): integer;
var i, j: integer;
currCompon: TSCSComponent;
begin
//Tolik
Result := 0;
if Component <> nil then
begin
for i := 0 to Component.Interfaces.Count - 1 do
begin
if Component.Interfaces[i].TypeI = itFunctional then
Result := Result + Component.Interfaces[i].Kolvo;
end;
for i := 0 to Component.ChildReferences.Count - 1 do
begin
currCompon := Component.ChildReferences[i];
for j := 0 to currCompon.Interfaces.Count - 1 do
begin
if currCompon.Interfaces[j].TypeI = itFunctional then
Result := Result + currCompon.Interfaces[j].Kolvo;
end;
end;
end;
//
End;
// определяет объект с наибольшим количеством интерфейсов из списка
function GetMaxInterfObject(Components: TSCSComponents; GetTopComponent: boolean): TSCSComponent;
var i, j, k: integer;
currCompon : TSCSComponent;
MaxCounter, CurrCounter: integer;
SCSComponent: TSCSComponent;
begin
if Components.Count > 0 then
begin
MaxCounter := 0;
CurrCounter := 0;
// первый компонент списка
Result := Components[0];
SCSComponent := Components[0];
if Components.Count = 1 then
begin
if GetTopComponent then
begin
while not Result.IsTop do
Result := Result.GetParentComponent;
end;
end
else
begin
//объект должен быть топовым
while not Result.IsTop do
Result := Result.GetParentComponent;
// интерфейсы самого компонента
for i := 0 to Result.Interfaces.Count - 1 do
begin
if Result.Interfaces[i].TypeI = itFunctional then
MaxCounter := MaxCounter + Result.Interfaces[i].Kolvo;
end;
// интерфейсы чилдов первого компонента
for i := 0 to Result.ChildReferences.Count - 1 do
begin
currCompon := Result.ChildReferences[i];
for j := 0 to currCompon.Interfaces.Count -1 do
begin
if currCompon.Interfaces[j].TypeI = itFunctional then
MaxCounter := MaxCounter + currCompon.Interfaces[j].Kolvo;
end;
end;
// ищем в списке
for i := 1 to Components.Count - 1 do
begin
currCompon := Components[i];
SCSComponent := Components[i];
//объект должен быть топовым (верхним)
while not currCompon.IsTop do
currCompon := currCompon.GetParentComponent;
CurrCounter := 0;
// интерфейсы компонента
for j := 0 to currCompon.Interfaces.Count - 1 do
begin
if currCompon.Interfaces[j].TypeI = itFunctional then
begin
if currCompon.Interfaces[j].Kolvo <= 0 then
inc(CurrCounter)
else
CurrCounter := CurrCounter + currCompon.Interfaces[j].Kolvo;
end;
end;
// интерфейсы чилдов
for j := 0 to currCompon.ChildReferences.Count - 1 do
begin
for k := 0 to currCompon.ChildReferences[j].Interfaces.Count - 1 do
begin
if currCompon.ChildReferences[j].Interfaces[k].TypeI = itFunctional then
begin
if currCompon.ChildReferences[j].Interfaces[k].Kolvo <= 0 then
inc(CurrCounter)
else
CurrCounter := CurrCounter + currCompon.ChildReferences[j].Interfaces[k].Kolvo;
end;
end;
end;
if MaxCounter < CurrCounter then
begin
MaxCounter := CurrCounter;
if GetTopComponent then
Result := currCompon
else
Result := SCSComponent;
end;
end;
end;
end;
end;
// удаление компонента из списка
Procedure DelComponFromList(ComponList: TSCSComponents; Component : TSCScomponent);
var i: integer;
begin
if ((ComponList.Count > 0) and (Component <> nil)) then
begin
for i := 0 to ComponList.Count - 1 do
begin
if ComponList[i] = Component then
begin
ComponList.Delete(i);
break;
end;
end;
end;
end;
// процедура сортировки списка
Procedure SortListByPositions(AList : TCabPaths);
Var i,j,k : integer;
s : string;
Passed : boolean;
Ports : TIntList;
Begin
if Length(AList) > 1 then
begin
Ports := TIntList.Create;
Passed := False;
while not Passed do
begin
Passed := true;
for j := 0 to Length(AList) - 2 do
begin
if AList[j].NppFrom > AList[j + 1].NppFrom then
begin
Passed := false;
//ID
k := AList[j].ID;
AList[j].ID := AList[j+1].ID;
AList[j+1].ID := k;
//Name
s := AList[j].Name;
AList[j].Name := AList[j+1].Name;
AList[j+1].Name := s;
//NameFrom
currCompon := AList[j].NameFrom;
AList[j].NameFrom := AList[j + 1].NameFrom;
AList[j + 1].NameFrom := currCompon;
//NAmeTo
currCompon := AList[j].NameTo;
AList[j].NameTo := AList[j + 1].NameTo;
AList[j + 1].NameTo := currCompon;
//NppFrom
k := AList[j].NppFrom;
AList[j].NppFrom := AList[j + 1].NppFrom;
AList[j + 1].NppFrom := k;
//NppTo
k := AList[j].NppTo;
AList[j].NppTo := AList[j + 1].NppTo;
AList[j + 1].NppTo := k;
//kolvo
k := AList[j].Kolvo;
AList[j].Kolvo := AList[j+1].Kolvo;
AList[j+1].Kolvo := k;
Passed := AList[j].Passed;
AList[j].Passed := AList[j+1].Passed;
AList[j+1].Passed := Passed;
//FromTo
s := AList[j].FromTo;
AList[j].FromTo := AList[j+1].FromTo;
AList[j+1].FromTo := s;
//BeginPortName
s := AList[j].BeginPortName;
AList[j].BeginPortName := AList[j+1].BeginPortName;
AList[j+1].BeginPortName := s;
//EndPortName
s := AList[j].EndPortName;
AList[j].EndPortName := AList[j+1].EndPortName;
AList[j+1].EndPortName := s;
if (AList[j].BeginPorts = Nil) then
AList[j].BeginPorts := TIntList.Create;
if (AList[j].EndPorts = Nil) then
AList[j].EndPorts := TIntList.Create;
// BeginPorts
if Ports.Count > 0 then
Ports.Clear;
for i := 0 to AList[j].BeginPorts.Count - 1 do
Ports.Add(AList[j].BeginPorts[i]);
AList[j].BeginPorts.Clear;
for i := 0 to AList[j+1].BeginPorts.Count - 1 do
AList[j].BeginPorts.Add(AList[j+1].BeginPorts[i]);
AList[j+1].BeginPorts.Clear;
for i := 0 to Ports.Count -1 do
AList[j+1].BeginPorts.Add(Ports[i]);
//EndPorts
if Ports.Count > 0 then
Ports.Clear;
for i := 0 to AList[j].EndPorts.Count - 1 do
Ports.Add(AList[j].EndPorts[i]);
AList[j].EndPorts.Clear;
for i := 0 to AList[j+1].EndPorts.Count - 1 do
AList[j].EndPorts.Add(AList[j+1].EndPorts[i]);
AList[j+1].EndPorts.Clear;
for i := 0 to Ports.Count -1 do
AList[j+1].EndPorts.Add(Ports[i]);
//InterFacePositions
if Ports.Count > 0 then
Ports.Clear;
for i := 0 to AList[j].InterFacePositions.Count - 1 do
Ports.Add(AList[j].InterFacePositions[i]);
AList[j].InterFacePositions.Clear;
for i := 0 to AList[j+1].InterFacePositions.Count - 1 do
AList[j].InterFacePositions.Add(AList[j+1].InterFacePositions[i]);
AList[j+1].InterFacePositions.Clear;
for i := 0 to Ports.Count -1 do
AList[j+1].InterFacePositions.Add(Ports[i]);
break;
end;
end;
end;
// Tolik 21/03/2017 --
Ports.free;
//
end;
End;
// запись кабеля в таблицу
Function WriteCableToTbl(CablesPassed: TSCSComponents; InterFacePositions: TIntList; PosNumber, ParentID, InterFacePositionsCount: Integer): integer;
Var
k: Integer;
s: String;
Begin
Result := PosNumber;
// кабель
// если показывать трассы
if cbCablePathShowObjName.Checked then
begin
for k := 0 to CablesPassed.Count - 1 do
begin
s := '';
inc(Result);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := Result;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := ParentID;
s := CablesPassed[k].GetNameForVisible(false);
if HasCableCanals then
begin
if CablesPassed[k].GetParentComponent <> nil then
// каб канал
s := CablesPassed[k].GetParentComponent.GetNameForVisible(false) +'/' + s;
end;
// трасса
s := CablesPassed[k].GetFirstParentCatalog.GetNameForVisible(false) + '/' + s;
s := GetNumberCount(InterFacePositions) + ' '+s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := InterFacePositionsCount;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end
end;
// не показывать трассы
if HasCableCanals and (not cbCablePathShowObjName.Checked) then
begin
for k := 0 to CablesPassed.Count - 1 do
begin
if CablesPassed[k].GetParentComponent <> nil then
begin
s := '';
inc(Result);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := Result;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := ParentID;
// кабель
s := CablesPassed[k].GetNameForVisible(false);
if cbCablePathShowCableCanals.Checked then
// каб канал
s := CablesPassed[k].GetParentComponent.GetNameForVisible(false) +'/' +s;
s := GetNumberCount(InterFacePositions) + ' '+s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s:='';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := InterFacePositionsCount;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
end;
end;
// не показывать ни трассы ни каб каналы
if (not cbCablePathShowObjName.Checked) and (not HasCableCanals) then
begin
s:='';
inc(Result);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := Result;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := ParentID;
// кабель
s := CablesPassed[0].GetNameForVisible(false);
s := GetNumberCount(InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := InterFacePositionsCount;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
End;
// собирает по куску кабеля все соединение в список
// все подряд, пока порядок не важен
Procedure GetAllConnected(FCompon: TSCSComponent; AList: TSCSComponents; FCypher: String; AddComponToList: TSCSComponent);
Var j: integer;
passed: boolean;
currCompon: TSCSComponent;
function checkList: boolean;
var i: Integer;
begin
Result := False;
for i := 0 to aList.Count - 1 do
begin
if aList[i].Id = FCompon.Id then
begin
Result := True;
exit;
end;
end
end;
Begin
if checkList then
exit
else
AList.Add(FCompon);
for j := 0 to FCompon.JoinedComponents.Count - 1 do
begin
currCompon := FCompon.JoinedComponents[j];
if AList.IndexOf(currCompon) = -1 then
begin
if currCompon.IsLine = biFalse then
begin
if aList.IndexOf(currCompon) = -1 then
begin
GetAllConnected(currCompon, AList, FCypher, FCompon);
end;
end
else
begin
if isCableComponent(currCompon) then
if currCompon.Cypher = FComponent.Cypher then
if aList.IndexOf(currCompon) = -1 then
GetAllConnected(currCompon, AList, FCypher, FCompon);
end;
end;
end;
End;
{Procedure GetAllConnected(FCompon: TSCSComponent; AList: TSCSComponents; FCypher: String; AddComponToList: TSCSComponent);
Var j: integer;
passed: boolean;
currCompon: TSCSComponent;
Begin
Passed := false;
While Passed = false do
begin
Passed := true;
for j := 0 to FCompon.JoinedComponents.Count - 1 do
begin
currCompon := FCompon.JoinedComponents[j];
Passed := true;
if AList.IndexOf(currCompon) = -1 then
begin
if (FCompon.IsLine = biFalse) and (FCompon.JoinedComponents.Count > 1) and
(currCompon.IsLine = biTrue) and (currCompon.JoinedComponents.Count <= 2) then
AList.Add(FCompon);
Passed := False;
AList.Add(currCompon);
GetAllConnected(currCompon, AList, FCypher, FCompon);
// break;
end;
end;
end;
End;
}
// возвращает сторону кабеля, подключенную к компоненту
Function GetConnectionSide(Compon, ConnectedCompon: TSCSComponent): Integer;
Var
k, l, m: Integer;
Interf: TSCSInterFace;
InterfPos: TSCSInterfPosition;
Begin
Result := 0;
for k := 0 to Compon.Interfaces.count - 1 do
begin
if ((Compon.Interfaces[k].TypeI = itFunctional) and ((Compon.Interfaces[k].IsBusy = bitrue) or
(Compon.Interfaces[k].KolvoBusy > 0))) then
begin
for l := 0 to Compon.Interfaces[k].BusyPositions.count - 1 do
begin
InterfPos := Compon.Interfaces[k].BusyPositions[l];
InterfPos := InterFPos.GetConnectedPos;
InterF := TSCSInterFace(InterfPos.InterfOwner);
if ConnectedCompon = InterF.ComponentOwner then
begin
Result := Compon.Interfaces[k].Side;
break;
end;
end;
end;
if Result <> 0 then break;
end;
End;
// таблички для электрики
Procedure SaveTable(BeginConnected, EndConnected, StrangeCables: TSCSComponents);
Var
i, j, k, l, m, MasterID, currID, Counter: integer;
currCompon: TSCSComponent;
s, CableName: String;
JointText: TStringList;
InterfNames: TStringList; // список типов занятых интерфейсов в кабеле
InterfName: string; // наименование текущего интерфейса
JointPositions, CablePositions, ComponPositions: TIntList;
InterfCount: Integer;
InterFPos, InterfPos1: TSCSInterfPosition;
ConnectionSide: Integer;
currInterface: TSCSInterface;
BusyCableInterFaces, AllCableInterFaces: TSCSInterFaces;
isInList: Boolean;
AllCableInterfPos, BusyCableInterfPos: TSCSInterfPositions;
PinPosition, PinPositionCount: Integer;
JointList: TStringList; // описание скрутки
currConnectedInterFaces, ConnectedInterFaces: PortInform; // интерфейсы кабеля, подключенные к компоненту
HasCableCanals, isMultiPointObject: Boolean;
ComponPorts, ConnectedPorts: PortInform;
// если попался объект типа "точка" (там может сидеть несколько компонент друг на дружке)
// или один компонент типа модуля
// в таких случаях нужно выводить в отчет имя объекта
Function MultiPointObject(Compon: TSCSComponent): boolean;
Var
i, Counter: integer;
currParentCatalog: TSCSCatalog;
Begin
Result := false;
Counter := 0;
if not Compon.IsTop then
begin
currParentCatalog := Compon.GetFirstParentCatalog;
for i := 0 to currParentCatalog.ComponentReferences.count - 1 do
begin
if currParentCatalog.ComponentReferences[i].IsTop then
inc(Counter);
end;
if Counter > 1 then Result := true;
end
else
// например, модуль брошен на лист и к чему-то подключен
if Compon.isTop then
Result := true;
End;
Procedure AddToCableInterFaces(ComponInterFaces: PortInform; var CableInterFaces: PortInform);
Var
j, k, m, Counter: Integer;
isInList: Boolean;
Begin
for j := 0 to Length(ComponInterFaces) - 1 do
begin
if Length(CableInterFaces) = 0 then
begin
SetLength(CableInterFaces,1);
CableInterFaces[0].Ports := TIntList.Create;
CableInterFaces[0].PortName := ComponInterFaces[j].PortName;
for k := 0 to ComponInterFaces[j].Ports.Count - 1 do
begin
CableInterFaces[0].Ports.add(ComponInterFaces[j].Ports[k]);
end;
end
else
begin
isInList := false;
for k := 0 to Length(CableInterFaces) - 1 do
begin
if CableInterFaces[k].PortName = ComponInterFaces[j].PortName then
begin
isInList := true;
for m := 0 to ComponInterFaces[j].Ports.count - 1 do
begin
if CableInterFaces[k].Ports.IndexOf(ComponInterFaces[j].Ports[m]) = - 1 then
CableInterFaces[k].Ports.Add(ComponInterFaces[j].Ports[m]);
end;
if isInList then break;
end;
end;
if not isInList then
begin
Counter := Length(CableInterFaces);
inc(Counter);
SetLength(CableInterFaces, Counter);
CableInterFaces[Counter-1].PortName := ComponInterFaces[j].PortName;
CableInterFaces[Counter-1].Ports := TIntList.Create;
for k := 0 to ComponInterFaces[j].Ports.Count - 1 do
begin
CableInterFaces[Counter-1].Ports.Add(ComponInterFaces[j].Ports[k]);
end;
end;
end;
end;
End;
Function GetInterfConnected(ConnCompon, CableCompon: TSCSComponent; var ComponPorts: PortInform): PortInform; // ConnInterFaces);
Var j, k, l, m: Integer;
Begin
SetLength(ComponPorts, 0);
SetLength(Result, 0);
for j := 0 to CableCompon.Interfaces.Count - 1 do
begin
if ( (CableCompon.Interfaces[j].TypeI = itFunctional) and
((CableCompon.Interfaces[j].IsBusy = bitrue) or
(CableCompon.Interfaces[j].KolvoBusy > 0)) and
(CableCompon.Interfaces[j].Side = ConnectionSide)
) then
begin
for k := 0 to CableCompon.Interfaces[j].BusyPositions.Count - 1 do
begin
InterfPos := CableCompon.Interfaces[j].BusyPositions[k];
InterfPos1 := InterfPos.GetConnectedPos;
Interf := TSCSInterFace(InterfPos1.InterfOwner);
if Interf.ComponentOwner = ConnCompon then
begin
// порты (только для точечных)
if ConnCompon.IsLine = biFalse then
begin
if Interf.PortOwner <> nil then
if Interf.PortOwner.isPort = biTrue then
begin
if Length(ComponPorts) = 0 then
begin
SetLength(ComponPorts,1);
ComponPorts[0].PortName := Interf.PortOwner.LoadName;
ComponPorts[0].Ports := TIntLIst.Create;
ComponPorts[0].Ports.add(Interf.PortOwner.NppPort);
end
else
begin
isInList := false;
for l := 0 to Length(ComponPorts) - 1 do
begin
if ComponPorts[l].PortName = Interf.PortOwner.LoadName then
begin
isInLIst := true;
if ComponPorts[l].Ports.IndexOf(Interf.PortOwner.NppPort) = -1 then
ComponPorts[l].Ports.Add(Interf.PortOwner.NppPort);
end;
end;
if not isInList then
begin
m := Length(ComponPorts);
SetLength(ComponPorts,m+1);
ComponPorts[m].PortName := Interf.PortOwner.LoadName;
ComponPorts[m].Ports := TIntLIst.Create;
ComponPorts[m].Ports.add(Interf.PortOwner.NppPort);
end;
end;
end;
end;
// интерфейсы
if InterfPos.FromPos <> 0 then
begin
if Length(Result) = 0 then
begin
SetLength(Result, 1);
Result[0].PortName := CableCompon.Interfaces[j].GUIDInterface;
Result[0].Ports := TIntList.Create;
if ((InterfPos.ToPos - InterfPos.FromPos) = 0) then
begin
if Result[0].Ports.indexof(InterfPos.FromPos) = -1 then
Result[0].Ports.Add(InterfPos.FromPos);
end;
if ((InterfPos.ToPos - InterfPos.FromPos) > 0) then
begin
for l := InterfPos.FromPos to InterfPos.ToPos do
begin
if Result[0].Ports.IndexOf(l) = -1 then
Result[0].Ports.Add(l);
end;
end;
end
else
begin
if Length(Result) > 0 then
begin
isInList := False;
for m := 0 to Length(Result) - 1 do
begin
if Result[m].PortName = CableCompon.Interfaces[j].GUIDInterface then
begin
isInList := true;
if ((InterfPos.ToPos - InterfPos.FromPos) = 0) then
begin
if Result[m].Ports.IndexOf(InterfPos.FromPos) = -1 then
Result[m].Ports.Add(InterfPos.FromPos);
end;
if ((InterfPos.ToPos - InterfPos.FromPos) > 0) then
begin
for l := InterfPos.FromPos to InterfPos.ToPos do
begin
if Result[m].Ports.IndexOf(l) = -1 then
Result[m].Ports.Add(l);
end;
end;
end;
end;
if not isInLIst then
begin
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1].PortName := CableCompon.Interfaces[j].GUIDInterface;
Result[Length(Result) - 1].Ports := TIntList.Create;
if ((InterfPos.ToPos - InterfPos.FromPos) = 0) then
begin
if Result[Length(Result) - 1].Ports.indexof(InterfPos.FromPos) = -1 then
Result[Length(Result) - 1].Ports.Add(InterfPos.FromPos);
end;
if ((InterfPos.ToPos - InterfPos.FromPos) > 0) then
begin
for l := InterfPos.FromPos to InterfPos.ToPos do
begin
if Result[Length(Result) - 1].Ports.indexof(L) = -1 then
Result[Length(Result) - 1].Ports.Add(l);
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
End;
// получает список имен занятых интерфейсов из списка линейных компонент
// здесь берем кабель краями, т.к. он, по идее, от точки к точке не должен прерываться
Function GetInterfNames(Compons: TSCSComponents): TStringList;
Var
i: integer;
Begin
Result := TStringList.Create;
if (assigned(Compons) and (Compons.Count > 0)) then
begin
for i := 0 to Compons[0].Interfaces.Count - 1 do
begin
if (Compons[0].Interfaces[i].TypeI = itFunctional) and
((Compons[0].Interfaces[i].IsBusy = biTrue) or (Compons[0].Interfaces[i].KolvoBusy > 0)) then
begin
if Result.IndexOf(Compons[0].Interfaces[i].GUIDInterface) = -1 then
Result.Add(Compons[0].Interfaces[i].GUIDInterface);
end;
end;
if Compons.Count > 1 then
begin
for i := 0 to Compons[Compons.Count - 1].Interfaces.Count - 1 do
begin
if (Compons[Compons.Count - 1].Interfaces[i].TypeI = itFunctional) and
((Compons[Compons.Count - 1].Interfaces[i].IsBusy = biTrue) or (Compons[Compons.Count - 1].Interfaces[i].KolvoBusy > 0)) then
begin
if Result.IndexOf(Compons[Compons.Count - 1].Interfaces[i].GUIDInterface) = -1 then
Result.Add(Compons[Compons.Count - 1].Interfaces[i].GUIDInterface);
end;
end;
end;
end;
End;
// имя интерфейса по Гуиду
Function GetInterfNameFromGuid(Compon: TSCSComponent; InterfGuid: string): string;
Var
i: Integer;
Begin
Result := '';
for i := 0 to Compon.Interfaces.Count - 1 do
begin
if (Compon.Interfaces[i].TypeI = itFunctional) and
((Compon.Interfaces[i].IsBusy = biTrue) or (Compon.Interfaces[i].KolvoBusy > 0)) then
begin
if Compon.Interfaces[i].GUIDInterface = InterfGuid then
begin
Result := Compon.Interfaces[i].LoadName;
break;
end;
end;
if Result <> '' then break;
end;
End;
Procedure GetConnectedPositions(BusyCableInterFaces, AllCableInterFaces: TSCSInterFaces;
ComponPositions, CablePositions: TIntList; BeginCompon: TSCSComponent);
Var
PinPosition, k, l, m: Integer;
Interf: TSCSInterFace;
InterfPos, InterfPos1: TSCSInterfPosition;
Begin
if ComponPositions = nil then
ComponPositions := TintList.Create
else
ComponPositions.Clear;
for k := 0 to BusyCableInterFaces.Count - 1 do
begin
for l := 0 to BusyCableInterFaces[k].BusyPositions.Count - 1 do
begin
// подключение
InterFPos := BusyCableInterFaces[k].BusyPositions[l];
// обратная сторона (на компоненте)
InterFPos1 := InterFPos.GetConnectedPos;
// подключенный интерфейс компонента
Interf := TSCSInterface(InterfPos1.InterfOwner);
// если подключено к данному компоненту, собираем позиции подключения(распиновка)
if Interf.ComponentOwner = BeginCompon then
begin
PinPosition := 0;
// для первого интерфейса можно просто взять занятые позиции
if BusyCableInterFaces[k].Npp < 2 then
begin
if ((InterFPos.ToPos - InterFPos.FromPos) = 0) then
begin
ComponPositions.Add(InterFPos.FromPos);
CablePositions.Add(InterFPos.FromPos);
end;
if ((InterFPos.ToPos - InterFPos.FromPos) > 0) then
begin
for m := InterFPos.FromPos to InterFPos.ToPos do
begin
ComponPositions.Add(m); // позиции кабеля, подключенные к интерфейсу
CablePositions.Add(m); // занятые позиции в кабеле
end;
end;
end
else
// если интерфейс не первый, то занятые позиции нужно высчитать
// от первого интерфейса до текущего
begin
if BusyCableInterFaces[k].Npp >= 2 then
begin
PinPosition := 0;
// вычисляем номер последней позиции перед текущим интерфейсом
for m := 0 to ((InterFPos.ToPos - InterFPos.FromPos) - 2) do
begin
PinPosition := PinPosition + AllCableInterFaces[m].Kolvo;
end;
// если позиция одна
if (InterFPos.ToPos - InterFPos.FromPos = 0) then
begin
ComponPositions.Add(InterFPos.FromPos + PinPosition);
CablePositions.Add(InterFPos.FromPos + PinPosition);
end
else
begin
// если позиция одна, но занимает несколько пинов
if (InterFPos.ToPos - InterFPos.FromPos > 0) then
begin
for m := InterfPos.FromPos to InterfPos.ToPos do
begin
// добавляем позиции интерфейса в список для компонента
ComponPositions.Add(m+PinPosition);
CablePositions.Add(m+PinPosition);
//
end;
end;
end;
end;
end;
end;
end;
end;
End;
Function GetBusyCablePositions(BeginCable, EndCable: TSCSComponent; CableInterFaces: TSCSInterFaces;
InterfGuid: String): TIntList;
Var
i, j, k : Integer;
PosNumber: Integer;
InterfPos: TSCSInterFPosition;
Begin
Result := TIntList.Create;
for i := 0 to BeginCable.Interfaces.count - 1 do
begin
// начало кабеля
if ( (BeginCable.Interfaces[i].TypeI = itFunctional) and (BeginCable.Interfaces[i].GUIDInterface = InterfGuid) and
((BeginCable.Interfaces[i].IsBusy = biTrue) or (BeginCable.Interfaces[i].KolvoBusy > 0)) ) then
begin
PosNumber := 0;
if BeginCable.Interfaces[i].Npp >= 2 then
begin
for j := 0 to BeginCable.Interfaces[i].Npp - 1 do
begin
PosNumber := PosNumber + CableInterFaces[j].Kolvo;
end;
end;
for j := 0 to BeginCable.Interfaces[i].BusyPositions.Count - 1 do
begin
InterfPos := BeginCable.Interfaces[i].BusyPositions[j];
if (InterfPos.ToPos - InterfPos.FromPos) = 0 then
Result.Add(InterfPos.FromPos + PosNumber)
else
begin
for k := InterfPos.FromPos to InterfPos.ToPos do
Result.Add(k + PosNumber)
end;
end;
end;
end;
// конец кабеля
for i := 0 to EndCable.Interfaces.count - 1 do
begin
if ( (EndCable.Interfaces[i].TypeI = itFunctional) and (BeginCable.Interfaces[i].GUIDInterface = InterfGuid) and
((EndCable.Interfaces[i].IsBusy = biTrue) or (EndCable.Interfaces[i].KolvoBusy > 0)) ) then
begin
PosNumber := 0;
if EndCable.Interfaces[i].Npp >= 2 then
begin
for j := 0 to EndCable.Interfaces[i].Npp - 1 do
begin
PosNumber := PosNumber + CableInterFaces[j].Kolvo;
end;
end;
for j := 0 to EndCable.Interfaces[i].BusyPositions.Count - 1 do
begin
InterfPos := EndCable.Interfaces[i].BusyPositions[j];
if (InterfPos.ToPos - InterfPos.FromPos) = 0 then
begin
if Result.IndexOf(InterfPos.FromPos) = -1 then
Result.Add(InterfPos.FromPos + PosNumber);
end
else
begin
for k := InterfPos.FromPos to InterfPos.ToPos do
begin
if Result.IndexOf(k) = -1 then
Result.Add(k + PosNumber);
end;
end;
end;
end;
end;
End;
// созвращает список кабелей другого типа, подключенных к концу кабеля
Function DefineStrangeCables(Compon, PrevCompon: TSCSComponent): TSCSComponents;
Var
i, j: Integer;
Interf: TSCSInterFace;
InterfPos, InterfPos1: TSCSInterfPosition;
Begin
Result := TSCSComponents.Create(false);
// ConnectionSide := GetConnectionSide(Compon, PrevCompon);
//if ConnectionSide <> 0 then
begin
for i := 0 to Compon.Interfaces.Count - 1 do
begin
if ( (Compon.Interfaces[i].TypeI = itFunctional) and
(Compon.Interfaces[i].Side = ConnectionSide) and
((Compon.Interfaces[i].IsBusy = biTrue) or (Compon.Interfaces[i].KolvoBusy > 0))
) then
begin
for j := 0 to Compon.Interfaces[i].BusyPositions.Count - 1 do
begin
InterfPos := TSCSInterfPosition(Compon.Interfaces[i].BusyPositions[j]);
InterfPos1 := InterfPos.GetConnectedPos;
Interf := TSCSInterface(InterfPos1.InterfOwner);
if (Interf.ComponentOwner.IsLine = biTrue) and (Interf.ComponentOwner.Cypher <> Compon.Cypher) then
begin
if Result.IndexOf(Interf.ComponentOwner) = -1 then
Result.Add(Interf.ComponentOwner);
end;
end;
end
end;
end;
End;
Function PortsConnection(ConnPorts: Portinform): string;
Var
i: Integer;
Begin
Result:= '';
if Length(ConnPorts) > 0 then
begin
for i := 0 to Length(ConnPorts) - 1 do
begin
if Result = '' then
Result := Result + ConnPorts[i].PortName + GetNumberCount(ConnPorts[i].Ports)
else
Result := Result + ', ' + ConnPorts[i].PortName + GetNumberCount(ConnPorts[i].Ports);
end;
end;
End;
Begin
JointText := TStringList.Create;
isMultiPointObject := false;
ConnectionSide:= 0;
// порты
SetLength(ComponPorts,0);
SetLength(ConnectedPorts,0);
if BeginConnected[0].IsLine = biFalse then
ConnectionSide := GetConnectionSide(ConnectedCables[0], BeginConnected[0])
else
ConnectionSide := GetConnectionSide(ConnectedCables[0], BeginConnected[1]);
// BeginCompons
// если начальные - точечные
inc(BeginPos);
MasterID := BeginPos;
SetLength(ConnectedInterFaces, 0);
// начальные - точечные
if BeginConnected[0].isLine = biFalse then
begin
isMultiPointObject := MultiPointObject(BeginConnected[0]);
for i := 0 to BeginConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces, 0);
currConnectedInterFaces := GetInterfConnected(BeginConnected[i], ConnectedCables[0], ComponPorts);
if Length(ComponPorts) > 0 then
AddToCableInterFaces(ComponPorts, ConnectedPorts);
// определили интерфейсы подключения (c позициями)
// пишем начальные компоненты в табличку (описание)
s := '';
// Tolik 09/02/2018 -- показать распиновку только для кабеля компьютерной сети
{
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports) + #13#10;
end;
}
if isCompCable then
begin
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports) + #13#10;
end;
end
else
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + #13#10;
end;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
if Length(ComponPorts) = 0 then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := BeginConnected[i].GetNameForVisible(false)
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := BeginConnected[i].GetNameForVisible(false) +
' / ' + cRepMsg245 + PortsConnection(ComponPorts);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
// добавляем интерфейсы подключений в интерфейсы, заюзанные в кабеле
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
// поле Откуда в заголовке
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := ConnectedCables[0].GetNameForVisible(false);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
currCompon := BeginConnected[0];
if isMultiPointObject then
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + cRepMsg245 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetFirstParentCatalog.GetNameForVisible(false);
end
else
begin
if cbCablePathShowEndObjName.Checked then
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + BeginConnected[0].GetTopComponent.GetNameForVisible(false) + #13#10 + cRepMsg245 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + BeginConnected[0].GetTopComponent.GetNameForVisible(false) + #13#10;
end
else
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetTopComponent.GetNameForVisible(false) +
#13#10 + cRepMsg245 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameFrom).AsString := BeginConnected[0].GetTopComponent.GetNameForVisible(false) +
#13#10;
end;
end;
end
// если начальные - линейные (скрутка)
else
begin
if BeginConnected[0].isLine = biTrue then
begin
JointText.Clear;
JointText.Add(' ' + cRepMsg241);
JointText.Add(' ' +BeginConnected[0].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + BeginConnected[0].GetNameForVisible(false));
// сначала считаем занятые интерфейсы (для кабеля)
for i := 0 to BeginConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
if BeginConnected[i] <> ConnectedCables[0] then
currConnectedInterFaces := GetInterfConnected(BeginConnected[i], ConnectedCables[0], ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
StrangeCables := DefineStrangeCables(ConnectedCables[0], BeginConnected[1]);
for i := 0 to StrangeCables.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(StrangeCables[i], ConnectedCables[0], ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
for i := 1 to BeginConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
if BeginConnected[i] <> ConnectedCables[0] then
begin
s:='';
currConnectedInterFaces := GetInterfConnected(BeginConnected[i], ConnectedCables[0], ComponPorts);
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + GetNumberCount(currConnectedInterfaces[j].Ports);
end;
JointText.Add(s + ' ' + BeginConnected[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' +
BeginConnected[i].GetNameForVisible(false));
end;
end;
if StrangeCables.Count > 0 then
begin
JointText.Add(cRepMsg243);
for i := 0 to StrangeCables.count - 1 do
begin
SetLength(currConnectedInterFaces, 0);
s :='';
currConnectedInterFaces := GetInterfConnected(StrangeCables[i], ConnectedCables[0], ComponPorts);
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + GetNumberCount(currConnectedInterfaces[j].Ports) ;
end;
JointText.Add(s + ' ' + StrangeCables[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' +
StrangeCables[i].GetNameForVisible(false));
end;
end;
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := MasterID;
FmtCablePaths.FieldByName(fnName).AsString := ConnectedCables[0].GetNameForVisible(false);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := 0;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := 0;
FmtCablePaths.FieldByName(fnNameFrom).AsString := cRepMsg246;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := JointText.Text; // вся скрутка - в описание
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := '';
FmtCablePathsInfo.Post;
end;
end;
// теперь то же самое в конце
// если есть конечные
if EndConnected.Count > 0 then
begin
if Length(ConnectedPorts) > 0 then
SetLength(ConnectedPorts, 0); // сбрасываем порта от начала (если были)
// если конечные - точечные
if EndConnected[0].isLine = biFalse then
begin
isMultiPointObject := MultiPointObject(EndConnected[0]);
Counter := ConnectedCables.Count - 1; // последний кабель
ConnectionSide := 0;
ConnectionSide := GetConnectionSide(ConnectedCables[Counter],EndConnected[0]);
SetLength(currConnectedInterFaces, 0);
for i := 0 to EndConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces, 0);
currConnectedInterFaces := GetInterfConnected(EndConnected[i], ConnectedCables[ConnectedCables.Count - 1], ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
AddToCableInterFaces(ComponPorts, ConnectedPorts);
end;
s :='';
// Tolik 09/02/2018 -- показать распиновку только для кабеля компьютерной сети
{
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
if s = '' then
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports)
else
s := ',' + s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports);
end;
}
if isCompCable then
begin
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
if s = '' then
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports)
else
s := s + ',' + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports);
end;
end
else
begin
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
if s = '' then
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName)
else
s := s + ',' + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName);
end;
end;
//
// кабель
// показывать детальное расключение
if cbCablePathShowConnInSeparatePaths.Checked then
begin
for i := 0 to ConnectedCables.Count - 1 do
begin
CableName := ConnectedCables[i].GetNameForVisible(false);
if cbCablePathShowCableCanals.Checked then
begin
if ConnectedCables[i].GetParentComponent <> nil then
CableName := ConnectedCables[i].GetParentComponent.GetNameForVisible(false) + ' / ' + CableName;
end;
if cbCablePathShowObjName.Checked then
begin
CableName := ConnectedCables[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + CableName;
end;
CableName := ' ' + CableName;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := CableName;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end
else
// не показывать детальное расключение
begin
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ' ' + ConnectedCables[0].GetNameForVisible(false);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
// заголовок (ТО)
FmtCablePaths.Edit;
if isMultiPointObject then
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + cRepMsg245 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetFirstParentCatalog.GetNameForVisible(false);
end
else
begin
if cbCablePathShowEndObjName.Checked then
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + EndConnected[0].GetTopComponent.GetNameForVisible(false) + #13#10 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetFirstParentCatalog.GetNameForVisible(false) +
#13#10 + EndConnected[0].GetTopComponent.GetNameForVisible(false);
end
else
begin
if Length(ConnectedPorts) > 0 then
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetTopComponent.GetNameForVisible(false) +
#13#10 + PortsConnection(ConnectedPorts)
else
FmtCablePaths.FieldByName(fnNameTo).AsString := EndConnected[0].GetTopComponent.GetNameForVisible(false);
end;
end;
FmtCablePaths.Post;
isMultiPointObject := MultiPointObject(EndConnected[0]);
Counter := ConnectedCables.Count - 1; // последний кабель
ConnectionSide := 0;
ConnectionSide := GetConnectionSide(ConnectedCables[Counter],EndConnected[0]);
SetLength(currConnectedInterFaces, 0);
for i := 0 to EndConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces, 0);
currConnectedInterFaces := GetInterfConnected(EndConnected[i], ConnectedCables[ConnectedCables.Count - 1], ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
s := '';
Counter := Length(currConnectedInterfaces);
// Tolik 09/02/2018 -- показать распиновку только для кабеля компьютерной сети
{
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports) + #13#10;
end;
}
if isCompCable then
begin
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports) + #13#10;
end;
end
else
begin
for j := 0 to Length(currConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],currConnectedInterfaces[j].PortName)+ #13#10;
end;
end;
//
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
if Length(ComponPorts) > 0 then
FmtCablePathsInfo.FieldByName(fnDescription).AsString := EndConnected[i].GetNameForVisible(false) + ' / ' +
cRepMsg245 + PortsConnection(ComponPorts)
else
FmtCablePathsInfo.FieldByName(fnDescription).AsString := EndConnected[i].GetNameForVisible(false);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end
else
begin
// если конечные - линейные (скрутка)
if EndConnected[0].isLine = biTrue then
begin
ConnectionSide := 0;
ConnectionSide := GetConnectionSide(ConnectedCables[ConnectedCables.Count - 1], EndConnected[EndConnected.Count - 1]);
for i := 0 to EndConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
if EndConnected[i] <> ConnectedCables[ConnectedCables.count - 1] then
begin
currConnectedInterFaces := GetInterfConnected(ConnectedCables[ConnectedCables.Count - 1], EndConnected[i], ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
end;
StrangeCables := DefineStrangeCables(ConnectedCables[ConnectedCables.Count - 1], EndConnected[0]);
// если есть подключение к кабелю другого типа
if StrangeCables.Count > 0 then
begin
// добавляем подключенные интерфейсы к занятым интерфейсам кабеля
for i := 0 to StrangeCables.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(StrangeCables[i], currCompon, ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
end;
// заголовок (ТО)
FmtCablePaths.Edit;
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg246;
FmtCablePaths.Post;
s :='';
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports) + #13#10;
end;
// кабели
// показывать детально расключение
if cbCablePathShowConnInSeparatePaths.Checked then
begin
for i := 0 to ConnectedCables.count - 1 do
begin
CableName := ConnectedCables[i].GetNameForVisible(false);
if cbCablePathShowCableCanals.Checked then
begin
if ConnectedCables[i].GetParentComponent <> nil then
CableName := ConnectedCables[i].GetParentComponent.GetNameForVisible(false) + ' / ' + CableName;
end;
if cbCablePathShowObjName.Checked then
begin
CableName := ConnectedCables[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + CableName;
end;
CableName := ' ' + CableName;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := CableName;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end
else
// не показывать детальное расключение
begin
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ' ' + ConnectedCables[0].GetNameForVisible(false);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
if EndConnected.IndexOf(ConnectedCables[ConnectedCables.Count - 1]) = -1 then
EndConnected.Insert(0,ConnectedCables[ConnectedCables.Count - 1]);
s := ' ' + cRepMsg241 + #13#10;
s :=s + ' ' + EndConnected[0].getFirstParentCatalog.GetNameForVisible(false) + ' / ' + EndConnected[0].GetNameForVisible(false) + #13#10;
for i := 1 to EndConnected.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(EndConnected[i], ConnectedCables[ConnectedCables.Count - 1], ComponPorts);
for j := 0 to Length(currConnectedInterFaces) - 1 do
s := s + GetInterfNameFromGuid(ConnectedCables[ConnectedCables.Count -1],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports);
s := s + ' ' + EndConnected[i].getFirstParentCatalog.GetNameForVisible(false) + ' / '+ EndConnected[i].GetNameForVisible(false) + #13#10;
end;
if StrangeCables.Count > 0 then
begin
s := s + cRepMsg243 + #13#10;
for j := 0 to StrangeCables.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(StrangeCables[j], ConnectedCables[ConnectedCables.Count - 1], ComponPorts);
for k := 0 to Length(currConnectedInterFaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[ConnectedCables.Count -1],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[k].Ports);
s := s + ' ' + StrangeCables[j].getFirstParentCatalog.GetNameForVisible(false) + ' / '+ StrangeCables[j].GetNameForVisible(false) + #13#10;
end;
end;
end;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := '';
FmtCablePathsInfo.Post;
end;
end;
end
else
// если нет конечных
begin
currCompon := ConnectedCables[ConnectedCables.Count - 1]; // последний кусок кабеля
// проверяем на подключение к кабелю другого типа
if StrangeCables = nil then
StrangeCables := TSCSComponents.Create(false)
else
StrangeCables.Clear;
ConnectionSide := 0;
// если кусок кабеля на участке один
if ConnectedCables.Count = 1 then
begin
// если начальные точечные
if BeginConnected[0].IsLine = biFalse then
begin
ConnectionSide := GetConnectionSide(ConnectedCables[ConnectedCables.Count - 1], BeginConnected[0]);
// currCompon := BeginConnected[0];
end
else
// если в начале - скрутка
begin
ConnectionSide := GetConnectionSide(ConnectedCables[ConnectedCables.Count - 1], BeginConnected[1]);
// currCompon := BeginConnected[1];
end;
end
else
begin
if ConnectedCables.Count > 1 then
begin
ConnectionSide := GetConnectionSide(currCompon, ConnectedCables[ConnectedCables.Count - 2]);
// currCompon := ConnectedCables[ConnectedCables.Count - 2];
end;
end;
if ConnectionSide = 1 then
ConnectionSide := 2
else
begin
if ConnectionSide = 2 then
ConnectionSide := 1;
end;
StrangeCables := DefineStrangeCables(ConnectedCables[ConnectedCables.Count - 1], currCompon);
// если есть подключение к кабелю другого типа
if StrangeCables.Count > 0 then
begin
// добавляем подключенные интерфейсы к занятым интерфейсам кабеля
for i := 0 to StrangeCables.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(StrangeCables[i], currCompon, ComponPorts);
AddToCableInterFaces(currConnectedInterFaces, ConnectedInterFaces);
end;
// пишем кабель, т.к. все интерфейсы уже определены
s :='';
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports) + #13#10;
end;
// кабели
// показывать детальное расключение
if cbCablePathShowConnInSeparatePaths.Checked then
begin
for i := 0 to ConnectedCables.count - 1 do
begin
CableName := ConnectedCables[i].GetNameForVisible(false);
if cbCablePathShowCableCanals.Checked then
begin
if ConnectedCables[i].GetParentComponent <> nil then
CableName := ConnectedCables[i].GetParentComponent.GetNameForVisible(false) + ' / ' + CableName;
end;
if cbCablePathShowObjName.Checked then
begin
CableName := ConnectedCables[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + CableName;
end;
CableName := ' ' + CableName;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := CableName;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end
else
begin
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ' ' + ConnectedCables[0].GetNameForVisible(false);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
// смотрим: если инородный кабель - один, то это - соединение, больше одного - скрутка
if StrangeCables.Count = 1 then
begin
FmtCablePaths.Edit;
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg242;
FmtCablePaths.Post;
s :='';
s := s + ConnectedCables[ConnectedCables.Count - 1].GetFirstParentCatalog.GetNameforVisible(false) +
' ' + ConnectedCables[ConnectedCables.Count - 1].GetNameforVisible(false)+ #13#10;
s := s + ' '+ cRepMsg244 + #13#10;
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports) + ' ';
end;
s := s + StrangeCables[0].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + StrangeCables[0].GetNameForVisible(false);
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := ' ';
FmtCablePathsInfo.Post;
end
else
// если кабель другого типа не один - это скрутка, так и запишем
begin
// заголовок
FmtCablePaths.Edit;
FmtCablePaths.FieldByName(fnNameTo).AsString := cRepMsg246;
FmtCablePaths.Post;
JointText.Clear;
JointText.Add(' ' + cRepMsg241);
JointText.Add(' ' + ConnectedCables[ConnectedCables.Count - 1].GetFirstParentCatalog.GetNameForVisible(false) +
' / ' + ConnectedCables[ConnectedCables.Count - 1].GetNameForVisible(false));
JointText.Add(cRepMsg243);
for i := 0 to StrangeCables.Count - 1 do
begin
SetLength(currConnectedInterFaces,0);
currConnectedInterFaces := GetInterfConnected(StrangeCables[i], ConnectedCables[ConnectedCables.Count - 1], ComponPorts);
for j := 0 to Length(currConnectedInterFaces) - 1 do
begin
s := '';
s := s + GetInterfNameFromGuid(ConnectedCables[ConnectedCables.Count -1],currConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(currConnectedInterfaces[j].Ports);
end;
s := s + ' ' + StrangeCables[i].getFirstParentCatalog.GetNameForVisible(false) + ' / '+ StrangeCables[i].GetNameForVisible(false);
JointText.Add(s);
end;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := JointText.Text;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := '';
FmtCablePathsInfo.Post;
end;
end
else
// если таки ничего нет, то пишем заголовок(куда = "пусто") и кабель
begin
FmtCablePaths.Edit;
FmtCablePaths.FieldByName(fnNameTo).AsString := ' ';
FmtCablePaths.Post;
s := '';
for j := 0 to Length(ConnectedInterfaces) - 1 do
begin
s := s + GetInterfNameFromGuid(ConnectedCables[0],ConnectedInterfaces[j].PortName) + ' ' + GetNumberCount(ConnectedInterfaces[j].Ports) + ' ';
end;
// кабели
// показывать детальное расключение
if cbCablePathShowConnInSeparatePaths.Checked then
begin
for i := 0 to ConnectedCables.count - 1 do
begin
CableName := ConnectedCables[i].GetNameForVisible(false);
if cbCablePathShowCableCanals.Checked then
begin
if ConnectedCables[i].GetParentComponent <> nil then
CableName := ConnectedCables[i].GetParentComponent.GetNameForVisible(false) + ' / ' + CableName;
end;
if cbCablePathShowObjName.Checked then
begin
CableName := ConnectedCables[i].GetFirstParentCatalog.GetNameForVisible(false) + ' / ' + CableName;
end;
CableName := ' ' + CableName;
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := CableName;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end
else
begin
Inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := MasterID;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := ' ' + ConnectedCables[0].GetNameForVisible(false);
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := -1;
FmtCablePathsInfo.FieldByName(fnName).AsString := s;
FmtCablePathsInfo.Post;
end;
end;
end;
ConnectedCables.Clear;
BeginConnected.Clear;
EndConnected.Clear;
End;
Procedure GetAllConnectedFromBegin(FCompon, PrevCompon: TSCSComponent; BeginConnected: TSCSComponents; FCypher: string; FromBegin: boolean);
Var j, k, l, m: integer;
passed: boolean;
currCompon, ConnectedCompon: TSCSComponent;
IsJoint: Boolean;
InterF: TSCSInterFace;
CurrInterFaces: TSCSInterFaces;
ConnectionSide: Integer;
InterFacePosition: TSCSInterFPosition;
// connectedCables: TSCSComponents;
Counter: integer;
isAnotherCable, FromLine, FromPoint: boolean;
BeginCompons, EndConnected: TSCSComponents;
Begin
if ((FCompon.Cypher = FCypher) and (CablesPassed.IndexOf(FCompon) = -1)) then
begin
CablesPassed.Add(FCompon);
if ConnectedCables.IndexOf(FCompon) = -1 then
ConnectedCables.Add(FCompon);
EndConnected := TSCSComponents.create(false);
if BeginConnected = nil then
BeginConnected := TSCSComponents.Create(false);
// смотрим сторону подключения кабеля к предидущему компоненту
ConnectionSide := 0;
for j := 0 to FCompon.Interfaces.count - 1 do
begin
if ( (FCompon.Interfaces[j].TypeI = itFunctional) and ((FCompon.Interfaces[j].IsBusy = biTrue) or
(FCompon.Interfaces[j].KolvoBusy > 0)) ) then
begin
for k := 0 to FCompon.Interfaces[j].BusyPositions.Count - 1 do
begin
InterfacePosition := FCompon.Interfaces[j].BusyPositions[k];
InterFacePosition := InterfacePosition.GetConnectedPos;
Interf := TSCSInterface(InterfacePosition.InterfOwner);
if Interf.ComponentOwner = PrevCompon then
begin
ConnectionSide := FCompon.Interfaces[j].Side;
break;
end;
end;
end;
if ConnectionSide <> 0 then break;
end;
if FromBegin then
begin
for j := 0 to FCompon.Interfaces.count - 1 do
begin
if ( (FCompon.Interfaces[j].Side = ConnectionSide) and (FCompon.Interfaces[j].TypeI = itFunctional) and
((FCompon.Interfaces[j].IsBusy = biTrue) or (FCompon.Interfaces[j].KolvoBusy > 0)) ) then
begin
for k := 0 to FCompon.Interfaces[j].BusyPositions.Count - 1 do
begin
InterfacePosition := FCompon.Interfaces[j].BusyPositions[k];
InterFacePosition := InterfacePosition.GetConnectedPos;
Interf := TSCSInterface(InterfacePosition.InterfOwner);
// точечные добавляем сразу однозначно
if Interf.ComponentOwner.IsLine = biFalse then
begin
if BeginConnected.IndexOf(Interf.ComponentOwner) = -1 then
BeginConnected.Add(Interf.ComponentOwner);
end;
// линейные проверяем по шифру кабеля
if ((Interf.ComponentOwner.IsLine = biTrue) and (Interf.ComponentOwner.Cypher = FCypher)) then
begin
if BeginConnected.IndexOf(Interf.ComponentOwner) = -1 then
BeginConnected.Add(Interf.ComponentOwner);
end;
end;
end;
end;
//если сзади -скрутка
if BeginConnected[0].IsLine = biTrue then
begin
if BeginConnected.IndexOf(FCompon) = -1 then
BeginConnected.Insert(0, FCompon); // текущий компонент - тоже есть на сткутке
end;
end;
// идем дальше (смотрим на кабель с другой стороны)
for j := 0 to FCompon.Interfaces.count - 1 do
begin
if ( (FCompon.Interfaces[j].Side <> ConnectionSide) and (FCompon.Interfaces[j].TypeI = itFunctional) and
((FCompon.Interfaces[j].IsBusy = biTrue) or (FCompon.Interfaces[j].KolvoBusy > 0)) ) then
begin
for k := 0 to FCompon.Interfaces[j].BusyPositions.Count - 1 do
begin
InterfacePosition := FCompon.Interfaces[j].BusyPositions[k];
InterFacePosition := InterfacePosition.GetConnectedPos;
Interf := TSCSInterface(InterfacePosition.InterfOwner);
// точечные добавляем сразу однозначно
if Interf.ComponentOwner.IsLine = biFalse then
begin
if EndConnected.IndexOf(Interf.ComponentOwner) = -1 then
EndConnected.Add(Interf.ComponentOwner);
end;
// линейные проверяем по шифру кабеля
if ((Interf.ComponentOwner.IsLine = biTrue) and (Interf.ComponentOwner.Cypher = FCypher)) then
begin
if EndConnected.IndexOf(Interf.ComponentOwner) = -1 then
EndConnected.Add(Interf.ComponentOwner);
end;
end;
end;
end;
// смотрим, что получилось в конце куска кабеля
// 1 - "висящий конец" или подключение к кабелю не того типа
if EndConnected.Count = 0 then
begin
StrangeCables.Clear;
// проверяем на подключение к инородному кабелю,
for j := 0 to FCompon.Interfaces.count - 1 do
begin
if ( (FCompon.Interfaces[j].Side <> ConnectionSide) and (FCompon.Interfaces[j].TypeI = itFunctional) and
((FCompon.Interfaces[j].IsBusy = biTrue) or (FCompon.Interfaces[j].KolvoBusy > 0)) ) then
begin
for k := 0 to FCompon.Interfaces[j].BusyPositions.Count - 1 do
begin
InterfacePosition := FCompon.Interfaces[j].BusyPositions[k];
InterFacePosition := InterfacePosition.GetConnectedPos;
Interf := TSCSInterface(InterfacePosition.InterfOwner);
// линейные проверяем по шифру кабеля
if ((Interf.ComponentOwner.IsLine = biTrue) and (Interf.ComponentOwner.Cypher = FCypher)) then
EndConnected.Add(Interf.ComponentOwner);
end;
end;
end;
// пишем табличку ... и не возвращаемся
SaveTable(BeginConnected, EndConnected, StrangeCables);
end
else
// 2 кабель пошел дальше
if EndConnected.Count <> 0 then
begin
if ((EndConnected.Count = 1) and (EndConnected[0].IsLine = bitrue)) then
begin
// проверяем, нет ли подключения кабелей другого типа в этой точке
// если есть - пишем в табличку
isAnotherCable := false;
for j := 0 to EndConnected[0].Interfaces.Count - 1 do
begin
if (EndConnected[0].Interfaces[j].TypeI = itFunctional) and
(EndConnected[0].Interfaces[j].Side = ConnectionSide) and
((EndConnected[0].Interfaces[j].IsBusy = biTrue) or (EndConnected[0].Interfaces[j].KolvoBusy > 0)) then
begin
for k := 0 to EndConnected[0].Interfaces[j].BusyPositions.Count - 1 do
begin
InterFacePosition := EndConnected[0].Interfaces[j].BusyPositions[k];
InterFacePosition := InterFacePosition.GetConnectedPos;
Interf := TSCSInterface(InterFacePosition.InterfOwner);
if (Interf.ComponentOwner.IsLine = biTrue) and (Interf.ComponentOwner.Cypher <> FCypher) then
begin
isAnotherCable := true;
break;
end;
end;
end;
if isAnotherCable then break;
end;
ConnectedCompon := EndConnected[0];
if isAnotherCable then
begin
SaveTable(BeginConnected, EndConnected, StrangeCables);
GetAllConnectedFromBegin(ConnectedCompon, FCompon, BeginConnected, FCypher, True);
end
else
begin
// идем дальше
EndConnected.Clear;
// BeginConnected.add(ConnectedCompon);
GetAllConnectedFromBegin(ConnectedCompon, FCompon, BeginConnected, FCypher, false);
end;
end
else
// 3 скрутка
if ((EndConnected.Count > 1) and (EndConnected[0].IsLine = bitrue)) then
begin
StrangeCables.Clear;
// пишем табличку, разворачиваем скрутку
if EndConnected.IndexOf(FCompon) = -1 then
EndConnected.Insert(0, FCompon); // текущий компонент тоже скручен
BeginCompons := TSCSComponents.Create(false);
for j := 1 to EndConnected.Count - 1 do
begin
if BeginCompons.IndexOf(EndConnected[j]) = -1 then
BeginCompons.Add(EndConnected[j]);
end;
SaveTable(BeginConnected, EndConnected, StrangeCables);
for k := 0 to BeginCompons.Count - 1 do
begin
GetAllConnectedFromBegin(BeginCompons[k], FCompon, nil, FCypher, true);
end;
end
else
// 4 точечные (или один точечный)
if ((EndConnected.Count > 0) and (EndConnected[0].IsLine = biFalse)) then
begin
BeginCompons := TSCSComponents.Create(false);
for j := 0 to EndConnected.Count - 1 do
begin
if BeginCompons.IndexOf(EndConnected[j]) = -1 then
BeginCompons.Add(EndConnected[j]);
end;
SaveTable(BeginConnected, EndConnected, StrangeCables);
for j := 0 to BeginCompons.Count - 1 do
begin
for k := 0 to BeginCompons[j].JoinedComponents.Count - 1 do
begin
currCompon := BeginCompons[j];
currCompon := BeginCompons[j].JoinedComponents[k];
if (BeginCompons[j].JoinedComponents[k].IsLine = biTrue) and
(BeginCompons[j].JoinedComponents[k].Cypher = FCypher) and
(BeginCompons[j].JoinedComponents[k] <> FCompon) and
(CablesPassed.IndexOf(BeginCompons[j].JoinedComponents[k]) = -1) then
begin
GetAllConnectedFromBegin(BeginCompons[j].JoinedComponents[k], BeginCompons[j], nil, FCypher, true);
end;
end;
end;
end;
end;
end; //
// у первого компонента может быть несколько кабелей
if PrevCompon.IsLine = biFalse then
begin
for k := 0 to PrevCompon.JoinedComponents.Count - 1 do
begin
if (PrevCompon.JoinedComponents[k].IsLine = biTrue) and
(PrevCompon.JoinedComponents[k].Cypher = FCypher) and
(PrevCompon.JoinedComponents[k] <> FCompon) and
(CablesPassed.IndexOf(PrevCompon.JoinedComponents[k]) = -1) then
begin
GetAllConnectedFromBegin(PrevCompon.JoinedComponents[k], PrevCompon, nil, FCypher, true);
end;
end;
end;
End;
begin
try
// Tolik 10/02/2018
if not isCableComponent(FComponent) then // на всякий
exit;
//
if FComponent <> nil then
begin
NumPairEqual := True;
if FmtCablePaths = nil then
begin
CreateMTWithDsrc(Self, FmtCablePaths, FdsrcCablePaths, 'FmtCablePaths', 'FdsrcCablePaths');
FmtCablePaths.FieldDefs.Add(fnID, ftAutoInc);
FmtCablePaths.FieldDefs.Add(fnName, ftString, 255);
//FmtCablePaths.FieldDefs.Add(fnNameFrom, ftString, 255);
FmtCablePaths.FieldDefs.Add(fnNameFrom, ftMemo);
FmtCablePaths.FieldDefs.Add(fnNppFrom, ftInteger);
//FmtCablePaths.FieldDefs.Add(fnNameTo, ftString, 255);
FmtCablePaths.FieldDefs.Add(fnNameTo, ftMemo);
FmtCablePaths.FieldDefs.Add(fnNppTo, ftInteger);
//FmtCablePaths.FieldDefs.Add(fnDescription, ftMemo);
CreateMTWithDsrc(Self, FmtCablePathsInfo, FdsrcCablePathsInfo, 'FmtCablePathsInfo', 'FdsrcCablePathsInfo');
FmtCablePathsInfo.FieldDefs.Add(fnID, ftAutoInc);
FmtCablePathsInfo.FieldDefs.Add(fnParentID, ftInteger);
// FmtCablePathsInfo.FieldDefs.Add(fnDescription, ftString, 255);
FmtCablePathsInfo.FieldDefs.Add(fnDescription, ftString, 2000);
//FmtCablePathsInfo.FieldDefs.Add(fnNumPair, ftString, 255);
FmtCablePathsInfo.FieldDefs.Add(fnInterfCount, ftInteger);
FmtCablePathsInfo.FieldDefs.Add(fnNameFrom, ftInteger);
FmtCablePathsInfo.FieldDefs.Add(fnNameTo, ftInteger);
FmtCablePathsInfo.FieldDefs.Add(fnMargin, ftInteger);
// Tolik
FmtCablePathsInfo.FieldDefs.Add(fnName,ftString,255); // интерфейсы кабеля в подключении
ConnectDetailMemTable(FdsrcCablePaths, FmtCablePathsInfo, fnID, fnParentID);
end;
FmtCablePaths.Active := false;
FmtCablePaths.Active := true;
FmtCablePathsInfo.Active := false;
FmtCablePathsInfo.Active := true;
//Tolik
// если кабель компьютерно-телефонно-чего-то там, оставляем как было,
// но немножко переделаем совсем
if ( not (FComponent.IDNetType in [3,{4,}5,7])) then
begin
// Tolik --
if IsCableComponent(FComponent) then
begin
FCableCatalog := FComponent.GetFirstParentCatalog;
if FCableCatalog <> nil then
begin
Side1InterfList := TList.Create;
Side2InterfList := TList.Create;
FCableNpp := 0;
//список прохождения каждого интерфейса (от и до)
//количество жил
for i := 0 to FComponent.Interfaces.Count - 1 do
begin
if ((TSCSInterface(FComponent.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(FComponent.Interfaces[i]).Side = 1)) then
FCableNpp := FCableNpp + TSCSInterface(FComponent.Interfaces[i]).Kolvo;
end;
if FCableNpp > 0 then
begin
// создать пути
CableWay := TList.Create;
for i := 1 to FCableNpp do
begin
CableWayCompon := TCableWayCompon.Create;
CableWayCompon.WayList.Add(FComponent);
CableWayCompon.Npp := i;
CableWay.Add(CableWayCompon);
CableWayCompon.GroupedNpp.Add(i);
end;
// забить наименования интерфейсов в пути прохождения
//CanSeekCable := True;
currNPP := 0;
for i := 0 to FComponent.Interfaces.Count - 1 do
begin
if (TSCSInterface(FComponent.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(FComponent.Interfaces[i]).Side = 1) then
begin
for j := 1 to TSCSInterface(FComponent.Interfaces[i]).Kolvo do
begin
TCableWayCompon(CableWay[currNpp]).CableInterfName := TSCSInterface(FComponent.Interfaces[i]).LoadName;
TCableWayCompon(CableWay[currNpp]).CableInterface := TSCSInterface(FComponent.Interfaces[i]);
Inc(CurrNpp);
end;
end;
end;
{
for j := 0 to FComponent.Interfaces.Count - 1 do
begin
if (TSCSInterface(FComponent.Interfaces[j]).TypeI = itFunctional) and
(TSCSInterface(FComponent.Interfaces[j]).Side = 1) and
((currNPP <= (i+1)) and ((TSCSInterface(FComponent.Interfaces[j]).Kolvo + currNpp) >= (i+1))) then
begin
TCableWayCompon(CableWay[i]).CableInterfName := TSCSInterface(FComponent.Interfaces[j]).LoadName;
TCableWayCompon(CableWay[i]).CableInterface := TSCSInterface(FComponent.Interfaces[j]);
Break; //// BREAK ////;
end
else
currNpp := currNPP + TSCSInterface(FComponent.Interfaces[j]).Kolvo;
end;
}
//FCableFigure := TOrthoLine(GetFigureByID(GCadForm, FCableCatalog.SCSID));
for i := 0 to FComponent.Interfaces.Count - 1 do
begin
// занятые интерфейсы кабеля с одной стороны
if ((TSCSInterface(FComponent.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(FComponent.Interfaces[i]).Side = 1) {and
((TSCSInterface(FComponent.Interfaces[i]).BusyPositions.Count > 0) or
(TSCSInterface(FComponent.Interfaces[i]).IsBusy = biTrue))}) then
Side1InterfList.Add(TSCSInterface(FComponent.Interfaces[i]))
else
// занятые интерфейсы кабеля с другой стороны
if ((TSCSInterface(FComponent.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(FComponent.Interfaces[i]).Side = 2) {and
((TSCSInterface(FComponent.Interfaces[i]).BusyPositions.Count > 0) or
(TSCSInterface(FComponent.Interfaces[i]).IsBusy = biTrue))}) then
Side2InterfList.Add(TSCSInterface(FComponent.Interfaces[i]));
end;
// края кабеля с обеих сторон (если стали где-то на средине)
Side1CableCompon := FComponent;
Side2CableCompon := FComponent;
//первая сторона
CanSeekCable := True;
ConnectInerfSide1 := 1;
while CanSeekCable do
begin
CanSeekCable := False;
for i := 0 to Side1CableCompon.Interfaces.Count - 1 do
begin
if (TSCSInterface(Side1CableCompon.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(Side1CableCompon.Interfaces[i]).Side = ConnectInerfSide1) and
((TSCSInterface(Side1CableCompon.Interfaces[i]).isBusy = biTrue) or
((TSCSInterface(Side1CableCompon.Interfaces[i]).BusyPositions.Count > 0 ))) then
begin
InterfacePosition := TSCSInterfPosition(TSCSInterface(Side1CableCompon.Interfaces[i]).BusyPositions[0]);
InterfacePosition := InterfacePosition.GetConnectedPos;
if InterfacePosition <> nil then
begin
// присоединен кабель
if IsCableComponent(InterfacePosition.InterfOwner.ComponentOwner) then
begin
//сторона для последующего соединения
if InterfacePosition.InterfOwner.Side = 1 then
ConnectInerfSide1 := 2
else
if InterfacePosition.InterfOwner.Side = 2 then
ConnectInerfSide1 := 1;
// переопределяем текущий кабель
Side1CableCompon := TSCSComponent(InterfacePosition.InterfOwner.ComponentOwner);
// вписать путь
for j := 0 to CableWay.Count - 1 do
begin
TCableWayCompon(CableWay[j]).WayList.Insert(0, Side1CableCompon);
end;
CanSeekCable := True;
Break; //// BREAK ////
end;
end;
end;
end;
end;
//вторая сторона
CanSeekCable := True;
ConnectInterfSide2 := 2;
while CanSeekCable do
begin
CanSeekCable := False;
for i := 0 to Side2CableCompon.Interfaces.Count - 1 do
begin
if (TSCSInterface(Side2CableCompon.Interfaces[i]).TypeI = itFunctional) and
(TSCSInterface(Side2CableCompon.Interfaces[i]).Side = ConnectInterfSide2) and
((TSCSInterface(Side2CableCompon.Interfaces[i]).isBusy = biTrue) or
((TSCSInterface(Side2CableCompon.Interfaces[i]).BusyPositions.Count > 0 ))) then
begin
InterfacePosition := TSCSInterfPosition((TSCSInterface(Side2CableCompon.Interfaces[i]).BusyPositions[0]));
InterfacePosition := InterfacePosition.GetConnectedPos;
if InterfacePosition <> nil then
begin
// присоединен кабель
if IsCableComponent(InterfacePosition.InterfOwner.ComponentOwner) then
begin
//сторона для последующего соединения
if InterfacePosition.InterfOwner.Side = 1 then
ConnectInterfSide2 := 2
else
if InterfacePosition.InterfOwner.Side = 2 then
ConnectInterfSide2 := 1;
// переопределяем текущий кабель
Side2CableCompon := TSCSComponent(InterfacePosition.InterfOwner.ComponentOwner);
for j := 0 to CableWay.Count - 1 do
begin
TCableWayCompon(CableWay[j]).WayList.Add(Side2CableCompon);
end;
CanSeekCable := True;
Break; //// BREAK ////
end;
end;
end;
end;
end;
(*
// если есть незанятые позиции кабеля на концах -- сбрасываем их сразу
// сторона 1
for i := 0 to CableWay.Count - 1 do
begin
currNPP := 0;//смещение позиции интерфейса
CanSeekCable := True;
ConnectedPosFound := False;
for j := 0 to Side1CableCompon.Interfaces.Count - 1 do
begin
CurrentInterface := TSCSInterface(Side1CableCompon.Interfaces[j]);
if (CurrentInterface.TypeI = itFunctional) and (CurrentInterface.Side = ConnectInerfSide1) then
begin
if ((CurrentInterface.IsBusy = biTrue) or (CurrentInterface.BusyPositions.Count > 0)) then
begin
for k := 0 to CurrentInterface.BusyPositions.Count - 1 do
begin
InterfacePosition := TSCSInterfPosition(CurrentInterface.BusyPositions[k]);
if (((InterfacePosition.FromPos + currNPP) <= (i+1)) and ((InterfacePosition.ToPos + currNPP) >= (i+1))) then
begin
CanSeekCable := False;
ConnectedPosFound := True;
InterfacePosition := InterfacePosition.GetConnectedPos;
if InterfacePosition <> nil then
begin
if InterfacePosition.InterfOwner.ComponentOwner.isLine = biFalse then
TCableWayCompon(CableWay[i]).FirstCompon := InterfacePosition.InterfOwner.ComponentOwner;
end
else
TCableWayCompon(CableWay[i]).FirstCompon := nil;
break;
end;
end;
if ConnectedPosFound then
Break; //// BREAK ////
end
else
currNPP := currNpp + CurrentInterface.Kolvo;
if (currNPP > (i+1)) then
begin
CanSeekCable := False;
Break; //// BREAK ////;
end;
end;
{if (CanSeekCable) and (CurrentInterface.TypeI = itFunctional) and (CurrentInterface.Side = ConnectInerfSide1) then
currNPP := currNpp + CurrentInterface.Kolvo
else
break;}
end;
if not ConnectedPosFound then
TCableWayCompon(CableWay[i]).CanSeekSide1 := False;
end;
// сторона 2
for i := 0 to CableWay.Count - 1 do
begin
currNPP := 0;//смещение позиции интерфейса
CanSeekCable := True;
ConnectedPosFound := False;
for j := 0 to Side2CableCompon.Interfaces.Count - 1 do
begin
CurrentInterface := TSCSInterface(Side2CableCompon.Interfaces[j]);
if (CurrentInterface.TypeI = itFunctional) and (CurrentInterface.Side = ConnectInterfSide2) then
begin
if ((CurrentInterface.IsBusy = biTrue) or (CurrentInterface.BusyPositions.Count > 0)) then
begin
for k := 0 to CurrentInterface.BusyPositions.Count - 1 do
begin
InterfacePosition := TSCSInterfPosition(CurrentInterface.BusyPositions[k]);
if (((InterfacePosition.FromPos + currNPP) <= (i+1)) and ((InterfacePosition.ToPos + currNPP) >= (i+1))) then
begin
CanSeekCable := False;
ConnectedPosFound := True;
InterfacePosition := InterfacePosition.GetConnectedPos;
if InterfacePosition <> nil then
begin
if InterfacePosition.InterfOwner.ComponentOwner.isLine = biFalse then
TCableWayCompon(CableWay[i]).LastCompon := InterfacePosition.InterfOwner.ComponentOwner;
end
else
TCableWayCompon(CableWay[i]).LastCompon := nil;
break;
end;
end;
if ConnectedPosFound then
Break; //// BREAK ////
end
else
currNPP := currNpp + CurrentInterface.Kolvo;
if (currNPP > (i+1)) then
begin
CanSeekCable := False;
Break; //// BREAK ////;
end;
end;
{if (CanSeekCable) and (CurrentInterface.TypeI = itFunctional) and (CurrentInterface.Side = ConnectInterfSide2) then
currNPP := currNpp + CurrentInterface.Kolvo
else
break;}
end;
if not ConnectedPosFound then
TCableWayCompon(CableWay[i]).CanSeekSide2 := False;
end;
*)
// топаем в обе стороны по каждой жиле
for i := 0 to CableWay.Count - 1 do
begin
if TCableWayCompon(CableWay[i]).CanSeekSide1 then
GetCableWayBySide(ConnectInerfSide1, i+1, i+1, Side1CableCompon, 1);
if TCableWayCompon(CableWay[i]).CanSeekSide2 then
GetCableWayBySide(ConnectInterfSide2, i+1, i+1, Side2CableCompon, 2);
end;
//сортануть список путей
// SortWayList;
// ЕСЛИ НЕ ПОКАЗЫВАТЬ ДЕТАЛЬНОЕ РАСКЛЮЧЕНИЕ КАБЕЛЯ -- сложить одинаковые пути
{if not cbCablePathShowConnInSeparatePaths.Checked then
PackWayList;
}
SaveWayListToTables;
end;
end;
end;
//
// определяем подключенные точечные
ConnectedCompons := GetConnectedPoints(FComponent,true);
// если есть подключенные точечные - строим
(* if ConnectedCompons.Count > 0 then
begin
BeginCable := nil;
EndCable := nil;
BeginCompons := nil;
EndCompons := nil;
// определяем начало и конец кабеля
// если кабель всего один - он и будет начало/конец
// а компоненты будут "сидеть" на нем с разных сторон
if FComponent.WholeComponent.Count = 1 then
begin
BeginCable := FComponent;
EndCable := FComponent;
// строим списки компонент в начале и конце
BeginCableSide := 1;
EndCableSide := 2;
BeginCompons := GetConnectedPointsBySide(ConnectedCompons, BeginCable, BeginCableSide);
EndCompons := GetConnectedPointsBySide(ConnectedCompons, EndCable, EndCableSide);
// если кабель расключен в конце меньше, то меняем начало и конец местами
if BeginCompons.Count < EndCompons.Count then
begin
BeginCableSide := 2;
EndCableSide := 1;
BeginCompons := GetConnectedPointsBySide(ConnectedCompons, BeginCable, BeginCableSide);
EndCompons := GetConnectedPointsBySide(ConnectedCompons, EndCable, EndCableSide);
end;
if CablesPassed = nil then
CablesPassed := TSCSComponents.Create(false); // отобраннe отрезки кабеля
CablesPassed.Add(BeginCable);
end
// если кусков кабеля несколько
else
begin
// берем начало с одной стороны (определяем край)
BeginCable := nil;
while BeginCable = nil do
begin
for i := 0 to FComponent.WholeComponent.Count - 1 do
begin
k := 0;
currCompon := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferences(FComponent.WholeComponent[i]);
for j := 0 to currCompon.JoinedComponents.Count - 1 do
begin
if (currCompon.JoinedComponents[j].IsLine = biTrue) and
(currCompon.JoinedComponents[j].Whole_ID = FComponent.Whole_ID) then
inc(k);
end;
// к концу кабеля подключен только один кусок кабеля - значит, это край
if k = 1 then
begin
BeginCable := currCompon;
break;
end;
end;
end;
// конец кабеля
if CablesPassed = nil then
CablesPassed := TSCSComponents.Create(false); // отобраннe отрезки кабеля
CablesPassed.Add(BeginCable);
EndCable := BeginCable;
// чапаем от начала к концу кабеля
// (так заодно и путь построим)
while CablesPassed.Count <> FComponent.WholeComponent.Count do
begin
for i := 0 to FComponent.WholeComponent.Count - 1 do
begin
currCompon := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferences(FComponent.WholeComponent[i]);
for j := 0 to EndCable.JoinedComponents.Count - 1 do
begin
if EndCable.JoinedComponents[j] = currCompon then
begin
if CablesPassed.IndexOf(currCompon) = -1 then
begin
EndCable := currCompon;
CablesPassed.Add(currCompon);
break;
end;
end;
end;
end;
end;
// определяем начальные и конечные компоненты
BeginCompons := GetConnectedPoints(BeginCable, false);
EndCompons := GetConnectedPoints(EndCable, false);
// если в начале кабель больше расключен
if BeginCompons.Count > EndCompons.Count then
begin
// переопределяем начало/конец кабеля
BeginCable := EndCable;
CablesPassed.Clear;
CablesPassed.Add(BeginCable);
// строим путь заново (и конец заново определяем с другой стороны)
while CablesPassed.Count <> FComponent.WholeComponent.Count do
begin
for i := 0 to FComponent.WholeComponent.Count - 1 do
begin
currCompon := F_ProjMan.GSCSBase.CurrProject.GetComponentFromReferences(FComponent.WholeComponent[i]);
for j := 0 to EndCable.JoinedComponents.Count - 1 do
begin
if EndCable.JoinedComponents[j] = currCompon then
begin
if CablesPassed.IndexOf(currCompon) = -1 then
begin
EndCable := currCompon;
CablesPassed.Add(currCompon);
break;
end;
end;
end;
end;
end;
// переопределяем начальные и конечные компоненты
BeginCompons := GetConnectedPoints(BeginCable, false);
EndCompons := GetConnectedPoints(EndCable, false);
end;
end;
// определяем стороны подключения интерфейсов к точечным компонентам на концах кабеля
// (для определения соответствия занятых)
BeginCableSide := 0;
EndCableSide := 0;
if BeginCompons.Count > 0 then
begin
for i := 0 to BeginCable.Interfaces.Count - 1 do
begin
if (BeginCable.Interfaces[i].TypeI = itFunctional) then
begin
for j := 0 to BeginCompons.Count - 1 do
begin
if BeginCable.Interfaces[i].CheckJoinToComponent(BeginCompons[j]) then
begin
BeginCableSide := BeginCable.Interfaces[i].Side;
break;
end;
end;
end;
if BeginCableSide <> 0 then break;
end;
end;
if EndCompons.Count > 0 then
begin
for i := 0 to EndCable.Interfaces.Count - 1 do
begin
if (EndCable.Interfaces[i].TypeI = itFunctional) then
begin
for j := 0 to EndCompons.Count - 1 do
begin
if EndCable.Interfaces[i].CheckJoinToComponent(EndCompons[j]) then
begin
EndCableSide := EndCable.Interfaces[i].Side;
break;
end;
end;
end;
if EndCableSide <> 0 then break;
end;
end;
// определяем количество типов занятых интерфейсов в кабеле (которые надо расписать)
// будем смотреть по гуиду
InterfNames := TStringList.Create;
// смотрим в начале кабеля
for i := 0 to BeginCable.Interfaces.Count - 1 do
begin
if BeginCable.Interfaces[i].TypeI = itFunctional then
begin
if BeginCable.Interfaces[i].IsBusy or BeginCable.Interfaces[i].KolvoBusy > 0 then
begin
if InterfNames.IndexOf(BeginCable.Interfaces[i].GUIDInterface) = -1 then
InterfNames.Add(BeginCable.Interfaces[i].GUIDInterface);
end;
end;
end;
// теперь в конце
for i := 0 to EndCable.Interfaces.Count - 1 do
begin
if EndCable.Interfaces[i].TypeI = itFunctional then
begin
if EndCable.Interfaces[i].IsBusy or EndCable.Interfaces[i].KolvoBusy > 0 then
begin
if InterfNames.IndexOf(EndCable.Interfaces[i].GUIDInterface) = -1 then
InterfNames.Add(EndCable.Interfaces[i].GUIDInterface);
end;
end;
end;
// сбрасываем данные в таблицах (на всякий)
{FmtCablePaths.Close;
FmtCablePaths.Open;
FmtCablePathsInfo.Close;
FmtCablePathsInfo.Open;}
// по типам интерфейсов (мало ли чего в кабеле попадется)
for i := 0 to InterfNames.Count - 1 do
begin
// считаем количество занятых интерфейсов в кабеле по типам
// имеем ввиду, что с разных сторон кабеля интерфейсов может быть
// подключено разное количество, потому берем максимальное
// если кабель подключен с обеих сторон
if EndCompons.Count > 0 then
begin
if FComponent.WholeComponent.Count > 1 then // если частей кабеля несколько
CableBusyInterFaces := Max(GetBusyInterfCountByType(InterfNames[i], BeginCable, true ,BeginCableSide),GetBusyInterfCountByType(InterfNames[i], EndCable, true, EndCableSide))
else // если кусок кабеля один
CableBusyInterFaces := Max(GetBusyInterfCountByType(InterfNames[i], BeginCable, true, BeginCableSide),GetBusyInterfCountByType(InterfNames[i], BeginCable, true, EndCableSide));
end
else
// если кабель подключен с одной стороны, то и в конец придет столько
// же занятых, сколько будет в начале
begin
if FComponent.WholeComponent.Count > 1 then
CableBusyInterFaces := GetBusyInterfCountByType(InterfNames[i], BeginCable, true , BeginCableSide);
end;
// строим заголовки и описание к ним
if (InterFaces <> nil) and (InterFaces.Count > 1) then
begin
if InterFaces = nil then
InterFaces := TSCSInterFaces.Create(false);
if InterFaces.Count > 0 then
InterFaces.Clear;
end;
// смотрим расключение в начале кабеля по интерфейсам
// и определяем занятые позиции
// все функциональные интерфейсы кабеля
if AllCableInterFaces = nil then
AllCableInterFaces := TSCSInterFaces.Create(false);
// в начале кабеля
for j := 0 to BeginCable.Interfaces.Count - 1 do
begin
if (BeginCable.Interfaces[j].TypeI = itFunctional) and (BeginCable.Interfaces[j].Side = BeginCableSide) and
(BeginCable.Interfaces[j].GUIDInterface = InterfNames[i]) then
begin
if AllCableInterFaces.IndexOf(BeginCable.Interfaces[j]) = -1 then
AllCableInterFaces.Add(BeginCable.Interfaces[j]);
end;
end;
// в конце кабеля
// добавляем проверку на соответствие нумерации пар вначале и в конце,
// потому что нумерация интерфейсов может не совпадать
// (в проектах, сформированных в старых версиях программы)
// если такое случилось, отчет не формируем, а выдадим сообщение,
// дабы избежать ....
NumPairEqual := true;
for j := 0 to EndCable.Interfaces.Count - 1 do
begin
if (EndCable.Interfaces[j].TypeI = itFunctional) and (EndCable.Interfaces[j].Side = EndCableSide) and
(EndCable.Interfaces[j].GUIDInterface = InterfNames[i]) then
begin
NumPairEqual := false;
for k := 0 to AllCableInterFaces.Count - 1 do
begin
if AllCableInterFaces[k].Npp = EndCable.Interfaces[j].Npp then
begin
NumPairEqual := true;
break;
end;
end;
if NumPairEqual = false then break; // найдено несоответствие
end;
end;
//если номерация интерфейсов на концах кабеля сходится, строим отчет, если нет - не строим и выдаем сообщение
if NumPairEqual then
begin
// сортируем список интерфейсов по возрастанию порядкового номера
// (если их больше одного)
if AllCableInterFaces.Count > 1 then
begin
WasChangedInterFaces := true;
while WasChangedInterFaces do
begin
WasChangedInterFaces := false;
for j := 0 to AllCableInterFaces.Count - 2 do
begin
if AllCableInterFaces[j].Npp > AllCableInterFaces[j+1].Npp then
begin
WasChangedInterFaces := true;
Interf := AllCableInterFaces[j];
AllCableInterFaces[j] := AllCableInterFaces[j+1];
AllCableInterFaces[j+1] := Interf;
end;
end;
end;
end;
// подключение начала кабеля
for j := 0 to BeginCable.Interfaces.Count - 1 do
begin
if (BeginCable.Interfaces[j].TypeI = itFunctional) and
(BeginCable.Interfaces[j].GUIDInterface = InterfNames[i]) and
(BeginCable.Interfaces[j].Side = BeginCableSide) then
begin
//если есть занятые позиции интерфейса, добавляем в список
if (BeginCable.Interfaces[j].IsBusy = biTrue) or (BeginCable.Interfaces[j].KolvoBusy > 0) then
begin
PosNumber := 0; // текущая позиция для интерфейса
if BeginCable.Interfaces[j].Npp > 1 then
begin
for l := 0 to BeginCable.Interfaces[j].Npp - 2 do
begin
PosNumber := PosNumber + AllCableInterFaces[l].Kolvo;
end;
end;
for k := 0 to BeginCable.Interfaces[j].BusyPositions.Count - 1 do
begin
InterFacePosition := TSCSInterfPosition(BeginCable.Interfaces[j].BusyPositions[k]);
// если занятая позиция интерфейса занимает одну позицию
if (InterFacePosition.ToPos - InterFacePosition.FromPos = 0) then
begin
SetLength(PathList, Length(PathList)+1);
PathListLength := Length(PathList);
PathList[PathListLength-1].ID := PathListLength - 1;
currID := PathList[PathListLength-1].ID;
PathList[PathListLength-1].Name := '';
PathList[PathListLength-1].NameFrom := InterfacePosition.GetConnectedPos.InterfOwner.ComponentOwner;
PathList[PathListLength-1].NameTo := nil;
PathList[PathListLength-1].NppFrom := InterfacePosition.FromPos+PosNumber;
PathList[PathListLength-1].NppTo := InterfacePosition.ToPos+PosNumber;
PathList[PathListLength-1].Kolvo := 1;
PathList[PathListLength-1].Passed := false;
PathList[PathListLength-1].BeginPorts := TIntList.Create;
PathList[PathListLength-1].EndPorts := TIntList.Create;
PathList[PathListLength-1].BeginPortName := '';
PathList[PathListLength-1].EndPortName := '';
PathList[PathListLength-1].InterFacePositions := TIntList.Create;
PathList[PathListLength-1].InterFacePositions.Add(InterfacePosition.FromPos+PosNumber);
// смотрим, подключен ли порт и если да, то добавляем его
if InterfacePosition.GetConnectedPos.InterfOwner.PortOwner <> nil then
begin
InterFacePosition1 := InterFacePosition.GetConnectedPos;
if GetPortPosRangeByInterfRange(TSCSInterface(InterfacePosition1.InterfOwner),
TSCSInterfPosition(InterfacePosition1).FromPos, TSCSInterfPosition(InterfacePosition1).ToPos,
BeginPos, EndPos) then
// если есть порты - добавляем в список
begin
if PathList[PathListLength-1].BeginPorts.Indexof(BeginPos) = -1 then
PathList[PathListLength-1].BeginPorts.Add(BeginPos);
PathList[PathListLength-1].BeginPortName := InterfacePosition1.InterfOwner.PortOwner.LoadName;
end;
end;
end
// если занятая позиция интерфейса занимает несколько позиций, то нужно ее расписать
else
begin
for l := 0 to (InterFacePosition.ToPos - InterfacePosition.FromPos) do
begin
SetLength(PathList, Length(PathList)+1);
PathListLength := Length(PathList);
PathList[PathListLength-1].ID := PathListLength - 1;
currID := PathList[PathListLength-1].ID;
PathList[PathListLength-1].Name := '';
PathList[PathListLength-1].NameFrom := InterfacePosition.GetConnectedPos.InterfOwner.ComponentOwner;
PathList[PathListLength-1].NameTo := nil;
PathList[PathListLength-1].NppFrom := InterfacePosition.FromPos+PosNumber;
PathList[PathListLength-1].NppTo := InterfacePosition.FromPos+PosNumber;
PathList[PathListLength-1].Kolvo := 1;
PathList[PathListLength-1].Passed := false;
PathList[PathListLength-1].BeginPorts := TIntList.Create;
PathList[PathListLength-1].EndPorts := TIntList.Create;
PathList[PathListLength-1].BeginPortName := '';
PathList[PathListLength-1].EndPortName := '';
PathList[PathListLength-1].InterFacePositions := TIntList.Create;
PathList[PathListLength-1].InterFacePositions.Add(InterfacePosition.FromPos+PosNumber);
// смотрим, подключен ли порт и если да, то добавляем его
if InterfacePosition.GetConnectedPos.InterfOwner.PortOwner <> nil then
begin
InterFacePosition1 := InterFacePosition.GetConnectedPos;
if GetPortPosRangeByInterfRange(TSCSInterface(InterfacePosition1.InterfOwner),
TSCSInterfPosition(InterfacePosition1).FromPos, TSCSInterfPosition(InterfacePosition1).ToPos,
BeginPos, EndPos) then
// если есть порты - добавляем в список
begin
// showmessage(GetPortCaption(InterfacePosition.GetConnectedPos.InterfOwner.PortOwner, BeginPos));
if PathList[PathListLength-1].BeginPorts.Indexof(BeginPos) = -1 then
PathList[PathListLength-1].BeginPorts.Add(BeginPos);
PathList[PathListLength-1].BeginPortName := InterfacePosition1.InterfOwner.PortOwner.LoadName;
end;
end;
inc(PosNumber);
end;
end;
end;
end;
end;
end;
// подключение кончала кабеля (если есть конечные компоненты)
if EndCompons.Count > 0 then
begin
for j := 0 to EndCable.Interfaces.Count - 1 do
begin
if (EndCable.Interfaces[j].TypeI = itFunctional) and
(EndCable.Interfaces[j].GUIDInterface = InterfNames[i]) and
(EndCable.Interfaces[j].Side = EndCableSide) then
begin
//если есть занятые позиции интерфейса, добавляем в список
if (EndCable.Interfaces[j].IsBusy = biTrue) or (EndCable.Interfaces[j].KolvoBusy > 0) then
begin
PosNumber := 0; // текущая позиция для интерфейса
if EndCable.Interfaces[j].Npp > 1 then
begin
for l := 0 to EndCable.Interfaces[j].Npp - 2 do
begin
PosNumber := PosNumber + AllCableInterFaces[l].Kolvo;
end;
end;
for k := 0 to EndCable.Interfaces[j].BusyPositions.Count - 1 do
begin
InterFacePosition := TSCSInterfPosition(EndCable.Interfaces[j].BusyPositions[k]);
// если занятая позиция интерфейса занимает одну позицию
if (InterFacePosition.ToPos - InterFacePosition.FromPos = 0) then
begin
SetLength(EndPathList, Length(EndPathList)+1);
PathListLength := Length(EndPathList);
EndPathList[PathListLength-1].ID := PathListLength - 1;
currID := EndPathList[PathListLength-1].ID;
EndPathList[PathListLength-1].Name := '';
EndPathList[PathListLength-1].NameFrom := nil;
EndPathList[PathListLength-1].NameTo := InterfacePosition.GetConnectedPos.InterfOwner.ComponentOwner;
EndPathList[PathListLength-1].NppFrom := 0;
EndPathList[PathListLength-1].NppTo := InterfacePosition.FromPos+PosNumber;
EndPathList[PathListLength-1].Kolvo := 1;
EndPathList[PathListLength-1].Passed := false;
EndPathList[PathListLength-1].BeginPorts := TIntList.Create;
EndPathList[PathListLength-1].EndPorts := TIntList.Create;
EndPathList[PathListLength-1].BeginPortName := '';
EndPathList[PathListLength-1].EndPortName := '';
EndPathList[PathListLength-1].InterFacePositions := TIntList.Create;
EndPathList[PathListLength-1].InterFacePositions.Add(InterfacePosition.FromPos+PosNumber);
// смотрим, подключен ли порт и если да, то добавляем его
if InterfacePosition.GetConnectedPos.InterfOwner.PortOwner <> nil then
begin
InterFacePosition1 := InterFacePosition.GetConnectedPos;
if GetPortPosRangeByInterfRange(TSCSInterface(InterfacePosition1.InterfOwner),
TSCSInterfPosition(InterfacePosition1).FromPos, TSCSInterfPosition(InterfacePosition1).ToPos,
BeginPos, EndPos) then
// если есть порты - добавляем в список
begin
// if EndPathList[PathListLength-1].EndPorts.Indexof(BeginPos) = -1 then
EndPathList[PathListLength-1].EndPorts.Add(BeginPos);
EndPathList[PathListLength-1].EndPortName := InterfacePosition1.InterfOwner.PortOwner.LoadName;
end;
end;
end
// если занятая позиция интерфейса занимает несколько позиций, то нужно ее расписать
else
begin
for l := 0 to (InterFacePosition.ToPos - InterfacePosition.FromPos) do
begin
SetLength(EndPathList, Length(EndPathList)+1);
PathListLength := Length(EndPathList);
EndPathList[PathListLength-1].ID := PathListLength - 1;
currID := EndPathList[PathListLength-1].ID;
EndPathList[PathListLength-1].Name := '';
EndPathList[PathListLength-1].NameFrom := nil;
EndPathList[PathListLength-1].NameTo := InterfacePosition.GetConnectedPos.InterfOwner.ComponentOwner;
EndPathList[PathListLength-1].NppFrom := 0;
EndPathList[PathListLength-1].NppTo := InterfacePosition.FromPos+PosNumber;
EndPathList[PathListLength-1].Kolvo := 1;
EndPathList[PathListLength-1].Passed := false;
EndPathList[PathListLength-1].BeginPorts := TIntList.Create;
EndPathList[PathListLength-1].EndPorts := TIntList.Create;
EndPathList[PathListLength-1].BeginPortName := '';
EndPathList[PathListLength-1].EndPortName := '';
EndPathList[PathListLength-1].InterFacePositions := TIntList.Create;
EndPathList[PathListLength-1].InterFacePositions.Add(InterfacePosition.FromPos+PosNumber);
// смотрим, подключен ли порт и если да, то добавляем его
if InterfacePosition.GetConnectedPos.InterfOwner.PortOwner <> nil then
begin
InterFacePosition1 := InterFacePosition.GetConnectedPos;
if GetPortPosRangeByInterfRange(TSCSInterface(InterfacePosition1.InterfOwner),
TSCSInterfPosition(InterfacePosition1).FromPos, TSCSInterfPosition(InterfacePosition1).ToPos,
BeginPos, EndPos) then
// если есть порты - добавляем в список
begin
EndPathList[PathListLength-1].EndPorts.Add(BeginPos);
EndPathList[PathListLength-1].EndPortName := InterfacePosition1.InterfOwner.PortOwner.LoadName;
end;
end;
inc(PosNumber);
end;
end;
end;
end;
end;
end;
// сортируем списки
SortListByPositions(PathList);
SortListByPositions(EndPathList);
// складываем по типу интерфейса те записи, где одинаковые начальный и конечный компонент подключения
// (или нет в конце, или нет в начале)
if Length(EndPathList) > 0 then
begin
l := Length(PathList) - 1;
// ищем и прописываем двосторонние подключения
for j := 0 to l do
begin
for k := 0 to Length(EndPathList) - 1 do
begin
if PathList[j].NppFrom = EndPathList[k].NppTo then
begin
PathList[j].EndPortName := EndPathList[k].EndPortName;
PathList[j].NameTo := EndPathList[k].NameTo;
if EndPathList[k].EndPorts.Count > 0 then
begin
for l := 0 to EndPathList[k].EndPorts.Count - 1 do
PathList[j].EndPorts.Add(EndPathList[k].EndPorts[l]);
end;
PathList[j].NppTo := EndPathList[k].NppTo;
PathList[j].NameTo := EndPathList[k].NameTo;
end;
end;
end;
end;
// смотрим не расключенные с конца
for j := 0 to Length(EndPathList) - 1 do
begin
passed := true;
for k := 0 to Length(PathList) - 1 do
begin
if EndPathList[j].NppTo = PathList[k].NppFrom then
begin
passed := false;
break;
end;
end;
// нашли подключение в никуда с конца - добавляем в список
if passed <> false then
begin
SetLength(PathList,Length(PathList)+1);
PathListLength := Length(PathList);
PathList[PathListLength-1].ID := PathListLength - 1;
PathList[PathListLength-1].Name := '';
PathList[PathListLength-1].NameFrom := nil;
PathList[PathListLength-1].NameTo := EndPathList[j].NameTo;
PathList[PathListLength-1].NppFrom := EndPathList[j].NppTo;
PathList[PathListLength-1].NppTo := EndPathList[j].NppTo;
PathList[PathListLength-1].Kolvo := 1;
PathList[PathListLength-1].Passed := false;
PathList[PathListLength-1].BeginPorts := TIntList.Create;
PathList[PathListLength-1].EndPorts := TIntList.Create;
PathList[PathListLength-1].BeginPortName := '';
PathList[PathListLength-1].EndPortName := EndPathLIst[j].EndPortName;
if EndPathList[j].EndPorts.Count > 0 then
PathList[PathListLength-1].EndPorts.Add(EndPathList[j].EndPorts[0]); // порт тут один
PathList[PathListLength-1].InterFacePositions := TIntList.Create;
PathList[PathListLength-1].InterFacePositions.Add(EndPathList[j].InterFacePositions[0]); // позиция тут одна
end;
end;
end
else
SortListByPositions(PathList);
SortListByPositions(PathList); //здесь уже все расключение сидит
// определяем, вложен ли кабель в кабельные каналы (хоть где-нибудь)
HasCableCanals := false;
if cbCablePathShowCableCanals.Checked then
begin
for j := 0 to CablesPassed.Count - 1 do
begin
if CablesPassed[j].GetParentComponent <> nil then
begin
HasCableCanals := true;
break;
end;
end;
end;
//интерфейс (потом из него выгребем наименование)
Interf := nil;
for j := 0 to BeginCable.Interfaces.Count - 1 do
begin
if Begincable.Interfaces[j].GUIDInterface = InterfNames[i] then
begin
Interf := BeginCable.Interfaces[j];
break;
end;
end;
// если интерфейс только в конце кабеля, смотрим там
if Interf = nil then
begin
for j := 0 to EndCable.Interfaces.Count - 1 do
begin
if EndCable.Interfaces[j].GUIDInterface = InterfNames[i] then
begin
Interf := EndCable.Interfaces[j];
break;
end;
end;
end;
// ЕСЛИ ПОКАЗЫВАТЬ ДЕТАЛЬНОЕ РАСКЛЮЧЕНИЕ КАБЕЛЯ
if cbCablePathShowConnInSeparatePaths.Checked then
begin
l := Length(PathList);
// сбрасываем в таблицу
// разложим в три прохода, чтобы было "кирасиво"
if NameList = nil then
NameList:=TStringList.Create
else
NameList.Clear;
PosNumber := 0;
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo <> nil)) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := PathList[j].ID;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(PathList[j].InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := PathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := PathList[j].NppTo;
// откуда
// если есть порты, добавляем имя и номера занятых
s:='';
if PathList[j].BeginPortName <> '' then
begin
s := ' ' + PathList[j].BeginPortName + GetNumberCount(PathList[j].BeginPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameFrom <> nil then
begin
if not PathList[j].NameFrom.IsTop then
NameList.Insert(0,PathList[j].NameFrom.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameFrom <> nil) and (not PathList[j].NameFrom.IsTop) then
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
s :='';
if PathList[j].EndPortName <> '' then
begin
s:= ' ' + PathList[j].EndPortName + GetNumberCount(PathList[j].EndPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameTo <> nil then
begin
if not PathList[j].NameTo.IsTop then
NameList.Insert(0,PathList[j].NameTo.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameTo.GetfirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameTo <> nil) and (not PathList[j].NameTo.IsTop) then
NameList.Insert(0,PathList[j].NameTo.getfirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
//теперь описание
//начальный объект (если есть)
s := '';
if PathList[j].NameFrom <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
// если подключен топовый компонент - выводим в описание, если нет,
// то поднимаемся до топа, добавляя всех парентов по пути к топу
if PathList[j].NameFrom.IsTop then
s := PathList[j].NameFrom.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameFrom;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].BeginPortName <> '' then
s := s + ' / ' + PathList[j].BeginPortName;
if PathList[j].BeginPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].BeginPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameFrom.GetNameForVisible(true)+;
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].Kolvo; //.BeginPorts.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
// кабель
PosNumber := WriteCableToTbl(CablesPassed, PathList[j].InterFacePositions, PosNumber, PathList[j].ID, PathList[j].InterFacePositions.Count);
//кончальный объект (если есть)
s := '';
if PathList[j].NameTo <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
if PathList[j].NameTo.IsTop then
s := PathList[j].NameTo.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameTo;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].EndPortName <> '' then
s := s + ' / ' + PathList[j].EndPortName;
if PathList[j].EndPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].EndPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameTo.GetNameForVisible(true);
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterfacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
FmtCablePaths.Post;
end;
end;
end;
NameList.Clear;
for j := 0 to Length(PathList) - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo = nil )) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := PathList[j].ID;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(PathList[j].InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := PathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := PathList[j].NppTo;
// откуда
// если есть порты, добавляем имя и номера занятых
s:='';
if PathList[j].BeginPortName <> '' then
begin
s := ' ' + PathList[j].BeginPortName + GetNumberCount(PathList[j].BeginPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameFrom <> nil then
begin
if not PathList[j].NameFrom.IsTop then
NameList.Insert(0,PathList[j].NameFrom.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameFrom <> nil) and (not PathList[j].NameFrom.IsTop) then
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
s :='';
if PathList[j].EndPortName <> '' then
begin
s:= ' ' + PathList[j].EndPortName + GetNumberCount(PathList[j].EndPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameTo <> nil then
begin
if not PathList[j].NameTo.IsTop then
NameList.Insert(0,PathList[j].NameTo.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameTo.GetfirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameTo <> nil) and (not PathList[j].NameTo.IsTop) then
NameList.Insert(0,PathList[j].NameTo.getfirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
//теперь описание
//начальный объект (если есть)
s := '';
if PathList[j].NameFrom <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
// если подключен топовый компонент - выводим в описание, если нет,
// то поднимаемся до топа, добавляя всех парентов по пути к топу
if PathList[j].NameFrom.IsTop then
s := PathList[j].NameFrom.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameFrom;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].BeginPortName <> '' then
s := s + ' / ' + PathList[j].BeginPortName;
if PathList[j].BeginPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].BeginPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameFrom.GetNameForVisible(true)+;
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].Kolvo; //.BeginPorts.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
// кабель
PosNumber := WriteCableToTbl(CablesPassed, PathList[j].InterFacePositions, PosNumber, PathList[j].ID, PathList[j].InterFacePositions.Count);
//кончальный объект (если есть)
s := '';
if PathList[j].NameTo <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
if PathList[j].NameTo.IsTop then
s := PathList[j].NameTo.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameTo;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].EndPortName <> '' then
s := s + ' / ' + PathList[j].EndPortName;
if PathList[j].EndPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].EndPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameTo.GetNameForVisible(true);
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterfacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
FmtCablePaths.Post;
end;
end;
end;
NameList.Clear;
for j := 0 to Length(PathList) - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom = nil) and (PathList[j].NameTo <> nil)) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := PathList[j].ID;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(PathList[j].InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := PathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := PathList[j].NppTo;
// откуда
// если есть порты, добавляем имя и номера занятых
s:='';
if PathList[j].BeginPortName <> '' then
begin
s := ' ' + PathList[j].BeginPortName + GetNumberCount(PathList[j].BeginPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameFrom <> nil then
begin
if not PathList[j].NameFrom.IsTop then
NameList.Insert(0,PathList[j].NameFrom.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameFrom <> nil) and (not PathList[j].NameFrom.IsTop) then
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
s :='';
if PathList[j].EndPortName <> '' then
begin
s:= ' ' + PathList[j].EndPortName + GetNumberCount(PathList[j].EndPorts);
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameTo <> nil then
begin
if not PathList[j].NameTo.IsTop then
NameList.Insert(0,PathList[j].NameTo.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameTo.GetfirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameTo <> nil) and (not PathList[j].NameTo.IsTop) then
NameList.Insert(0,PathList[j].NameTo.getfirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
//теперь описание
//начальный объект (если есть)
s := '';
if PathList[j].NameFrom <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
// если подключен топовый компонент - выводим в описание, если нет,
// то поднимаемся до топа, добавляя всех парентов по пути к топу
if PathList[j].NameFrom.IsTop then
s := PathList[j].NameFrom.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameFrom;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].BeginPortName <> '' then
s := s + ' / ' + PathList[j].BeginPortName;
if PathList[j].BeginPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].BeginPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameFrom.GetNameForVisible(true)+;
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterFacePositions.Count; //.BeginPorts.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
// кабель
PosNumber := WriteCableToTbl(CablesPassed, PathList[j].InterFacePositions, PosNumber, PathList[j].ID, PathList[j].InterFacePositions.Count);
//кончальный объект (если есть)
s := '';
if PathList[j].NameTo <> nil then
begin
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := j;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := PathList[j].ID;
if PathList[j].NameTo.IsTop then
s := PathList[j].NameTo.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameTo;
while not currCompon.IsTop do
begin
if s <> '' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
if PathList[j].EndPortName <> '' then
s := s + ' / ' + PathList[j].EndPortName;
if PathList[j].EndPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].EndPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;//PathList[j].NameTo.GetNameForVisible(true);
s := '';
// количество портов (если есть)
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterfacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
FmtCablePaths.Post;
end;
end;
end;
NameList.Clear;
end
else
// НЕ ПОКАЗЫВАТЬ РАСКЛЮЧЕНИЕ КАБЕЛЯ В ОТДЕЛЬНЫХ ПУТЯХ
begin
// теперь нужно сложить порты и пары по топовым компонентам
// (учесть типы и номера портов, если таковые имеются)
l := Length(PathList);
if NameList = nil then
NameList:=TStringList.Create
else
NameList.Clear;
PosNumber := 0;
l := Length(PathList);
SetLength(EndPathList,0);
// дублируем список
for j := 0 to l - 1 do
begin
SetLength(EndPathList, Length(EndPathList) + 1);
PathListLength := Length(EndPathList) - 1;
EndPathList[PathListLength].ID := PathList[j].ID;
EndPathList[PathListLength].BeginPortName := PathList[j].BeginPortName;
EndPathList[PathListLength].EndPortName := PathList[j].EndPortName;
EndPathList[PathListLength].BeginPorts := TIntList.Create;
if PathList[j].BeginPorts.Count > 0 then
begin
for k := 0 to PathList[j].BeginPorts.Count - 1 do
EndPathList[PathListLength].BeginPorts.Add(PathList[j].BeginPorts[k]);
end;
EndPathList[PathListLength].EndPorts := TIntList.Create;
if PathList[j].EndPorts.Count > 0 then
begin
for k := 0 to PathList[j].EndPorts.Count - 1 do
EndPathList[PathListLength].EndPorts.Add(PathList[j].EndPorts[k]);
end;
EndPathList[PathListLength].Kolvo := PathList[j].Kolvo;
EndPathList[PathListLength].FromTo := PathList[j].FromTo;
EndPathList[PathListLength].NppFrom := PathList[j].NppFrom;
EndPathList[PathListLength].NppTo := PathList[j].NppTo;
EndPathList[PathListLength].InterFacePositions := TIntList.Create;
if PathList[j].InterFacePositions.Count > 0 then
begin
for k := 0 to PathList[j].InterFacePositions.Count - 1 do
begin
EndPathList[PathListLength].InterFacePositions.Add(PathList[j].InterFacePositions[k]);
end;
end;
if PathList[j].NameFrom = nil then
EndPathList[PathListLength].NameFrom := nil
else
EndPathList[PathListLength].NameFrom := PathList[j].NameFrom;
if PathList[j].NameTo = nil then
EndPathList[PathListLength].NameTo := nil
else
EndPathList[PathListLength].NameTo := PathList[j].NameTo;
EndPathList[PathListLength].Passed := PathList[j].Passed;
end; // end копирования списка
// сначала складываем интерфейсы (пары) по портам(компонентам) подключения
// для начальных компонент в первом списке
for j := 0 to l - 2 do
begin
if PathList[j].Passed = false then
begin
for k := j+1 to l - 1 do
begin
// если одинаковые "откуда-куда" (объекты)
if ((PathList[j].NameFrom = PathList[k].NameFrom) and
(PathList[j].NameTo = PathList[k].NameTo)) or
((PathList[j].NameFrom = nil) and (PathList[k].NameFrom = nil) and
(PathList[j].NameTo = PathList[k].NameTo)) or
((PathList[j].NameFrom = PathList[k].NameFrom) and
(PathList[j].NameTo = nil) and (PathList[k].NameTo=nil)) or
((PathList[j].NameFrom = PathList[k].NameFrom) and
(PathList[j].NameTo <> PathList[k].NameTo)) then
begin
// теперь надо проверить порты (есть, нет, и одинаковые ли)
// для того, чтобы сложить пары, идущие к одинаковым портам или объектам
// (или в "никуда" с одного конца)
// порты здесь пока разложены по одной штуке
// если типы портов подключения одинаковые и порты одинаковые, то складываем пары
// если подключено по портам
if ( (PathList[j].BeginPortName = PathList[k].BeginPortName) and
(PathLIst[j].BeginPortName <> '') and (PathList[k].BeginPortName <> '') and
(PathList[j].BeginPorts[0] = PathList[k].BeginPorts[0])
) or
// портов нет, складываем пары подключенные к одним и тем же компонентам
( ((PathLIst[j].BeginPortName = '') and (PathList[k].BeginPortName = '')) and
((PathLIst[j].NameFrom = PathLIst[k].NameFrom) and (PathLIst[j].NameTo = PathLIst[k].NameTo))
) then
begin
inc(PathList[j].Kolvo);
PathList[k].Passed := true;
// пары
PathList[j].InterFacePositions.Add(PathList[k].InterFacePositions[0]);
end;
end;
end;
end;
end; // собрали список
// Делаем то же самое для конечных компонент
for j := 0 to l - 2 do
begin
if EndPathList[j].Passed = false then
begin
for k := j+1 to l - 1 do
begin
// если одинаковые "откуда-куда" (объекты)
if ((EndPathList[j].NameFrom = EndPathList[k].NameFrom) and
(EndPathList[j].NameTo = EndPathList[k].NameTo)) or
((EndPathList[j].NameFrom = nil) and (EndPathList[k].NameFrom = nil) and
(EndPathList[j].NameTo = EndPathList[k].NameTo)) or
((EndPathList[j].NameFrom = EndPathList[k].NameFrom) and
(EndPathList[j].NameTo = nil) and (EndPathList[k].NameTo=nil)) or
((EndPathList[j].NameTo = EndPathList[k].NameTo) and
(EndPathList[j].NameFrom <> EndPathList[k].NameFrom)) then
begin
// теперь надо проверить порты (есть, нет, и одинаковые ли)
// для того, чтобы сложить пары, идущие к одинаковым портам или объектам
// (или в "никуда" с одного конца)
// порты здесь пока разложены по одной штуке
// если типы портов подключения одинаковые и порты одинаковые, то складываем пары
if ( (EndPathList[j].EndPortName = EndPathList[k].EndPortName) and
(EndPathList[j].EndPortName <> '') and (EndPathList[k].EndPortName <>'') and
(EndPathList[j].EndPorts[0] = EndPathList[k].EndPorts[0])
) or
// портов нет, складываем пары подключенные к одним и тем же компонентам
( ((EndPathLIst[j].EndPortName = '') and (EndPathList[k].EndPortName = '')) and
((EndPathLIst[j].NameFrom = EndPathLIst[k].NameFrom) and (EndPathLIst[j].NameTo = EndPathLIst[k].NameTo))
) then
begin
inc(EndPathList[j].Kolvo);
EndPathList[k].Passed := true;
EndPathList[j].InterFacePositions.Add(EndPathList[k].InterFacePositions[0]);
end;
end;
end;
end;
end; // собрали список
// позиции интерфейсов
if InterFacePositions = nil then
InterFacePositions := TIntList.Create
else
InterFacePositions.Clear;
PosNumber := 0; // ID подчиненной таблицы
SetLength(BeginPortInfo,0);
SetLength(EndPortInfo,0);
Passed := false;
// ПИШЕМ ТАБЛИЧКИ (сначала - описание, потом сформируем заголовки)
// сначала пишем те, где есть "откуда - куда" (если есть)
//проверяем, есть ли такие
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo <> nil)) then
begin
passed := true;
break;
end;
end;
end;
// если есть - пишем
//начало(откуда)
if Passed then
begin
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo <> nil)) then
begin
// позиции интерфейсов складываем в список
for k := 0 to PathList[j].InterFacePositions.Count - 1 do
begin
if InterFacePositions.IndexOf(PathList[j].InterFacePositions[k]) = -1 then
InterFacePositions.Add(PathList[j].InterFacePositions[k]);
end;
// порты тоже складываем в список по наименованиям
if PathList[j].BeginPortName <> '' then
begin
// если инфы о портах пока нет - добавляем сразу
if Length(BeginPortInfo) = 0 then
begin
SetLength(BeginPortInfo,Length(BeginPortInfo)+1);
m := Length(BeginPortInfo) - 1 ;
BeginPortInfo[m].PortName := PathList[j].BeginPortName;
BeginPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
BeginPortInfo[m].Ports.Add(PathList[j].BeginPorts[0]);
end
// если есть, смотрим, куда добавить
else
begin
passed := false;
for m := 0 to Length(BeginPortInfo) - 1 do
begin
if BeginPortInfo[m].PortName = PathList[j].BeginPortName then
begin
if BeginPortInfo[m].Ports.IndexOf(PathList[j].BeginPorts[0]) = -1 then
BeginPortInfo[m].Ports.Add(PathLIst[j].BeginPorts[0]);
Passed := true;
break;
end;
end;
if passed = false then
begin
SetLength(BeginPortInfo,Length(BeginPortInfo)+1);
m := Length(BeginPortInfo) - 1 ;
BeginPortInfo[m].PortName := PathList[j].BeginPortName;
BeginPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
BeginPortInfo[m].Ports.Add(PathList[j].BeginPorts[0]);
end;
end;
end;
//пишем порт (компонент) в таблицу
inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := 1;
s := ' ';
if PathList[j].NameFrom <> nil then
begin
if PathList[j].NameFrom.IsTop then
s := PathList[j].NameFrom.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameFrom;
while not currCompon.IsTop do
begin
if s <> ' ' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
end;
if PathList[j].BeginPortName <> '' then
s := s + ' / ' + PathList[j].BeginPortName;
if PathList[j].BeginPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].BeginPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterFacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
end;
end;
// кабель
PosNumber := WriteCableToTbl(CablesPassed, InterFacePositions, PosNumber, 1, InterFacePositions.Count );
// конец (куда)
for j := 0 to l - 1 do
begin
if ((EndPathList[j].NameFrom <> nil) and (EndPathList[j].NameTo <> nil)) then
begin
if EndPathList[j].passed = false then
begin
// порты складываем в список по наименованиям
if EndPathList[j].EndPortName <> '' then
begin
// если инфы о портах пока нет - добавляем сразу
if Length(EndPortInfo) = 0 then
begin
SetLength(EndPortInfo,Length(EndPortInfo)+1);
m := Length(EndPortInfo) - 1 ;
EndPortInfo[m].PortName := EndPathList[j].EndPortName;
EndPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
EndPortInfo[m].Ports.Add(EndPathList[j].EndPorts[0]);
end
// если есть, смотрим, куда добавить
else
begin
passed := false;
for m := 0 to Length(EndPortInfo) - 1 do
begin
if EndPortInfo[m].PortName = EndPathList[j].EndPortName then
begin
if EndPortInfo[m].Ports.IndexOf(EndPathList[j].EndPorts[0]) = -1 then
EndPortInfo[m].Ports.Add(EndPathLIst[j].EndPorts[0]);
Passed := true;
break;
end;
end;
if passed = false then
begin
SetLength(EndPortInfo,Length(EndPortInfo)+1);
m := Length(EndPortInfo) - 1 ;
EndPortInfo[m].PortName := EndPathList[j].EndPortName;
EndPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
EndPortInfo[m].Ports.Add(EndPathList[j].EndPorts[0]);
end;
end;
end;
//пишем порт (компонент) в таблицу
inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := 1;
s := ' ';
if EndPathList[j].NameTo <> nil then
begin
if EndPathList[j].NameTo.IsTop then
s := EndPathList[j].NameTo.GetNameForVisible(true)
else
begin
currCompon := EndPathList[j].NameTo;
while not currCompon.IsTop do
begin
if s <> ' ' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
end;
if EndPathList[j].EndPortName <> '' then
s := s + ' / ' + EndPathList[j].EndPortName;
if PathList[j].EndPorts.Count > 0 then
s := s + GetNumberCount(EndPathList[j].EndPorts);
s := GetNumberCount(EndPathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := EndPathList[j].InterFacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
end;
end;
// теперь пишем заголовок
if NameList = nil then
NameList := TStringList.Create
else
NameList.Clear;
for j := 0 to l - 1 do
begin
if ((PathList[j].NameFrom <> nil ) and (PathList[j].NameTo <> nil)) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := 1;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := PathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := PathList[j].NppTo;
// откуда
// если есть начальные порты, добавляем имя и номера занятых
s:='';
if Length(BeginPortInfo) > 0 then
begin
for k := 0 to Length(BeginPortInfo) - 1 do
begin
if s <> '' then s := s + ',';
s := s + BeginPortInfo[k].PortName + GetNumberCount(BeginPortInfo[k].Ports);
end;
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameFrom <> nil then
begin
if not PathList[j].NameFrom.IsTop then
NameList.Insert(0,PathList[j].NameFrom.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameFrom <> nil) and (not PathList[j].NameFrom.IsTop) then
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
s :='';
if Length(EndPortInfo) > 0 then
begin
for k := 0 to Length(EndPortInfo) - 1 do
begin
if s <> '' then s := s + ',';
s := s + EndPortInfo[k].PortName + GetNumberCount(EndPortInfo[k].Ports);
end;
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameTo <> nil then
begin
if not PathList[j].NameTo.IsTop then
NameList.Insert(0,PathList[j].NameTo.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameTo.GetfirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameTo <> nil) and (not PathList[j].NameTo.IsTop) then
NameList.Insert(0,PathList[j].NameTo.getfirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
FmtCablePaths.Post;
break;
end;
end;
end;
//=============================================================================================================
if InterFacePositions = nil then
InterFacePositions := TIntList.Create
else
InterFacePositions.Clear;
SetLength(BeginPortInfo,0);
SetLength(EndPortInfo,0);
// откуда - "никуда"
Passed := false;
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo = nil)) then
begin
passed := true;
break;
end;
end;
end;
// если есть - пишем
if Passed then
begin
// начало
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom <> nil) and (PathList[j].NameTo = nil)) then
begin
// позиции интерфейсов складываем в список
for k := 0 to PathList[j].InterFacePositions.Count - 1 do
begin
if InterFacePositions.IndexOf(PathList[j].InterFacePositions[k]) = -1 then
InterFacePositions.Add(PathList[j].InterFacePositions[k]);
end;
// порты тоже складываем в список по наименованиям
if PathList[j].BeginPortName <> '' then
begin
// если инфы о портах пока нет - добавляем сразу
if Length(BeginPortInfo) = 0 then
begin
SetLength(BeginPortInfo,Length(BeginPortInfo)+1);
m := Length(BeginPortInfo) - 1 ;
BeginPortInfo[m].PortName := PathList[j].BeginPortName;
BeginPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
BeginPortInfo[m].Ports.Add(PathList[j].BeginPorts[0]);
end
// если есть, смотрим, куда добавить
else
begin
passed := false;
for m := 0 to Length(BeginPortInfo) - 1 do
begin
if BeginPortInfo[m].PortName = PathList[j].BeginPortName then
begin
if BeginPortInfo[m].Ports.IndexOf(PathList[j].BeginPorts[0]) = -1 then
BeginPortInfo[m].Ports.Add(PathLIst[j].BeginPorts[0]);
Passed := true;
break;
end;
end;
if passed = false then
begin
SetLength(BeginPortInfo,Length(BeginPortInfo)+1);
m := Length(BeginPortInfo) - 1 ;
BeginPortInfo[m].PortName := PathList[j].BeginPortName;
BeginPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
BeginPortInfo[m].Ports.Add(PathList[j].BeginPorts[0]);
end;
end;
end;
//пишем порт (компонент) в таблицу
inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := 2;
s := ' ';
if PathList[j].NameFrom <> nil then
begin
if PathList[j].NameFrom.IsTop then
s := PathList[j].NameFrom.GetNameForVisible(true)
else
begin
currCompon := PathList[j].NameFrom;
while not currCompon.IsTop do
begin
if s <> ' ' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
end;
if PathList[j].BeginPortName <> '' then
s := s + ' / ' + PathList[j].BeginPortName;
if PathList[j].BeginPorts.Count > 0 then
s := s + GetNumberCount(PathList[j].BeginPorts);
s := GetNumberCount(PathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := PathList[j].InterFacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
end;
end;
//кончала не будет - сразу пишем кабель (и алес)
// кабель
PosNumber := WriteCableToTbl(CablesPassed, InterFacePositions, PosNumber, 2, InterFacePositions.Count );
// теперь заголовок
if NameList = nil then
NameList := TStringList.Create
else
NameList.Clear;
for j := 0 to l - 1 do
begin
if ((PathList[j].NameFrom <> nil ) and (PathList[j].NameTo = nil)) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := 2;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := PathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := PathList[j].NppTo;
// откуда
// если есть начальные порты, добавляем имя и номера занятых
s:='';
if Length(BeginPortInfo) > 0 then
begin
for k := 0 to Length(BeginPortInfo) - 1 do
begin
if s <> '' then s := s + ',';
s := s + BeginPortInfo[k].PortName + GetNumberCount(BeginPortInfo[k].Ports);
end;
NameList.Insert(0,s);
s:='';
end;
if PathList[j].NameFrom <> nil then
begin
if not PathList[j].NameFrom.IsTop then
NameList.Insert(0,PathList[j].NameFrom.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (PathList[j].NameFrom <> nil) and (not PathList[j].NameFrom.IsTop) then
NameList.Insert(0,PathList[j].NameFrom.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
NameList.Insert(0,' ');
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
FmtCablePaths.Post;
break;
end;
end;
end;
Passed := false;
//=================================================================================================================
if InterFacePositions = nil then
InterFacePositions := TIntList.Create
else
InterFacePositions.Clear;
SetLength(BeginPortInfo,0);
SetLength(EndPortInfo,0);
// "из никуда" - "куда"
for j := 0 to l - 1 do
begin
if PathList[j].Passed = false then
begin
if ((PathList[j].NameFrom = nil) and (PathList[j].NameTo <> nil)) then
begin
passed := true;
break;
end;
end;
end;
// если есть - пишем
// тут немножко не так, сначала считаем, потом пишем кабель, а потом компоненты
if Passed then
begin
for j := 0 to l - 1 do
begin
if ((EndPathList[j].NameFrom = nil) and (EndPathList[j].NameTo <> nil)) then
begin
if EndPathList[j].passed = false then
begin
// позиции интерфейсов
for k := 0 to EndPathList[j].InterFacePositions.Count - 1 do
begin
if InterFacePositions.IndexOf(EndPathList[j].InterFacePositions[k]) = -1 then
InterFacePositions.Add(EndPathList[j].InterFacePositions[k]);
end;
// порты складываем в список по наименованиям
if EndPathList[j].EndPortName <> '' then
begin
// если инфы о портах пока нет - добавляем сразу
if Length(EndPortInfo) = 0 then
begin
SetLength(EndPortInfo,Length(EndPortInfo)+1);
m := Length(EndPortInfo) - 1 ;
EndPortInfo[m].PortName := EndPathList[j].EndPortName;
EndPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
EndPortInfo[m].Ports.Add(EndPathList[j].EndPorts[0]);
end
// если есть инфа о портах, смотрим, куда добавить
else
begin
passed := false;
for m := 0 to Length(EndPortInfo) - 1 do
begin
if EndPortInfo[m].PortName = EndPathList[j].EndPortName then
begin
if EndPortInfo[m].Ports.IndexOf(EndPathList[j].EndPorts[0]) = -1 then
EndPortInfo[m].Ports.Add(EndPathLIst[j].EndPorts[0]);
Passed := true;
break;
end;
end;
if passed = false then
begin
SetLength(EndPortInfo,Length(EndPortInfo)+1);
m := Length(EndPortInfo) - 1 ;
EndPortInfo[m].PortName := EndPathList[j].EndPortName;
EndPortInfo[m].Ports := TIntList.Create;
// порты сидят в списке по одному
EndPortInfo[m].Ports.Add(EndPathList[j].EndPorts[0]);
end;
end;
end;
end;
end;
end;
// начала не будет - сразу пишем кабель
// кабель
PosNumber := WriteCableToTbl(CablesPassed, InterFacePositions, PosNumber, 3, InterFacePositions.Count );
// пишем конечные подключения
for j := 0 to l - 1 do
begin
if ((EndPathList[j].NameFrom = nil) and (EndPathList[j].NameTo <> nil)) then
begin
if EndPathList[j].passed = false then
begin
//пишем порт (компонент) в таблицу
inc(PosNumber);
FmtCablePathsInfo.Append;
FmtCablePathsInfo.FieldByName(fnID).AsInteger := PosNumber;
FmtCablePathsInfo.FieldByName(fnParentID).AsInteger := 3;
s := ' ';
if EndPathList[j].NameTo <> nil then
begin
if EndPathList[j].NameTo.IsTop then
s := EndPathList[j].NameTo.GetNameForVisible(true)
else
begin
currCompon := EndPathList[j].NameTo;
while not currCompon.IsTop do
begin
if s <> ' ' then
s := currCompon.GetNameForVisible(true) + '/' + s
else s := currCompon.GetNameForVisible(true);
currCompon := currCompon.GetParentComponent;
end;
end;
end;
if EndPathList[j].EndPortName <> '' then
s := s + ' / ' + EndPathList[j].EndPortName;
if PathList[j].EndPorts.Count > 0 then
s := s + GetNumberCount(EndPathList[j].EndPorts);
s := GetNumberCount(EndPathList[j].InterFacePositions) + ' ' + s;
FmtCablePathsInfo.FieldByName(fnDescription).AsString := s;
s := '';
FmtCablePathsInfo.FieldByName(fnInterfCount).AsInteger := EndPathList[j].InterFacePositions.Count;
FmtCablePathsInfo.FieldByName(fnMargin).AsInteger := 0;
FmtCablePathsInfo.Post;
end;
end;
end;
//теперь заголовок
if NameList = nil then
NameList := TStringList.Create
else
NameList.Clear;
for j := 0 to l - 1 do
begin
if ((EndPathList[j].NameFrom = nil ) and (PathList[j].NameTo <> nil)) then
begin
FmtCablePaths.Append;
FmtCablePaths.FieldByName(fnID).AsInteger := 3;
FmtCablePaths.FieldByName(fnName).AsString := Interf.LoadName + ' ' + GetNumberCount(InterFacePositions);
FmtCablePaths.FieldByName(fnNppFrom).AsInteger := EndPathList[j].NppFrom;
FmtCablePaths.FieldByName(fnNppTo).AsInteger := EndPathList[j].NppTo;
s:='';
NameList.Insert(0,' ');
FmtCablePaths.FieldByName(fnNameFrom).AsString := NameList.Text;
NameList.Clear;
// куда
s :='';
if Length(EndPortInfo) > 0 then
begin
for k := 0 to Length(EndPortInfo) - 1 do
begin
if s <> '' then s := s + ',';
s := s + EndPortInfo[k].PortName + GetNumberCount(EndPortInfo[k].Ports);
end;
NameList.Insert(0,s);
s:='';
end;
if EndPathList[j].NameTo <> nil then
begin
if not EndPathList[j].NameTo.IsTop then
NameList.Insert(0,EndPathList[j].NameTo.GetTopComponent.GetNameForVisible(True))
else
NameList.Insert(0,EndPathList[j].NameTo.GetfirstParentCatalog.GetNameForVisible(True));
end
else
NameList.Insert(0,' ');
// если показывать конечные объекты
if cbCablePathShowEndObjName.Checked then
begin
if (EndPathList[j].NameTo <> nil) and (not EndPathList[j].NameTo.IsTop) then
NameList.Insert(0,EndPathList[j].NameTo.GetFirstParentCatalog.GetNameForVisible(True));
end;
FmtCablePaths.FieldByName(fnNameTo).AsString := NameList.Text;
NameList.Clear;
FmtCablePaths.Post;
break;
end;
end;
end;
Passed := false; // Финиш, Ёпт,ура!
end;
AllCableInterFaces.Clear;
end
else
//выводим сообщение об несоответствии нумерации пар интерфейсов на концах кабеля
begin
showmessage(cRepMsg239);
end;
if NumPairEqual = false then break;
end; // end i
end;*)
if NumPairEqual then
begin
GFormMode := fmRCablePaths;
AParams.PageToShow := 0;
ShowPreparedReport(AParams);
end;
end // пипец для компутерных сетей(и типа того)
// сеть електро- (и типа того)
else
begin
NumPairEqual := false; // на всякий, хотя тут - до лампочки
// определяем подключенные (сначала все)
Passed := false;
AllConnectedCompons := TSCSComponents.Create(false);
BeginCompons := nil;
GetAllConnected(FComponent, AllConnectedCompons, FComponent.Cypher, nil);
// showmessage('Connected count = '+inttostr(AllConnectedCompons.Count));
// подключенные точечные к кабелю
ConnectedCompons := TSCSComponents.Create(false);
for j := 0 to AllConnectedCompons.Count - 1 do
begin
if ( (AllConnectedCompons[j].IsLine = biFalse) and (ConnectedCompons.IndexOf(AllConnectedCompons[j]) = -1) ) then
ConnectedCompons.Add(AllConnectedCompons[j]);
end;
// если подключенных точечных нет - отчет не строим
if ConnectedCompons.Count > 0 then
begin
NumPairEqual := true; // нужно для проверки отображения отчета
// ОПРЕДЕЛЯЕМ НАЧАЛЬНЫЙ КОМПОНЕНТ
// если подключенный точечный один - он и будет началом пути
if ConnectedCompons.Count = 1 then
begin
BeginCompon := ConnectedCompons[0];
end
// если подключенных точечных несколько - определяем начальный по наибольшему количеству
// функциональных интерфейсов
else
begin
// Начало пути - верхний компонент
BeginCompon := GetMaxInterfObject(ConnectedCompons, true);
end;
CablesPassed := nil;
CablesPassed := TSCSComponents.Create(false);
ConnectedCables := TSCSComponents.Create(false);
StrangeCables := TSCSComponents.Create(false);
BeginPos := 0;
PosNumber := 0;
BeginCompons := TSCSComponents.create(false);
EndCompons := TSCSComponents.create(false);
Passed := false;
// НАЧАЛО ПУТИ - конкретно подключенный к кабелю компонент
if BeginCompon.IsTop then // Проверка на подключение кабеля к компонентам начального компонента
begin
for j := 0 to ConnectedCompons.Count - 1 do
begin
if BeginCompon.ChildReferences.IndexOf(ConnectedCompons[j]) <> -1 then
begin
currCompon := ConnectedCompons[j];
// Кабель, подключенный к начальному компоненту
for k := 0 to currCompon.JoinedComponents.Count - 1 do
begin
if currCompon.JoinedComponents[k].Cypher = FComponent.Cypher then
begin
if (currCompon.JoinedComponents[k].isLine = biTrue) and
(AllConnectedCompons.IndexOf(currCompon.JoinedComponents[k]) <> -1) and
(CablesPassed.IndexOf(currCompon.JoinedComponents[k]) = -1) then
begin
GetAllConnectedFromBegin(currCompon.JoinedComponents[k], currCompon, nil, FComponent.Cypher, true);
Passed := true;
break;
end;
end;
end;
end;
if Passed then break;
end;
end;
// if not Passed then // проверка на подключение кабеля к самому компоненту
begin
for k := 0 to BeginCompon.JoinedComponents.Count - 1 do
begin
if (BeginCompon.JoinedComponents[k].isLine = biTrue) and
(AllConnectedCompons.IndexOf(BeginCompon.JoinedComponents[k]) <> -1) and
(CablesPassed.IndexOf(BeginCompon.JoinedComponents[k]) = -1) then
begin
if BeginCompon.JoinedComponents[k].Cypher = FComponent.Cypher then
begin
GetAllConnectedFromBegin(BeginCompon.JoinedComponents[k], BeginCompon, nil, FComponent.Cypher, true);
Passed := true;
break;
end;
end;
end;
end;
AllConnectedCompons.Clear;
Counter := 0;
end; // пипец, если строим отчет
// отчет показываем, только если нумерация интерфейсов кабеля сходится на концах
if NumPairEqual then
begin
GFormMode := fmRCablePaths;
AParams.PageToShow := 1;
ShowPreparedReport(AParams);
end;
end; // пипец (кабель электрический, пожарка и т.п.)
end;
except
on E: Exception do AddExceptionToLogExt(ClassName, 'ShowCablePaths', E.Message);
end;
end;
Procedure TF_ResourceReport.ShowPortConnections(aParams: TReportItemParams); // Tolik 07/09/2023 --
type FportCount = array of integer;
var i, j, PortNameIndex: integer;
CupBoardFolder, JoinedLineCatalog: TSCSCatalog;
PortNamesList: TStringList;
PortsCount, BusyPortsCount, FreePortsCount: integer;
JoinedLinesList: TList;
JoinedLine: TOrthoLine;
CableComponent: TSCSComponent;
PassedComponList: TSCSComponents;
FreeportsbyName, BusyPortsByName: FPortCount;
function GetPortCount(aComponent: TSCSComponent; aRec: Boolean = false): integer;
var i, j: integer;
ComponList: TList;
Compon: TSCScomponent;
port: TSCSInterface;
PortList: TSCSInterfaces;
begin
Result := 0;
ComponList := TList.Create;
if aRec then
begin
for i := 0 to aComponent.ChildReferences.Count - 1 do
ComponList.Add(aComponent.ChildReferences[i]);
end;
ComponList.Insert(0, aComponent);
PortList := TSCSInterfaces.Create(false);
for i := 0 to ComponList.Count - 1 do
begin
Compon := TSCSComponent(ComponList[i]);
for j := 0 to Compon.Interfaces.Count - 1 do
begin
port := Compon.Interfaces[j];
if port.IsPort = biTrue then
begin
if PortList.IndexOf(port) = -1 then
begin
PortList.Add(Port);
if port.Kolvo > 0 then
Result := Result + port.Kolvo
else
inc(Result);
end;
end;
end;
end;
end;
Procedure CollectPortNames(aCompon: TSCScomponent);
var i: integer;
InterfName : string;
begin
if aCompon <> nil then
begin
for i := 0 to aCompon.Interfaces.Count - 1 do
begin
if aCompon.Interfaces[i].IsPort = biTrue then
begin
InterfName := aCompon.Interfaces[i].LoadName;
InterfName := aCompon.Interfaces[i].GetNameForVisible;
if PortNamesList.IndexOf(aCompon.Interfaces[i].Name) = -1 then
PortNamesList.Add(aCompon.Interfaces[i].NAme);
end;
end;
for i := 0 to aCompon.ChildComplects.Count - 1 do
CollectPortNames(aCompon.ChildComplects[i]);
end;
end;
function GetConnectedLines: TList;
var i, j: integer;
CupboardFigure: TFigure;
JoinedConn: TConnectorObject;
JoinedLine: TOrthoLine;
begin
Result := TList.Create;
if CupBoardFolder <> nil then
begin
if GCadForm <> nil then
begin
CupboardFigure := getFigureByID(GCadForm, CupBoardFolder.SCSID);
if CupBoardFigure <> nil then
begin
if CupBoardFigure is TConnectorObject then
begin
for i := 0 to TConnectorObject(CupBoardFigure).JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(TConnectorObject(CupBoardFigure).JoinedConnectorsList[i]);
if not JoinedConn.Deleted then
begin
if JoinedConn.ConnectorType = ct_Clear then
begin
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if not JoinedLine.Deleted then
begin
if Result.IndexOf(JoinedLine) = -1 then
Result.Add(JoinedLine);
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
function GetFullPortName(aInterf: TSCSInterface): string;
var ParentCompon: TSCSComponent;
begin
if aInterf.Name = '' then
aInterf.LoadName;
Result := aInterf.ComponentOwner.GetNameForVisible + '/' + aInterf.GetNameForVisible;
ParentCompon := aInterf.ComponentOwner.GetParentComponent;
if ParentCompon <> nil then
begin
while ParentCompon <> FComponent do
begin
Result := ParentCompon.GetNameForVisible + '/' + Result;
ParentCompon := ParentCompon.GetParentComponent;
if ParentCompon = nil then
break;
end;
end;
end;
Procedure AddInternalConnections(aPath: boolean = false); // внутренние соединения в шкафу посредством патч-кордов
var i, j, k, l: integer;
PortList: TSCSInterfaces;
ChildCompon, PCord, JoinedCompon: TSCSComponent;
PatchCordList: TSCSComponents;
ConnectedPort1, ConnectedPort2: TSCSInterface;
CableConnected: boolean;
begin
PassedComponList.Clear;
PatchCordList := TSCSComponents.Create(false); // патчкорды
PortList := TSCSInterfaces.Create(false);
for i := 0 to CupBoardFolder.ComponentReferences.Count - 1 do
begin
ChildCompon := (CupBoardFolder.ComponentReferences[i]);
if ChildCompon.ComponentType.SysName <> ctsnPatchCord then // патч-корды исключаем
begin
for j := 0 to ChildCompon.Interfaces.Count - 1 do
begin
if ChildCompon.Interfaces[j].TypeI = itFunctional then
begin
if ChildCompon.Interfaces[j].IsPort = biTrue then
begin
ConnectedPort1 := nil;
ConnectedPort2 := nil;
if ChildCompon.Interfaces[j].IsBusy = biTrue then // порт занят
begin
if ChildCompon.Interfaces[j].ConnectedInterfaces[0].ComponentOwner.ComponentType.SysName = ctsnPatchCord then
begin
if PortList.indexof(ChildCompon.Interfaces[j]) = -1 then
begin
PCord := ChildCompon.Interfaces[j].ConnectedInterfaces[0].ComponentOwner; // патчкорд
ConnectedPort1 := ChildCompon.Interfaces[j]; // порт компоненты
inc(BusyPortsCount);
FmtPortReportDetail.Append;
if aPath then
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := ConnectedPort1.ComponentOwner.GetNameForVisible(true) + '/' + ConnectedPort1.GetNameForVisible
else
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := ConnectedPort1.GetNameForVisible;
FmtPortReportDetail.FieldbyName(fnConnected).AsString := PCord.GetNameForVisible;
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 0; //FmtPortReport.FieldValues[fnID];
PortNameIndex := PortNamesList.IndexOf(ConnectedPort1.Name);
if PortNameIndex <> -1 then
inc(BusyPortsByName[PortNameIndex]);
if ChildCompon.Interfaces[j].ConnectedInterfaces[0].InternalConnected.Count > 0 then
begin
if ChildCompon.Interfaces[j].ConnectedInterfaces[0].InternalConnected[0].ConnectedInterfaces.Count > 0 then
begin
if ChildCompon.Interfaces[j].ConnectedInterfaces[0].InternalConnected[0].ConnectedInterfaces[0].IsPort = bitrue then
begin
ConnectedPort2 := ChildCompon.Interfaces[j].ConnectedInterfaces[0].InternalConnected[0].ConnectedInterfaces[0];
if PortList.IndexOf(ConnectedPort2) = -1 then
begin
inc(BusyPortsCount);
PortList.Add(ConnectedPort2);
PortNameIndex := PortNamesList.IndexOf(ConnectedPort2.Name);
if PortNameIndex <> -1 then
inc(BusyPortsByName[PortNameIndex]);
if aPath then
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := ConnectedPort2.ComponentOwner.GetNameForVisible(true) + '/' + ConnectedPort2.GetNameForVisible
else
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := ConnectedPort2.GetNameForVisible;
end
else
ConnectedPort2 := nil;
end;
end;
end;
end;
end
else
begin
//// -- Tolik 17/11/2023 -- вот здесь если будет воткнут коннектор в порт, но кабеля в нем нет - считать порт свободным
///
if ChildCompon.Interfaces[j].ConnectedInterfaces[0].ComponentOwner.ComponentType.SysName = ctsnConnector then
begin
CableConnected := false;
for k := 0 to ChildCompon.Interfaces[j].ConnectedInterfaces[0].ComponentOwner.JoinedComponents.Count - 1 do
begin
if IsCableComponent(ChildCompon.Interfaces[j].ConnectedInterfaces[0].ComponentOwner.JoinedComponents[k]) then
begin
CableConnected := true;
break;
end;
end;
if not CableConnected then
begin
inc(FreePortsCount, ChildCompon.Interfaces[j].Kolvo);
PortNameIndex := PortNamesList.IndexOf(ChildCompon.Interfaces[j].Name);
if PortNameIndex <> -1 then
inc(FreePortsByName[PortNameIndex], ChildCompon.Interfaces[j].Kolvo);
end;
end;
end;
end
else
begin //порт свободен
FmtPortReportDetail.Last;
FmtPortReportDetail.Append;
if cbFullPortPath.Checked then
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := GetFullPortName(ChildCompon.Interfaces[j])
else
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := ChildCompon.GetNameForVisible + '/' + ChildCompon.Interfaces[j].GetNameForVisible;
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := '';
FmtPortReportDetail.FieldbyName(fnConnected).AsString := '';
if cbFreePortsDetail.Checked then
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 2
else
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 100;
inc(FreePortsCount, ChildCompon.Interfaces[j].Kolvo);
PortNameIndex := PortNamesList.IndexOf(ChildCompon.Interfaces[j].Name);
if PortNameIndex <> -1 then
inc(FreePortsByName[PortNameIndex], ChildCompon.Interfaces[j].Kolvo);
end;
end;
end;
end;
end;
end;
FmtPortReport.Append;
FmtPortReport.FieldByName(fnName).AsString := cRepMsg279;
FmtPortReport.Last;
FmtPortReport.Append;
FmtPortReport.FieldByName(fnName).AsString := cRepMsg280;
//Free ports info
FmtPortReport.Last;
FmtPortReport.Append;
FmtPortReport.FieldByName(fnName).AsString := cRepMsg281;
//GReportBusyPortsCount := inttostr(BusyPortsCount);
//GReportFreePortsCount := inttostr(FreePortsCount);
{
for i := 0 to CupBoardFolder.ComponentReferences.Count - 1 do
begin
ChildCompon := (CupBoardFolder.ComponentReferences[i]);
if ChildCompon.ComponentType.SysName = ctsnPatchCord then // патч-корды исключаем
begin
if PatchCordList.IndexOf(ChildCompon) = -1 then
PatchCordList.Add(ChildCompon);
end;
end;
}
{
if PatchCordList.Count > 0 then
begin
for i := 0 to CupBoardFolder.ComponentReferences.Count - 1 do
begin
ChildCompon := (CupBoardFolder.ComponentReferences[i]);
//1. Self to self (порты одной компоненты подключены между собой)
for j := 0 to PatchCordList.Count - 1 do
begin
PCord := PatchCordList[j];
if PCord.JoinedComponents.IndexOf(ChildCompon) <> -1 then
begin
ConnectedPort1 := nil;
ConnectedPort2 := nil;
end;
end;
//2. порты разных компонент подключены друг к другу
for j := 0 to PatchCordList.Count - 1 do
begin
end;
{
if ChildCompon.ComponentType.Name <> ctsnPatchCord then // патч-корды исключаем
begin
for j := 0 to ChildCompon.Interfaces.Count - 1 do
begin
if ChildCompon.Interfaces[j].TypeI = itFunctional then // только функциональные
begin
if ChildCompon.Interfaces[j].IsPort = biTrue then
begin
if ChildCompon.Interfaces[j].IsBusy = biTrue then //занятый порт
begin
PCord := nil;
for k := 0 to ChildCompon.Interfaces[j].ConnectedInterfaces.Count - 1 do
begin
if ChildCompon.Interfaces[j].ConnectedInterfaces[k].ComponentOwner.ComponentType.SysName = ctsnPatchCord then
begin
PCord := ChildCompon.Interfaces[j].ConnectedInterfaces[k].ComponentOwner;
JoinedCompon := nil;
for l := 0 to PCord.JoinedComponents.Count - 1 do
begin
if PCord.JoinedComponents[l].ID <> ChildCompon.ID then
begin
JoinedCompon := PCord.JoinedComponents[l];
break;
end;
end;
if JoinedCompon <> nil then
break;
end;
end;
if PCord <> nil then
begin
/////////////////////////////////////////////////////////////////////////////////////////////////////
end;
end;
end;
end;
end;
end;
}
{ end;
end;}
PatchCordList.Free;
PortList.Free;
end;
Procedure AddExternalConnections(aCompon: TSCSComponent);
var FirstCompon, LastCompon: TSCSComponent;
FirstPort, LastPort: TSCSInterface;
begin
FirstCompon := nil;
LastCompon := nil;
FirstPort := nil;
LastPort := nil;
aCompon.LoadWholeComponent(true);
aCompon.DefineFirstLast;
if aCompon.WholeComponent.Count > 1 then
begin
if ((aCompon.FirstConnectedConnCompon <> nil) and ((aCompon.FirstConnectedConnCompon = FComponent) or (FComponent.ChildReferences.IndexOf(aCompon.FirstConnectedConnCompon)<> -1))) then
begin
FirstCompon := aCompon.FirstCompon;
FirstPort := aCompon.FirstConnectedConnCompon.GetPortJoinedToLine(FirstCompon);
if aCompon.LastConnectedConnCompon <> nil then
begin
LastCompon := aCompon.LastCompon;
LastPort := aCompon.LastConnectedConnCompon.GetPortJoinedToLine(LastCompon);
//if LastPort.Name = '' then
// LastPort.LoadName;
end;
end
else
begin
if ((aCompon.LastConnectedConnCompon <> nil) and ((aCompon.LastConnectedConnCompon = FComponent) or (FComponent.ChildReferences.IndexOf(aCompon.LastConnectedConnCompon)<> -1))) then
begin
FirstCompon := aCompon.LastCompon;
FirstPort := aCompon.LastConnectedConnCompon.GetPortJoinedToLine(FirstCompon);
if aCompon.FirstConnectedConnCompon <> nil then
begin
LastCompon := aCompon.FirstCompon;
LastPort := aCompon.FirstConnectedConnCompon.GetPortJoinedToLine(LastCompon);
end;
end;
end;
//if FirstCompon <> nil then
if FirstPort <> nil then
begin
inc(BusyPortsCount);
PortNameIndex := PortNamesList.IndexOf(FirstPort.Name);
if PortNameIndex <> -1 then
inc(BusyPortsByName[PortNameIndex]);
FmtPortReportDetail.Append;
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := GetFullPortName(FirstPort);
{
if FirstCompon = aCompon.FirstCompon then
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := aCompon.FirstConnectedConnCompon.GetNameForVisible
else
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := aCompon.LastConnectedConnCompon.GetNameForVisible;
}
//if LastCompon <> nil then
if LastPort <> nil then
begin
if LastPort.ComponentOwner.ListId = FComponent.ListID then
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := GetFullPortName(LastPort)
else
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(LastPort.ComponentOwner.ListId).GetNameForVisible + '/' + GetFullPortName(LastPort);
{
if LastCompon = aCompon.FirstCompon then
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := aCompon.FirstConnectedConnCompon.GetNameForVisible
else
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := aCompon.LastConnectedConnCompon.GetNameForVisible;
}
end;
FmtPortReportDetail.FieldbyName(fnConnected).AsString := aCompon.GetNameForVisible;
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 1;
end
end
else
begin
end;
//external connections
{FmtPortReport.Append;
FtPortReport.FieldByName(fnName).AsString := cRepMsg281;}
//aCompon.LastCompon
end;
Procedure AddFreePortsInfo;
var i: integer;
ComponPort: TSCSInterface;
begin
for i := 0 to CupBoardFolder.ComponentReferences.Count - 1 do
begin
end;
end;
begin
try
GPortsCupBoard := '';
GReportBusyPortsCount := '';
GReportFreePortsCount := '';
CupBoardFolder := FComponent.GetFirstParentCatalog;
PortNamesList := TStringList.Create;
CollectPortNames(FComponent);
SetLength(FreeportsbyName, PortNamesList.Count);
SetLength(BusyPortsByName, PortNamesList.Count);
PortsCount := GetPortCount(FComponent, true);
FreePortsCount := GetPortsCountReadyToConnectByInterf(FComponent, 0, true);
BusyPortsCount := PortsCount - FreePortsCount;
if CupBoardFolder <> nil then // если удалось получить каталог шкафа
begin
GPortsCupBoard := FComponent.GetNameForVisible(false);
DisconnectDetailMemTable(FmtPortReportDetail);
ClearFieldsInMemTable(FmtPortReportDetail, nil);
ClearFieldsInMemTable(FmtPortReport, nil);
FmtPortReport.FieldDefs.Clear;
FmtPortReport.FieldDefs.Add(fnID, ftAutoInc);
FmtPortReport.FieldDefs.Add(fnName, ftString, 255);
FmtPortReportDetail.FieldDefs.Clear;
FmtPortReportDetail.FieldDefs.Add(fnID, ftAutoInc);
FmtPortReportDetail.FieldDefs.Add(fnPortNameFrom, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnConnected, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnPortNameTo, ftString, 255);
FmtPortReportDetail.FieldDefs.Add(fnIDMaster, ftInteger);
ConnectDetailMemTable(FdsrcPortReport, FmtPortReportDetail, fnID, fnIDMaster);
FmtPortReport.Active := true;
FmtPortReportDetail.Active := true;
PassedComponList := TSCSComponents.Create(false);
CollectPortNames(FComponent);
// подклюяенные порты
// внутренние подключения
//(тут просто смотрим подключения патч-кордами)
BusyPortsCount := 0;
FreePortsCount := 0;
AddInternalConnections(true);
// внешние подключения (если только через порт оборудования в шкафу, а не разводка панели, например...)
JoinedLinesList := GetConnectedLines;
if JoinedLinesList.Count > 0 then
begin
for i := 0 to JoinedLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedLinesList[i]);
JoinedLineCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(JoinedLine.ID);
if JoinedLineCatalog <> nil then
begin
for j := 0 to JoinedLineCatalog.ComponentReferences.Count - 1 do
begin
if IsCableComponent(JoinedLineCatalog.ComponentReferences[j]) then
begin
CableComponent := JoinedLineCatalog.ComponentReferences[j];
AddExternalConnections(CableComponent);
end;
end;
end;
end;
end
else
begin
end;
GReportBusyPortsCount := inttostr(BusyPortsCount);
GReportFreePortsCount := inttostr(FreePortsCount);
if cbGroupBusyPorts.Checked then
begin
FmtPortReport.Last;
FmtPortReport.Append;
FmtPortReport.FieldByName(fnName).AsString := cRepMsg285;
for i := 0 to PortNamesList.Count - 1 do
begin
if BusyPortsByName[i] <> 0 then
begin
FmtPortReportDetail.Append;
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := PortNamesList[i];
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := inttostr(BusyPortsByName[i]);
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 3;
end;
end;
end;
if cbGroupFreePorts.Checked then
begin
FmtPortReport.Last;
FmtPortReport.Append;
FmtPortReport.FieldByName(fnName).AsString := cRepMsg284;
for i := 0 to PortNamesList.Count - 1 do
begin
if FreePortsByName[i] <> 0 then
begin
FmtPortReportDetail.Append;
FmtPortReportDetail.FieldbyName(fnPortNameFrom).AsString := PortNamesList[i];
FmtPortReportDetail.FieldbyName(fnPortNameTo).AsString := inttostr(FreePortsByName[i]);
FmtPortReportDetail.FieldbyName(fnIDMaster).AsInteger := 4;
end;
end;
end;
JoinedLinesList.Free;
{JoinedLine: TOrthoLine;
CableComponent: TSCSComponent;}
//свободные порты
AddFreePortsInfo;
end;
PortNamesList.Free;
SetLength(FreeportsbyName, 0);
SetLength(BusyPortsByName, 0);
PassedComponList.Free;
if FmtPortReportDetail.RecordCount > 1 then
FmtPortReportDetail.SortOn(fnPortNameFrom,[]);
GFormMode := fmPortReport;
ShowPreparedReport(AParams);
except
on E: Exception do AddExceptionToLogExt(ClassName, 'ShowPortConnections', E.Message);
end;
end;
procedure TF_ResourceReport.ShowCrossConnection(AParams: TReportItemParams);
var
i, j: Integer;
ChildCompon: TSCSComponent;
InterfFrom, interfTo: TSCSInterface;
procedure LoadConnectionByInterf(aInterf: TSCSInterface; const aFldName, aFldPort: String);
var
Compon, ParentCompon: TSCSComponent;
FldName, FldPort: String;
NppFrom, NppTo: Integer;
begin
if aInterf.ConnectedInterfaces.Count > 0 then
begin
Compon := aInterf.ConnectedInterfaces[0].ComponentOwner;
ParentCompon := Compon.GetParentComponent;
FldName := Compon.GetNameForVisible;
if ParentCompon <> Compon.GetTopComponent then
FldName := ParentCompon.GetNameForVisible +'\'+ FldName;
FldPort := '';
if GetPortInfoByJoinedCompons(Compon, ChildCompon, NppFrom, NppTo) then
begin
if NppFrom = NppTo then
FldPort := IntToStr(NppFrom)
else
FldPort := IntToStr(NppFrom)+'-'+IntToStr(NppTo);
end;
FmtCrossConnection.FieldByName(aFldName).AsString := FldName;
FmtCrossConnection.FieldByName(aFldPort).AsString := FldPort;
end;
end;
begin
try
if FComponent <> nil then
begin
if FmtCrossConnection = nil then
begin
CreateMTWithDsrc(Self, FmtCrossConnection, FdsrcCrossConnection, 'FmtCrossConnection', 'FdsrcCrossConnection');
FmtCrossConnection.FieldDefs.Add(fnID, ftAutoInc);
FmtCrossConnection.FieldDefs.Add(fnNameFrom, ftMemo);
FmtCrossConnection.FieldDefs.Add(fnNppFrom, ftString, 255);
FmtCrossConnection.FieldDefs.Add(fnNameTo, ftMemo);
FmtCrossConnection.FieldDefs.Add(fnNppTo, ftString, 255);
FmtCrossConnection.FieldDefs.Add(fnName, ftString, 255);
FmtCrossConnection.FieldDefs.Add(fnMarkID, ftInteger);
end;
FmtCrossConnection.Active := false;
FmtCrossConnection.Active := true;
for i := 0 to FComponent.ChildReferences.Count - 1 do
begin
ChildCompon := FComponent.ChildReferences[i];
if ChildCompon.IsCrossComponent then
begin
InterfFrom := nil;
interfTo := nil;
for j := 0 to ChildCompon.Interfaces.Count - 1 do
begin
if InterfFrom = nil then
InterfFrom := ChildCompon.Interfaces[j]
else if interfTo = nil then
begin
interfTo := ChildCompon.Interfaces[j];
Break; //// BREAK ////
end;
end;
FmtCrossConnection.Append;
FmtCrossConnection.FieldByName(fnName).AsString := ChildCompon.GetNameForVisible;
FmtCrossConnection.FieldByName(fnMarkID).AsInteger := ChildCompon.MarkID;
if InterfFrom <> nil then
LoadConnectionByInterf(InterfFrom, fnNameFrom, fnNppFrom);
if InterfTo <> nil then
LoadConnectionByInterf(InterfTo, fnNameTo, fnNppTo);
FmtCrossConnection.Post;
end;
end;
FmtCrossConnection.SortOn(fnMarkID, []);
GFormMode := fmRCrossConnection;
ShowPreparedReport(AParams);
end;
except
on E: Exception do AddExceptionToLogExt(ClassName, 'ShowCrossConnection', E.Message);
end;
end;
function getnamemark(Figure: TFigure; SCSComponent: TSCSComponent): string;
var
ii: integer;
begin
result := '';
if Figure.ClassName = 'TConnectorObject' then
begin
if TConnectorObject(Figure).OutTextCaptions.Count > 0 then
begin
if TF_CAD(Figure.Owner.Owner).FShowObjectCaptionsType = st_Short then
begin
result := TConnectorObject(Figure).OutTextCaptions[0];
end
else
begin
for ii := 1 to TConnectorObject(Figure).OutTextCaptions.Count - 1 do
begin
if result <> '' then
result := result + #13#10;
result := result + TConnectorObject(Figure).OutTextCaptions[ii];
end;
end;
end
else
result := SCSComponent.NameMark;
end
else
result := SCSComponent.NameMark;
end;
// Tolik
Procedure TF_ResourceReport.IncPaketPrintCounter;
Var i: Integer;
Begin
if rbModePacketPrintToExcel.Checked then
begin
Inc(FReportCountPrinted);
if (FReportCountPrinted = FReportCountToPrint) then
begin
if FReportCountPrinted = FReportCountToPrint then
begin
//*** Догнать до 100
for i := TF_Main(GForm).F_ProgressExp.gTotal.Progress + 1 to TF_Main(GForm).F_ProgressExp.gTotal.MaxValue do
begin
TF_Main(GForm).F_ProgressExp.gTotal.Progress := i;
TF_Main(GForm).F_ProgressExp.gTotal.Refresh;
Sleep(100);
end;
if TF_Main(GForm).F_ProgressExp.cbOpen.Checked then
ShellExecute(Handle, nil, PChar(FPackgeDir), nil, nil, SW_SHOW);
end;
FReportCountPrinted := FReportCountToPrint;
TF_Main(GForm).F_ProgressExp.Close;
end;
end;
End;
//
Procedure TF_ResourceReport.ShowXLSXReport(aRep: TfrReport; aFileNAme: String);
begin
if ExportToXLSX then
U_ExpXlsX.ExportReportToXLSX(aFileName, aRep, true)
//U_ExpXlsX.ExportRepToXLSX(aRep, aFileName)
//U_ExpXlsX.ExportReportToXLSX(aFileName, aRep)
else
if ExportToDOCx then
//U_ExpXlsX.ExportRepToDocX(aRep, aFileName)
U_ExpXlsX.ExportReportToDocX(aFileName, aRep, true)
else
begin
aRep.PrepareReport;
aRep.ShowPreparedReport;
end;
// aRep.ShowReport;
end;
// Tolik 31/3/2020 --
Procedure TF_ResourceReport.SaveRopPagesVisibility(aRep: TfrReport);
var i: integer;
begin
if ReportPagesVisibilityList = nil then
ReportPagesVisibilityList := TIntList.Create
else
ReportPagesVisibilityList.Clear;
for i := 0 to aRep.Pages.Count - 1 do
begin
if aRep.Pages.Pages[i].Visible then
ReportPagesVisibilityList.Add(1)
else
ReportPagesVisibilityList.Add(0);
end;
end;
//
procedure TF_ResourceReport.ShowWACoordinatesReport(AFolder: TSCSCatalog; AList: TStringList);
Var i,ii,j,k : integer;
SCSCatalog: TSCSCatalog;
SCSComponent: TSCSComponent;
ObjectsList: TList;
CurrentWA: TConnectorObject;
FiguresList : Tlist;
SCSList: TSCSList;
WAList: TF_CAD;
TypeFound : boolean;
MapScale, Coordinata : double;
SCSobject, SCSObject1 : TSCSCatalog;
Figure : TFigure;
AParams :TReportItemParams;
ReportItemParams: TReportItemParams;
CurrReportShablons: TReportShablons;
TemplateType: Integer;
ReportFileName: String;
ReportFilePath: String;
IsTemplate: Boolean;
SCSDir: String;
ReportFile: String;
DocName: String;
frExport: TfrBasicExpFilter;
ProgressCaption: String;
ExtensionName: String;
F_Preview: TF_Preview;
ListArray : TSCSCatalogs;
ListCount : integer;
//Tolik 25/03/2020 --
PassedList: TRapList;
//
Begin
// Tolik 23/03/2017 --
ListArray := nil;
PassedList := TRapList.Create;
//
if (AFolder <> nil) and (AFolder.ItemType <> itProject) and (AFolder.ItemType <> itList) then
begin
AFolder := AFolder.GetListOwner;
end;
if (AFolder <> nil) and (AList.Count > 0) then
begin
MemTable_WACoordinates.Close;
MemTable_WACoordinates.Open;
// если стоим на листе
if AFolder.ItemType = itList then
begin
ListCount := 0;
for i:= 0 to AFolder.ChildCatalogReferences.Count - 1 do
begin
SCSObject := AFolder.ChildCatalogReferences[i];
for j := 0 to SCSObject.ComponentReferences.Count - 1 do
begin
SCSComponent := SCSObject.ComponentReferences[j];
// Tolik 25/03/2020 -- Исключить дубли (могут быть, если есть кабинеты на листе)
if PassedList.IndexOf(SCSComponent) = -1 then
PassedList.Add(SCSComponent)
else
Continue;
//
TypeFound := False;
if SCScomponent.IsTop then
begin
for k := 0 to AList.Count - 1 do
begin
if SCSComponent.ComponentType.NamePlural = AList[k] then
begin
TypeFound := true;
break;
end;
end;
end;
// добавляем в таблицу
if TypeFound then
begin
SCSObject1 := SCSComponent.GetFirstParentCatalog; // верхний объект компонента(каталог) будет иметь отображение на Каде
WAList := GetListByID(SCSObject1.GetListOwner.SCSID); // получаем КАД объекта
if WAList <> nil then
begin
ListCount := ListCount + 1;
MemTable_WACoordinates.Edit;
MemTable_WACoordinates.Append;
MemTable_WACoordinates.FieldByName('Name_List').AsString := AFolder.GetNameForVisible(false); // наименоние листа
MemTable_WACoordinates.FieldByName('Name').AsString := SCSComponent.GetNameForVisible(false); // наименование компонента
Figure := GetFigureByID(WALIST,SCSObject1.SCSID); // объект на каде - фигура
MemTable_WACoordinates.FieldByName('NameMark').AsString := GetNameMark(Figure, SCSComponent);
MapScale := WAList.PCad.MapScale; // масштаб сетки Када
Coordinata := Figure.ActualPoints[1].x * Mapscale / 1000; // Х - координата
MemTable_WACoordinates.FieldByName('X').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
Coordinata := Figure.ActualPoints[1].y * Mapscale / 1000; // Y - координата
MemTable_WACoordinates.FieldByName('Y').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
Coordinata := TConnectorObject(Figure).ActualZOrder[1]; // Y - координата
MemTable_WACoordinates.FieldByName('Z').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
end;
end;
end;
end;
end
else // Tolik 25/03/2020 --
// если стоим на проекте
if AFolder.ItemType = itProject then
begin
ListArray := TSCSCatalogs.Create(false);
ListCount := 0;
// определяем листы
for i := 0 to AFolder.ChildCatalogReferences.Count - 1 do
begin
if AFolder.ChildCatalogReferences[i].ItemType = itList then
begin
if GetListByID(AFolder.ChildCatalogReferences[i].GetListOwner.SCSID) <> nil then
begin
ListArray.Add(AFolder.ChildCatalogReferences[i]);
ListCount := ListCount + 1;
end;
end;
end;
// если есть листы на проекте c открытыми кадами
if ListCount > 0 then
begin
// проходим по всем листам
for i := 0 to ListArray.Count - 1 do
begin
SCSCatalog := Listarray[i];
for j := 0 to SCSCatalog.ComponentReferences.Count -1 do
begin
TypeFound := false;
SCSComponent := SCSCatalog.ComponentReferences[j];
// Tolik 25/03/2020 --
if PassedList.IndexOf(SCSComponent) = -1 then
PassedList.Add(SCSComponent)
else
Continue;
//
if SCSComponent.IsTop then
begin
for k := 0 to AList.Count -1 do
begin
if SCSComponent.ComponentType.NamePlural = AList[k] then
begin
TypeFound := true;
break;
end;
end;
end;
if TypeFound then
begin
MemTable_WACoordinates.Edit;
MemTable_WACoordinates.Append;
MemTable_WACoordinates.FieldByName('Name_List').AsString := SCSCatalog.GetNameForVisible(false); // наименоние листа
MemTable_WACoordinates.FieldByName('Name').AsString := SCSComponent.GetNameForVisible(false); // наименование компонента
SCSObject := SCSComponent.GetFirstParentCatalog; // верхний объект компонента(каталог) будет иметь отображение на Каде
WAList := GetListByID(SCSObject.GetListOwner.SCSID); // получаем КАД объекта
Figure := GetFigureByID(WALIST,SCSObject.SCSID); // объект на каде - фигура
MemTable_WACoordinates.FieldByName('NameMark').AsString := GetNameMark(Figure, SCSComponent);
MapScale := WAList.PCad.MapScale; // масштаб сетки Када
Coordinata := Figure.ActualPoints[1].x * Mapscale / 1000; // Х - координата
MemTable_WACoordinates.FieldByName('X').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
Coordinata := Figure.ActualPoints[1].y * Mapscale / 1000; // Y - координата
MemTable_WACoordinates.FieldByName('Y').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
Coordinata := TConnectorObject(Figure).ActualZOrder[1]; // Z - координата
MemTable_WACoordinates.FieldByName('Z').AsString := FormatFloat('0.00',MetreToUOM(Coordinata));
end;
end;
end;
end;
end;
end;
if ListCount > 0 then
begin
GFormMode := fmWACoordinates;
ReportFileName := '';
ReportFilePath := '';
//*** Определить шаблон отчета
ReportItemParams := nil;
//if tvReports.Selected <> nil then
// ReportItemParams := TReportItemParams(tvReports.Selected.Data);
ReportItemParams := AParams;
IsTemplate := false;
if ReportItemParams <> nil then
begin
//*** Опреелить текущий тип шаблона
TemplateType := ttSimple;
if cbReportWithStamp.Enabled and cbReportWithStamp.Checked then
TemplateType := ttStamp;
//*** Определить параметры текщего шаблона
CurrReportShablons := ReportItemParams.GetShablonsByTemplateType(TemplateType);
//*** Если шаблон не стандартный, то извлеч его в файл
if (CurrReportShablons <> nil) and (CurrReportShablons.FActiveShablonID > 0) then
begin
IsTemplate := true;
ReportFileName := GetReportFileNameByType(ReportItemParams.RepType, TemplateType, false);
//showmessage(ReportFileName);
if ReportFileName <> '' then
ReportFilePath := GetPathToUserReportFile(ReportFileName);
if ReportFilePath <> '' then
begin
if FileExists(ReportFilePath) then
if Not DeleteFile(ReportFilePath) then
ReportFilePath := GetNoExistsFileNameForCopy(ReportFilePath);
if ReportFilePath <> '' then
TF_Main(GForm).DM.SaveUserReportByIDToFile(CurrReportShablons.FActiveShablonID, ReportFilePath);
end;
end;
end;
if FormList = nil then
formList := TObjectList.Create(false);
FCatalog := AFolder;
{$if Defined(ES_GRAPH_SC)}
SCSDir := ExeDir + '\';
{$else}
SCSDir := ExtractFilePath(paramstr(0));
{$ifend}
ReportFile := 'RWACoordinates.frf';//GetReportFileNameByType(AParams.RepType, GetTemplateTypeByCurrOptions, false);
ReportFile := SCSDir + dnReports + '\'+ReportFile;
{if FileExists(ReportFile) then
frDBDataSet_Detail.DataSource := nil;}
if FileExists(ReportFile) then
begin
Application.ProcessMessages;
FMasterOldRecNo := 0;
FDetailOldRecNo := 0;
FOldRecNo := 0;
FCurrRecNo := 0;
FPassNum := 1;
FModifiedReportTemplate := false;
DocName := cResourceReport_Msg1_29;
//DocName := ApplicationName + ' - ['+lvReports.Selected.Caption+']';
// frDBDataSet_Master.DataSource := dsrcReport;
// frDBDataSet_MasterFirst.DataSource := dsrcReportFirst;
frDBDataSet_Master.DataSource := DataSource_MT_WACoordinates;
Report.Title := DocName;
Report.LoadFromFile(ReportFile);
F_Preview := TF_Preview.Create(Application, GForm);
F_Preview.frPreview1.LoadFile(ReportFile);
// i := FormList.Add(F_Preview);
Report.Preview := F_Preview.frPreview1;
Report.ShowReport;
F_Preview.Caption := ConcatStrWithDefis(DocName, cResourceReport_Msg4 + IntToStr(i+1), 1);
// F_Preview.OnClose := {F_FR.}FormMdiClose;
F_Preview.ReportFileName := {F_FR.}Report.FileName;
F_Preview.ReportCaption := DocName;
if Assigned(F_Preview.frPreview1.OnMouseDown) then
EmptyProcedure;
F_Preview.Show;
end;
end;
// Tolik 21/03/2017 --
if ListArray <> nil then
ListArray.Free;
//
PassedList.Free; // Tolik 25/03/2020 --
End;
procedure TF_ResourceReport.ShowCablePathsWizard(ACable: TSCSComponent);
begin
//GFormMode := fmRCablePaths;
//ShowPreparedReport(AParams);
FComponent := ACable;
// Tolik 08/02/2018 --
if (not (FComponent.IDNetType in [3,5,7])) then
isCompCable := True
else
isCompCable := False;
//
FCatalog := ACable.GetFirstParentCatalog;
ShowWizard([rkCablePath], true);
end;
//Tolik 07/09/2023 --
Procedure TF_ResourceReport.ShowPortWizard(aCupBoard: TSCSComponent);
begin
FComponent := aCupBoard;
FCatalog := aCupBoard.GetFirstParentCatalog;
ShowWizard([rkPortReport], true);
end;
//
procedure TF_ResourceReport.ShowCrossConnectionWizard(ACompon: TSCSComponent);
begin
FComponent := ACompon;
FCatalog := ACompon.GetFirstParentCatalog;
ShowWizard([rkCrossConnection], true);
end;
procedure TF_ResourceReport.ToolButton1Click(Sender: TObject);
begin
//if SaveDialog.Execute then
// RichEdit_Report.Lines.SaveToFile(SaveDialog.FileName);
end;
procedure TF_ResourceReport.ToolButton_PrintClick(Sender: TObject);
begin
//If PrintDialog.Execute then
// RichEdit_Report.Print(RichEdit_Report.Lines.Text);
end;
// ##### Вместо 0 макс. длины отображать "нет" #####
procedure TF_ResourceReport.GT_RCableMaxLengthGetDisplayText(
Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
var AText: String);
begin
if AText = '0' then
AText := '';
end;
procedure TF_ResourceReport.ReportBeginPage(pgNo: Integer);
var
HeaderBand: TfrBandView;
FooterBand: TfrBandView;
ChildBand: TfrBandView;
Stream: TStream;
begin
//Report.Pages[1].
Exit;
FooterBand := TfrBandView(Report.FindObject('PageFooter')); //TfrBandView(Report.FindObject('PageFooter'));
if FooterBand <> nil then
begin
ChildBand := nil;
if pgNo = 0 then
ChildBand := TfrBandView(Report.FindObject('pfFirst'))
else
if pgNo > 0 then
ChildBand := TfrBandView(Report.FindObject('pfSecond'));
if ChildBand <> nil then
begin
FooterBand.Assign(ChildBand);
{Stream := TMemoryStream.Create;
try
Stream.Position := 0;
ChildBand.SaveToStream(Stream);
Stream.Position := 0;
FooterBand.LoadFromStream(Stream);
finally
FreeAndNil(Stream);
end;}
//FooterBand.ChildBand := ChildBand.Name;
//FooterBand.Master := ChildBand.Name;
end;
end;
end;
procedure TF_ResourceReport._tvReportTargetGetSelectedIndex(Sender: TObject;
Node: TTreeNode);
begin
Node.SelectedIndex := Node.ImageIndex;
end;
procedure TF_ResourceReport.Act_ShowWizardReportExecute(Sender: TObject);
var
ReportItemParams: TReportItemParams;
SCSCatalog: TSCSCatalog;
strMessg: String;
{CanHaveActiveComponents: Boolean;
CanHaveZeroPriceComponents: Boolean;
CanHaveDismountAccount: Boolean;
ComponsWithZeroPrice: Boolean;
FormMode: TResourceReportFormMode;
FullPathInCableJournal: Boolean; }
i: Integer;
CanPrintReport: Boolean;
CheckedObjectCount: Integer;
CheckedReportCount: Integer;
NodeTarget: TFlyNode;
//NodeReport: TFlyNode;
ListOfAllCADID: TIntList;
ListOfCADID: TIntList;
CurrDateTime: TDateTime;
SaveDialog: TSaveDialog;
DirDialogCaption: String;
DefDirName: String;
//Tolik
Node: TTreeNode;
NetTypeSelected: Boolean;
function GetCheckedObjectCount: Integer;
var
NodeTarget: TFlyNode;
begin
Result := 0;
NodeTarget := tvReportTarget.Items[0];
while NodeTarget <> nil do
begin
if NodeTarget.Cells[tciReport] = bsTrue then
Inc(Result);
NodeTarget := NodeTarget.GetNext;
end;
end;
function GetCheckedReportCount: Integer;
var
NodeReport: TFlyNode;
begin
Result := 0;
NodeReport := tvReports.Items[0];
while NodeReport <> nil do
begin
if Not NodeReport.Hidden then
if NodeReport.Cells[rciIsOn] = bsTrue then
Inc(Result);
NodeReport := NodeReport.GetNext;
end;
end;
procedure ShowReportInPackageMode;
var
NodeTarget: TFlyNode;
NodeReport: TFlyNode;
ReportItemParams: TReportItemParams;
begin
//*** Перебор объектов
if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
begin
NodeTarget := nil;
if tvReportTarget.Items.Count > 0 then
NodeTarget := tvReportTarget.Items[0];
while NodeTarget <> nil do
begin
if NodeTarget.Cells[tciReport] = bsTrue then
begin
FObjectName := '';
SCSCatalog := TSCSCatalog(NodeTarget.Data);
if SCSCatalog <> nil then
FObjectName := SCSCatalog.GetNameForVisible;
//*** Перебор отчетов
NodeReport := tvReports.Items[0];
while NodeReport <> nil do
begin
if Not NodeReport.Hidden then
if NodeReport.Cells[rciIsOn] = bsTrue then
begin
ReportItemParams := TReportItemParams(NodeReport.Data);
FReportCaption := NodeReport.Text;
ShowReportByParams(SCSCatalog, ReportItemParams);
if FReportCountPrinted = FReportCountToPrint then
Break; //// BREAK ////
end;
NodeReport := NodeReport.GetNext;
end;
end;
if FReportCountPrinted = FReportCountToPrint then
Break; //// BREAK ////
NodeTarget := NodeTarget.GetNext;
end;
end
else
if IsSimpleReportKind(FReportUseKind) then //24.02.2011 if rkCalc in FReportUseKind then
begin
FObjectName := '';
//*** Перебор отчетов
NodeReport := tvReports.Items[0];
while NodeReport <> nil do
begin
if Not NodeReport.Hidden then
if NodeReport.Cells[rciIsOn] = bsTrue then
begin
ReportItemParams := TReportItemParams(NodeReport.Data);
FReportCaption := NodeReport.Text;
ShowReportByParams(SCSCatalog, ReportItemParams);
if FReportCountPrinted = FReportCountToPrint then
Break; //// BREAK ////
end;
NodeReport := NodeReport.GetNext;
end;
end;
end;
begin
// Tolik
// выбраны ли все типы сетей для отображения в отчетах
AllNetTypes := True;
NetTypeSelected := True;
if NetTypeGuidList.Count > 0 then
begin
for i := 0 to NetTypeTree.Items.Count - 1 do
begin
Node := NetTypeTree.Items[i];
if Node.AbsoluteIndex <> 0 then
begin
if NetTypeTree.ItemState[Node.AbsoluteIndex] = csunChecked then
begin
AllNetTypes := False;
break;
end;
end;
end;
// Если не все типы сетей выбраны, смотрим, выбрано ли что-нибудь вообще
// заодно и список выбранных типов сетей построим (гуиды)
NetTypeGuidListSelected.Clear;
if not AllNetTypes then
begin
NetTypeSelected := False;
//NetTypeGuidListSelected.Clear;
for i := 0 to NetTypeTree.Items.Count - 1 do
begin
Node := NetTypeTree.Items[i];
if Node.AbsoluteIndex <> 0 then
begin
if NetTypeTree.ItemState[Node.AbsoluteIndex] = csChecked then
begin
NetTypeSelected := True;
NetTypeGuidListSelected.Add(NetTypeGuidList[i-1]); // потому что первый элемент - "все", его не считаем
end;
end;
end;
// Tolik -- 20/03/2017 --
NetTypeGuidListSelected.Add('');
//
end
else
//все выбрано - кидаем все
begin
for i := 0 to NetTypeGuidList.Count - 1 do
NetTypeGuidListSelected.Add(NetTypeGuidList[i]);
// Tolik -- 20/03/2017 --
NetTypeGuidListSelected.Add('');
//
end;
end
else
begin
if (NetTypeTree.Items.Count > 0) and (NetTypeTree.ItemState[0] <> csChecked) then
begin
ShowMessage(cRepMsg268);
Exit;
end
else
AllNetTypes := True;
end;
if NetTypeSelected then
begin
strMessg := '';
ReportItemParams := nil;
SCSCatalog := nil;
FObjectName := '';
FReportCaption := '';
if tvReports.Selected <> nil then
begin
ReportItemParams := TReportItemParams(tvReports.Selected.Data);
FReportCaption := tvReports.Selected.Text;
end
else
strMessg := cResourceReport_Msg7;
{begin
if Assigned(lvReports.Selected) then
begin
ptrReportItemParams := lvReports.Selected.Data;
FReportCaption := lvReports.Selected.Caption;
end
else
strMessg := cResourceReport_Msg7;
end;}
if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
begin
SCSCatalog := GetTargetFolder;
if SCSCatalog = nil then
strMessg := cResourceReport_Msg8;
//if Assigned(tvReportTarget.Selected) then
// SCSCatalog := TSCSCatalog(tvReportTarget.Selected.Data)
//else
// strMessg := cResourceReport_Msg8;
end;
if strMessg <> '' then
ShowMessageByType(Self.Handle, smtDisplay, strMessg, Application.Title, mb_OK or MB_ICONINFORMATION)
else
begin
//*** режим просмотра, или простой печати
if rbModeView.Checked or rbModePrint.Checked then
begin
//Если не определен шаблон для маркировочного листа
if (ReportItemParams.FSimpleShablons.FActiveShablonID = -1) and (rkMarkPages in FReportUseKind) then
begin
if MessageModal(cResourceReport_Msg30, ApplicationName, MB_ICONQUESTION or MB_YESNO) = IDYES then
MakeNewReportTemplateWizard;
end;
if (ReportItemParams.FSimpleShablons.FActiveShablonID <> -1) or (ReportItemParams.CanHaveTemplate = biFalse) then
begin
//*** определить тип устройства вывода - принтер - документ
if rbModeView.Checked then
FPrintDevice := pdScreen
else
if rbModePrint.Checked then
FPrintDevice := pdPrinter;
// Tolik -- 11/04/2017 --
if (SCSCatalog = nil) then
SCSCatalog := TSCSCatalog(F_ProjMan.GSCSBase.CurrProject.CurrList);
if SCSCatalog <> nil then
//
ShowReportByParams(SCSCatalog, ReportItemParams);
end;
end
else
//*** режим пакетной печати
if rbModePacketPrint.Checked then
begin
FPrintDevice := pdPrinter;
CanPrintReport := true;
//*** Определить печатаемые листы
ListOfAllCADID := TIntList.Create;
ListOfCADID := TIntList.Create;
if rkProject in FReportUseKind then
begin
NodeTarget := tvReportTarget.Items[0];
while NodeTarget <> nil do
begin
SCSCatalog := TSCSCatalog(NodeTarget.Data);
if SCSCatalog is TSCSList then
begin
ListOfAllCADID.Add(TSCSList(SCSCatalog).SCSID);
if NodeTarget.Cells[tciCAD] = bsTrue then
ListOfCADID.Add(TSCSList(SCSCatalog).SCSID);
end;
NodeTarget := NodeTarget.GetNext;
end;
end;
//*** определить количество объектов для печати
//CheckedObjectCount := 0;
//NodeTarget := tvReportTarget.Items[0];
//while NodeTarget <> nil do
//begin
// if NodeTarget.Cells[tciReport] = bsTrue then
// Inc(CheckedObjectCount);
// NodeTarget := NodeTarget.GetNext;
//end;
CheckedObjectCount := 0;
if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
CheckedObjectCount := GetCheckedObjectCount
else
if IsSimpleReportKind(FReportUseKind) then //24.02.2011 if rkCalc in FReportUseKind then
CheckedObjectCount := 1;
if CheckedObjectCount = 0 then
begin
CanPrintReport := false;
if ListOfCADID.Count = 0 then
MessageModal(cResourceReport_Msg18_1, ApplicationName, mb_OK or MB_ICONINFORMATION);
end;
//*** определить количество печатаемых отчетов
//CheckedReportCount := 0;
//NodeReport := tvReports.Items[0];
//while NodeReport <> nil do
//begin
// if NodeReport.Cells[rciIsOn] = bsTrue then
// Inc(CheckedReportCount);
// NodeReport := NodeReport.GetNext;
//end;
CheckedReportCount := GetCheckedReportCount;
if CheckedReportCount = 0 then
begin
CanPrintReport := false;
if ListOfCADID.Count = 0 then
MessageModal(cResourceReport_Msg18_2, ApplicationName, mb_OK or MB_ICONINFORMATION);
end;
//*** Печать листов
if rkProject in FReportUseKind then
PrintCADLists(ListOfAllCADID, ListOfCADID);
//*** Диалог печати отчетов
if CanPrintReport then
begin
if FFrPrintForm = nil then
FFrPrintForm := TfrPrintForm.Create(nil);
if GSCSIni.PM.RepDesignLanguageFile = fnRepDesignLangRus then
FFrPrintForm.Caption := cResourceReport_Msg19Rus
else
if GSCSIni.PM.RepDesignLanguageFile = fnRepDesignLangUkr then
FFrPrintForm.Caption := cResourceReport_Msg19Ukr;
FFrPrintForm.RB2.Enabled := False; // Current page
FFrPrintForm.RB3.Enabled := False; // Numbers:
FFrPrintForm.E2.Enabled := False; // Numbers:
FFrPrintForm.E1.Text := IntToStr(Report.DefaultCopies);
FFrPrintForm.CollateCB.Checked := Report.DefaultCollate;
if FFrPrintForm.ShowModal = mrOk then
begin
if CheckedObjectCount > 0 then
FReportCountToPrint := CheckedObjectCount * CheckedReportCount
else
FReportCountToPrint := CheckedReportCount;
FReportCountPrinted := 0;
ShowReportInPackageMode;
{//*** Перебор объектов
NodeTarget := tvReportTarget.Items[0];
while NodeTarget <> nil do
begin
if NodeTarget.Cells[tciReport] = bsTrue then
begin
SCSCatalog := TSCSCatalog(NodeTarget.Data);
//*** Перебор отчетов
NodeReport := tvReports.Items[0];
while NodeReport <> nil do
begin
if NodeReport.Cells[rciIsOn] = bsTrue then
begin
ReportItemParams := TReportItemParams(NodeReport.Data);
ShowReportByParams(SCSCatalog, ReportItemParams);
end;
NodeReport := NodeReport.GetNext;
end;
end;
NodeTarget := NodeTarget.GetNext;
end; }
end;
FreeAndNil(FFrPrintForm);
end;
FreeAndNil(ListOfAllCADID);
FreeAndNil(ListOfCADID);
end
else
if rbModePacketPrintToExcel.Checked then
begin
FPrintDevice := pdExcel;
DirDialogCaption := cResourceReport_Msg26;
DefDirName := cResourceReport_Msg27;
if rbPackExportPdf.Checked then
begin
FPrintDevice := pdPdf;
DirDialogCaption := cResourceReport_Msg40;
DefDirName := cResourceReport_Msg41;
end
// Tolik 12/03/2020
else
if rbPackExportExcel2007.Checked then
begin
FPrintDevice := pdExcel2007;
DirDialogCaption := cResourceReport_Msg26;
DefDirName := cResourceReport_Msg27;
end
else
if rbPackExportWord2007.Checked then
begin
FPrintDevice := pdWord2007;
DirDialogCaption := cResourceReport_Msg26_1;
DefDirName := cResourceReport_Msg28;
end;
CanPrintReport := true;
if (rkProject in FReportUseKind) or (rkMarkPages in FReportUseKind) then
begin
//*** определить количество объектов для печати
CheckedObjectCount := GetCheckedObjectCount;
if CheckedObjectCount = 0 then
begin
CanPrintReport := false;
MessageModal(cResourceReport_Msg18_1, ApplicationName, mb_OK or MB_ICONINFORMATION);
end;
end;
//*** определить количество печатаемых отчетов
CheckedReportCount := GetCheckedReportCount;
if CheckedReportCount = 0 then
begin
CanPrintReport := false;
MessageModal(cResourceReport_Msg18_2, ApplicationName, mb_OK or MB_ICONINFORMATION);
end;
if CanPrintReport then
begin
CurrDateTime := Now;
//FPackgeDir := BrowseDialog('Создание папки для Excel отчетов...'); //'c:\temp\SCSReports\';
FPackgeDir := TF_Main(GForm).BrowseNewDirName(DirDialogCaption,
ExtractDirToNewReport(CurrDateTime),
FileNameCorrect(DefDirName+' '+DateTimeToStr(CurrDateTime)));
if FPackgeDir <> '' then
FPackgeDir := FPackgeDir + '\';
if FPackgeDir <> '' then
begin
if Not DirectoryExists(FPackgeDir) then
if Not CreateDir(FPackgeDir) then
begin
MessageModal(cResourceReport_Msg20 + FPackgeDir, ApplicationName, MB_ICONINFORMATION or MB_OK);
Exit; ///// EXIT /////
end;
if DirectoryExists(FPackgeDir) then
begin
if CheckedObjectCount > 0 then
FReportCountToPrint := CheckedObjectCount * CheckedReportCount
else
FReportCountToPrint := CheckedReportCount;
FReportCountPrinted := 0;
//*** Заблокировать BeginProgress
Inc(GIsProgressCount);
try
ShowReportInPackageMode;
finally
//*** Разрешить BeginProgress
Dec(GIsProgressCount);
end;
end;
end;
end;
end;
end;
end
else
ShowMessage(cRepMsg268);
end;
procedure TF_ResourceReport.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//Application.OnRestore := FSavedOnAppRestore;
//Application.OnMinimize := FSavedOnAppMinimize;
//FormList.Clear;
end;
procedure TF_ResourceReport.gbViewCloseResize(Sender: TObject);
begin
SetMiddleControlChilds(TControl(Sender), TControl(Self));
end;
procedure TF_ResourceReport.cbCanHaveActiveComponentsClick(
Sender: TObject);
//var
// ptrReportItemParams: PReportItemParams;
begin
//if lvReports.Selected <> nil then
//begin
// ptrReportItemParams := lvReports.Selected.Data;
// if ptrReportItemParams^.CanHaveActiveComponents <> biNone then
// if cbCanHaveActiveComponents.Checked then
// ptrReportItemParams^.CanHaveActiveComponents := biTrue
// else
// ptrReportItemParams^.CanHaveActiveComponents := biFalse;
//end;
end;
// Tolik 30/10/2020 --
procedure TF_ResourceReport.cbCanHaveSupplyValueClick(Sender: TObject);
begin
{
if tvReports.Selected <> nil then
if ((TReportItemParams(tvReports.Selected.data).RepType = rtCommerceInvoice) or
(TReportItemParams(tvReports.Selected.data).RepType = rtSpecification) or
(TReportItemParams(tvReports.Selected.data).RepType = rtGOSTSpecification) or
(TReportItemParams(tvReports.Selected.data).RepType = rtResources) or
(TReportItemParams(tvReports.Selected.data).RepType = rtCableJournal) or
(TReportItemParams(tvReports.Selected.data).RepType = rtCable)) then
rgCableRate.Visible := (cbCanHaveSupplyValue.Checked = true);
}
end;
//
procedure TF_ResourceReport.cbCanHaveZeroPriceComponentsClick(
Sender: TObject);
//var
// ptrReportItemParams: PReportItemParams;
begin
//if lvReports.Selected <> nil then
//begin
// ptrReportItemParams := lvReports.Selected.Data;
// if ptrReportItemParams^.CanHaveZeroPriceComponents <> biNone then
// if cbCanHaveZeroPriceComponents.Checked then
// ptrReportItemParams^.CanHaveZeroPriceComponents := biTrue
// else
// ptrReportItemParams^.CanHaveZeroPriceComponents := biFalse;
//end;
end;
procedure TF_ResourceReport.lbOtherPropertiesClick(Sender: TObject);
begin
ChoiceBaseOptions(stiReportDesigner);
end;
procedure TF_ResourceReport.lbOtherPropertiesMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
TRzLabel(Sender).Font.Style := TRzLabel(Sender).Font.Style + [fsUnderline];
end;
procedure TF_ResourceReport.lbOtherPropertiesMouseLeave(Sender: TObject);
begin
TRzLabel(Sender).Font.Style := TRzLabel(Sender).Font.Style - [fsUnderline];
end;
procedure TF_ResourceReport.tvReportsCloseUp(Sender: TISPlugInplaceEdit;
Section: TISPlugSection; DropDown: TISDropDown; var Accept: Boolean);
var
NewShablonNode: TFlyNode;
NodeIndex: Integer;
ReportItemParams: TReportItemParams;
ReportShablons: TReportShablons;
ActualColumn: Integer;
begin
//TPopupTree(DropDown.ContainedControl).Selected
//tvReports.Col
//tvReports.Columns.VisibleColumn[tvReports.Col].Index
ActualColumn := tvReports.Columns.VisibleColumn[tvReports.Col].Index;
NewShablonNode := nil;
//*** Определить выбранную ветвь колонки
if TPopupTree(DropDown.ContainedControl).Selected <> nil then
begin
NodeIndex := TPopupTree(DropDown.ContainedControl).Selected.Index;
if (NodeIndex <> -1) and
(NodeIndex <= tvReports.Columns[ActualColumn].EditorStyle.Sections[0].Items.Count - 1) then
NewShablonNode := tvReports.Columns[ActualColumn].EditorStyle.Sections[0].Items[NodeIndex];
end;
if NewShablonNode <> nil then
begin
//*** Определить используемый шаблон
ReportItemParams := tvReports.Selected.Data;
ReportShablons := nil;
if ReportItemParams <> nil then
ReportShablons := ReportItemParams.GetShablonsByTemplateType(GetTemplateTypeByColumnIndex(ActualColumn));
if (ReportShablons <> nil) and
(Integer(NewShablonNode.Data) <> ReportShablons.FActiveShablonID) and // Выбран другой
(ReportShablons.FRepShablons.IndexOfObject(TObject(NewShablonNode.Data)) <> -1) // Выбран есть в списке
then
begin
//*** Сбросить старый
if ReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, ReportShablons.FActiveShablonID, biFalse, qmPhisical);
//*** Внести новый
ReportShablons.FActiveShablonID := Integer(NewShablonNode.Data);
if ReportShablons.FActiveShablonID > 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, ReportShablons.FActiveShablonID, biTrue, qmPhisical);
DefineReportNodeControls(tvReports.Selected, true);
end;
end;
{
NewShablonNode := nil;
//*** Определить выбранную ветвь колонки
if TPopupTree(DropDown.ContainedControl).Selected <> nil then
begin
NodeIndex := TPopupTree(DropDown.ContainedControl).Selected.Index;
if (NodeIndex <> -1) and
(NodeIndex <= tvReports.Columns[tvReports.Col].EditorStyle.Sections[0].Items.Count - 1) then
NewShablonNode := tvReports.Columns[tvReports.Col].EditorStyle.Sections[0].Items[NodeIndex];
end;
if NewShablonNode <> nil then
begin
//*** Определить используемый шаблон
ReportItemParams := tvReports.Selected.Data;
ReportShablons := nil;
if ReportItemParams <> nil then
ReportShablons := ReportItemParams.GetShablonsByTemplateType(GetTemplateTypeByColumnIndex(tvReports.Col));
if (ReportShablons <> nil) and
(Integer(NewShablonNode.Data) <> ReportShablons.FActiveShablonID) and // Выбран другой
(ReportShablons.FRepShablons.IndexOfObject(TObject(NewShablonNode.Data)) <> -1) // Выбран есть в списке
then
begin
//*** Сбросить старый
if ReportShablons.FActiveShablonID <> 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, ReportShablons.FActiveShablonID, biFalse, qmPhisical);
//*** Внести новый
ReportShablons.FActiveShablonID := Integer(NewShablonNode.Data);
if ReportShablons.FActiveShablonID <> 0 then
TF_Main(GForm).DM.UpdateIntTableFieldByID(tnUserReports, fnUseAsShablon, ReportShablons.FActiveShablonID, biTrue, qmPhisical);
DefineReportNodeControls(tvReports.Selected);
end;
end; }
end;
procedure TF_ResourceReport.tvReportsSelectedChanged(OldNode,
NewNode: TFlyNode);
begin
if OldNode <> NewNode then
DefineReportNodeControls(NewNode, true);
end;
procedure TF_ResourceReport.tvReportsDblClick(Sender: TObject);
begin
if tvReports.Selected <> nil then
if Not rbModePacketPrint.Checked then
// Если отчет запустить в средине этого обработчика (не по таймеру)
// то после клика по отчету, стает активной эта форма
Timer_ShowReport.Enabled := true; //Act_ShowWizardReport.Execute;
end;
procedure TF_ResourceReport.tvReportsDrawCell(Sender: TObject;
aCanvas: TCanvas; ACol, ARow: Integer; Rect: TRect;
State: TExGridDrawState);
var
Node: TFlyNode;
ReportItemParams: TReportItemParams;
ActualColumn: Integer;
begin
ActualColumn := tvReports.Columns.VisibleColumn[ACol].Index;
//if ActualColumn = rciStamp then
// begin
// Node := tvReports.GetNodeAtRow(ARow);
// ReportItemParams := nil;
// if Node <> nil then
// ReportItemParams := TReportItemParams(Node.Data);
// if ReportItemParams <> nil then
// if ReportItemParams.CanHaveStamp <> biTrue then
// begin
// aCanvas.Brush.Color := clDisabledCell; //$F3F3F3; //clSkyBlue;
// aCanvas.FillRect(Rect);
// aCanvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, Node.Cells[ActualColumn]);
// //SetBkColor(aCanvas.Handle, clSilver);
// end;
// end;
if (ActualColumn = rciSimple) or (ActualColumn = rciStamp) then
begin
Node := tvReports.GetNodeAtRow(ARow);
ReportItemParams := nil;
if Node <> nil then
ReportItemParams := TReportItemParams(Node.Data);
if ReportItemParams <> nil then
if (ReportItemParams.CanHaveTemplate = biFalse) or ((ActualColumn = rciStamp) and (ReportItemParams.CanHaveStamp <> biTrue)) then
begin
aCanvas.Brush.Color := clDisabledCell; //$F3F3F3; //clSkyBlue;
aCanvas.FillRect(Rect);
aCanvas.TextRect(Rect, Rect.Left + 1, Rect.Top + 1, Node.Cells[ActualColumn]);
end;
end;
end;
procedure TF_ResourceReport.Act_NewSimpleTemplateFromStandartExecute(
Sender: TObject);
begin
MakeEditReportTemplate(meMake, true, ttSimple);
end;
procedure TF_ResourceReport.Act_NewStampTemplateFromStandartExecute(
Sender: TObject);
begin
MakeEditReportTemplate(meMake, true, ttStamp);
end;
procedure TF_ResourceReport.Act_NewSimpleTemplateFromUserExecute(
Sender: TObject);
begin
MakeEditReportTemplate(meMake, false, ttSimple);
end;
procedure TF_ResourceReport.Act_NewStampTemplateFromUserExecute(
Sender: TObject);
begin
MakeEditReportTemplate(meMake, false, ttStamp);
end;
procedure TF_ResourceReport.Act_EditSimpleTemplateExecute(Sender: TObject);
begin
MakeEditReportTemplate(meEdit, false, ttSimple);
end;
procedure TF_ResourceReport.Act_EditStampTemplateExecute(Sender: TObject);
begin
MakeEditReportTemplate(meEdit, false, ttStamp);
end;
procedure TF_ResourceReport.Act_DeleteSimpleTemplateExecute(
Sender: TObject);
begin
DelReportTemplate(tvReports.Selected, ttSimple);
end;
procedure TF_ResourceReport.Act_DeleteStampTemplateExecute(
Sender: TObject);
begin
DelReportTemplate(tvReports.Selected, ttStamp);
end;
procedure TF_ResourceReport.Act_DropAllExecute(Sender: TObject);
begin
//
end;
procedure TF_ResourceReport.RepDesignerShow(Sender: TObject);
begin
//
end;
procedure TF_ResourceReport.RepDesignerSaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if Report.Modified then
if MessageModal(cResourceReport_Msg15, ApplicationName, MB_ICONQUESTION or MB_YESNO) = IDYES then
begin
Report.SaveToFile(ReportName);
FModifiedReportTemplate := true;
end
else
begin
FModifiedReportTemplate := false;
Saved := false;
end;
end;
procedure TF_ResourceReport.tvReportsPrepareDropDown(
Sender: TISPlugInplaceEdit; Section: TISPlugSection;
Dropdown: TISDropDown);
var
i: Integer;
CurrTextWidth: Integer;
MaxTextWidth: Integer;
NewWidth: Integer;
begin
//TPopupTree(Dropdown.ContainedControl).gett
MaxTextWidth := 0;
for i := 0 to Section.Items.Count - 1 do
begin
CurrTextWidth := Canvas.TextWidth(Section.Items[i].Text);
if MaxTextWidth < CurrTextWidth then
MaxTextWidth := CurrTextWidth;
end;
NewWidth := 0;
if MaxTextWidth > 0 then
NewWidth := MaxTextWidth + 40
else
NewWidth := tvReports.Columns[tvReports.Col].Width; //tvReports.Columns[tvReports.Col].Width * 2;
if NewWidth > Dropdown.ContainedControl.Width then
Dropdown.ContainedControl.Width := NewWidth;
end;
procedure TF_ResourceReport.btTemplateClick(Sender: TObject);
begin
TToolButton(Sender).CheckMenuDropdown;
end;
procedure TF_ResourceReport.btExportTemplateToFileClick(Sender: TObject);
begin
if btExportTemplateToFile.Style = ComCtrls.tbsDropDown then
TToolButton(Sender).CheckMenuDropdown
else
ExportTemplateToFile(ttSimple);
end;
procedure TF_ResourceReport.btEditTemplateClick(Sender: TObject);
begin
if btEditTemplate.Style = ComCtrls.tbsDropDown then
TToolButton(Sender).CheckMenuDropdown
else
MakeEditReportTemplate(meEdit, false, ttSimple);
end;
procedure TF_ResourceReport.btDelTemplateClick(Sender: TObject);
begin
if btDelTemplate.Style = ComCtrls.tbsDropDown then
TToolButton(Sender).CheckMenuDropdown
else
DelReportTemplate(tvReports.Selected, ttSimple);
end;
procedure TF_ResourceReport.rbModeViewClick(Sender: TObject);
begin
DefineReportModeControls;
if Sender = rbModePacketPrint then
btShowReport.Caption := rbModePrint.Caption
else
if Sender = rbModePacketPrintToExcel then
btShowReport.Caption := cNameExportB
else
btShowReport.Caption := TRzCheckBox(Sender).Caption;
end;
procedure TF_ResourceReport.tvReportTargetEdited(Sender: TObject;
Node: TFlyNode; var S: String);
var
ActualColumn: Integer;
begin
ActualColumn := tvReportTarget.GetColumnOrder(tvReportTarget.Col);
//*** опция какой колонки изменяется
if Node <> nil then
if Node.Data <> nil then
case ActualColumn of
tciCAD:
// для проекта не м.б печать КАДа
if TObject(Node.Data) is TSCSProject then
S := bsGray;
tciReport:
// Для нестандартного листа не м.б отчета
if TObject(Node.Data) is TSCSList then
if Not TSCSList(Node.Data).IsNormalType then
S := bsGray;
end;
end;
procedure TF_ResourceReport.tvReportsEdited(Sender: TObject;
Node: TFlyNode; var S: String);
var
ActualColumn: Integer;
WasChanged: Boolean;
i, CheckCounter, VisibleItemsCounter: Integer;
currReportItemParams: TReportItemParams;
aNode: TFlyNode;
begin
ActualColumn := TFlyTreeViewPro(Sender).GetColumnOrder(TFlyTreeViewPro(Sender).Col);
WasChanged := true;
if ActualColumn = rciIsOn then
begin
// Tolik
//if TReportItemParams(Node.Data).Mode = fmRDefectAct then
if (TReportItemParams(Node.Data).Mode = fmRDefectAct) or (TReportItemParams(Node.Data).Mode = fmCompoSpecification) then
begin
WasChanged := false;
S := bsFalse;
end;
if WasChanged then
Timer_DefineReportNodeControls.Enabled := true;
//Tolik
// выставить состояние переключателя (выбрать все) при пакетной печати / экспорте
CheckCounter := 0;
VisibleItemsCounter := 0;
for i := 0 to tvReports.Items.Count - 1 do
begin
aNode := tvReports.Items[i];
if aNode.Hidden = false then
Inc(VisibleItemsCounter);
end;
if VisibleItemsCounter > 2 then
begin
for i := 0 to tvReports.Items.Count - 1 do
begin
aNode := tvReports.Items[i];
if aNode <> Node then
begin
if aNode.Hidden = false then
begin
currReportItemParams := TReportItemParams(aNode.Data);
if ((currReportItemParams.RepType <> rtCompoSpecification) and (currReportItemParams.RepType <> rtDefectAct)) then
begin
if tvReports.Items[i].Cells[rciIsOn] = bsTrue then
Inc(CheckCounter);
end;
end;
end;
end;
currReportItemParams := TReportItemParams(Node.Data);
if (((currReportItemParams.RepType <> rtCompoSpecification) and (currReportItemParams.RepType <> rtDefectAct)) and
(Node.Cells[rciIsOn] = bsFalse)) then
Inc(CheckCounter);
if CheckCounter = (VisibleItemsCounter - 2) then
begin
CheckAllReports.OnClick := nil;
CheckAllReports.State := cbChecked;
CheckAllReports.OnClick := CheckAllReportsClick;
end
else
begin
CheckAllReports.OnClick := nil;
CheckAllReports.State := cbUnChecked;
CheckAllReports.OnClick := CheckAllReportsClick;
end;
end;
end;
end;
procedure TF_ResourceReport.Timer_DefineReportNodeControlsTimer(
Sender: TObject);
begin
Timer_DefineReportNodeControls.Enabled := false;
if tvReports.Selected.Cells[rciIsOn] = bsTrue then
begin
// Не дать установить галочку напротив отчета без шаблона для маркировочных листов
if rkMarkPages in FReportUseKind then
if (TReportItemParams(tvReports.Selected.Data).FSimpleShablons.FActiveShablonID = -1) then
begin
if MessageModal(cResourceReport_Msg30, ApplicationName, MB_ICONQUESTION or MB_YESNO) = IDYES then
MakeNewReportTemplateWizard;
if TReportItemParams(tvReports.Selected.Data).FSimpleShablons.FActiveShablonID = -1 then
tvReports.Selected.Cells[rciIsOn] := bsFalse;
end;
end;
DefineReportNodeControls(tvReports.Selected, false);
end;
procedure TF_ResourceReport.frOLEExcelExportStartExportPageEvent(Sender: TObject; ACaption: string; AObjCount: Integer);
begin
TF_Main(GForm).F_ProgressExp.Message1.Visible := False;
TF_Main(GForm).F_ProgressExp.esBitBtn1.Visible := True;
TF_Main(GForm).F_ProgressExp.Gauge1.Visible := True;
TF_Main(GForm).F_ProgressExp.Gauge1.MinValue := 0;
TF_Main(GForm).F_ProgressExp.Gauge1.MaxValue := AObjCount - 1;
TF_Main(GForm).F_ProgressExp.Gauge1.Progress := 0;
if FReportCountPrinted = 0 then
begin
TF_Main(GForm).F_ProgressExp.FormStyle := fsStayOnTop;
TF_Main(GForm).F_ProgressExp.lbProgress.Visible := true;
TF_Main(GForm).F_ProgressExp.lbTotalProgress.Visible := true;
TF_Main(GForm).F_ProgressExp.pnTotalProgress.Visible := true;
TF_Main(GForm).F_ProgressExp.AutoSize := false;
TF_Main(GForm).F_ProgressExp.AutoSize := true;
TF_Main(GForm).F_ProgressExp.cbOpen.Visible := true;
TF_Main(GForm).F_ProgressExp.cbOpen.Checked := true;
TF_Main(GForm).F_ProgressExp.cbOpen.Caption := ACaption; //cResourceReport_Msg21;
TF_Main(GForm).F_ProgressExp.gTotal.Visible := true;
TF_Main(GForm).F_ProgressExp.gTotal.MinValue := 1;
TF_Main(GForm).F_ProgressExp.gTotal.MaxValue := 100;
TF_Main(GForm).F_ProgressExp.gTotal.Progress := 0;
TF_Main(GForm).F_ProgressExp.WasCancel := false;
Application.ProcessMessages;
TF_Main(GForm).F_ProgressExp.FormStyle := fsStayOnTop;
TF_Main(GForm).F_ProgressExp.Show;
SetForegroundWindow(TF_Main(GForm).F_ProgressExp.Handle);
end;
TF_Main(GForm).F_ProgressExp.lbProgress.Caption := cNameReportB + ': '+FReportCaption;
TF_Main(GForm).F_ProgressExp.lbTotalProgress.Caption := cNameObjectB + ': '+FObjectName;
TF_Main(GForm).F_ProgressExp.Repaint;
//SetForegroundWindow(TF_Main(GForm).F_ProgressExp.Handle);
//Application.ProcessMessages;
end;
procedure TF_ResourceReport.frOLEExcelExportProgressExportPageEvent(Sender: TObject; var AWasCancel: Boolean;
AObjIndex, AObjectCount: Integer);
var
UnitCountInProgressStep: Integer; // Количество единиц для одного объекта
UnitCountLoadedForCurObject: Integer; // загруженность одного объекта
begin
if Not TF_Main(GForm).F_ProgressExp.WasCancel then
begin
Application.ProcessMessages;
TF_Main(GForm).F_ProgressExp.Gauge1.Progress := AObjIndex;
TF_Main(GForm).F_ProgressExp.Gauge1.Refresh;
//*** Количество шагов для одного объекта в общем прогрессе
UnitCountInProgressStep := Round(100 / FReportCountToPrint);
UnitCountLoadedForCurObject := Round((AObjIndex+1) / AObjectCount) * UnitCountInProgressStep;
TF_Main(GForm).F_ProgressExp.gTotal.Progress :=
(UnitCountInProgressStep * FReportCountPrinted) + UnitCountLoadedForCurObject - 2;
TF_Main(GForm).F_ProgressExp.gTotal.Refresh;
end;
AWasCancel := TF_Main(GForm).F_ProgressExp.WasCancel;
end;
procedure TF_ResourceReport.frOLEExcelExportEndExportPageEvent(Sender: TObject; AWasCancel: Boolean);
var
i: Integer;
begin
Inc(FReportCountPrinted);
if (FReportCountPrinted = FReportCountToPrint) or AWasCancel then
begin
if FReportCountPrinted = FReportCountToPrint then
begin
//*** Догнать до 100
for i := TF_Main(GForm).F_ProgressExp.gTotal.Progress + 1 to TF_Main(GForm).F_ProgressExp.gTotal.MaxValue do
begin
TF_Main(GForm).F_ProgressExp.gTotal.Progress := i;
TF_Main(GForm).F_ProgressExp.gTotal.Refresh;
// Tolik 29/07/2019 --
//Sleep(500);
Sleep(5);
//
end;
if TF_Main(GForm).F_ProgressExp.cbOpen.Checked then
ShellExecute(Handle, nil, PChar(FPackgeDir), nil, nil, SW_SHOW);
end;
if AWasCancel then
FReportCountPrinted := FReportCountToPrint;
TF_Main(GForm).F_ProgressExp.Close;
end;
end;
procedure TF_ResourceReport.rbRepModeDocumentClick(Sender: TObject);
begin
if tvReports.Selected <> nil then
DefineReportNodeControls(tvReports.Selected, true);
end;
procedure TF_ResourceReport.RzBitBtn1Click(Sender: TObject);
begin
MakeNewReportTemplateWizard;
end;
procedure TF_ResourceReport.Act_NewMarkPageExecute(Sender: TObject);
begin
MakeNewReportTemplateWizard;
end;
procedure TF_ResourceReport.Act_NewMarkPageFromUserExecute(
Sender: TObject);
begin
MakeEditReportTemplate(meMake, false, ttSimple);
end;
procedure TF_ResourceReport.Act_EditTemplateExecute(Sender: TObject);
begin
if rkMarkPages in FReportUseKind then
MakeEditReportTemplate(meEdit, false, ttSimple);
end;
procedure TF_ResourceReport.Act_DeleteTemplateExecute(Sender: TObject);
begin
if rkMarkPages in FReportUseKind then
DelReportTemplate(tvReports.Selected, ttSimple);
end;
procedure TF_ResourceReport.Act_ImportTemplateFromFileExecute(
Sender: TObject);
begin
ImportTemplateFromFile;
end;
procedure TF_ResourceReport.Act_ExportTemplateToFileExecute(Sender: TObject);
begin
ExportTemplateToFile(ttSimple);
end;
procedure TF_ResourceReport.Act_ExportSimpleTemplateToFileExecute(
Sender: TObject);
begin
ExportTemplateToFile(ttSimple);
end;
procedure TF_ResourceReport.Act_ExportStampTemplateToFileExecute(
Sender: TObject);
begin
ExportTemplateToFile(ttStamp);
end;
{ TSortFieldLists }
constructor TSortFieldLists.Create(AOwner: TReportSortInfo);
begin
FOwner := AOwner;
FFieldNames := TStringList.Create;
FFieldCaptCodes := TStringList.Create;
end;
destructor TSortFieldLists.Destroy;
begin
FreeAndNil(FFieldNames);
FreeAndNil(FFieldCaptCodes);
inherited;
end;
{ TReportSortInfo }
procedure TReportSortInfo.AddFieldInfo(const AFieldName, ACaption: String);
begin
FAllFieldNames.Add(AFieldName);
FAllFieldCaptions.Add(ACaption);
end;
procedure TReportSortInfo.Assign(AReportSortInfo: TReportSortInfo);
begin
FID := AReportSortInfo.FID;
FRepKind := AReportSortInfo.FRepKind;
FDescending := AReportSortInfo.FDescending;
FCaseSensitive := AReportSortInfo.FCaseSensitive;
FUsedFieldNames.Clear;
FUsedFieldNames.AddStrings(AReportSortInfo.FUsedFieldNames);
end;
constructor TReportSortInfo.Create(AOwner: TReportItemParams);
begin
FOwner := AOwner;
FAllFieldNames := TStringList.Create;
FAllFieldCaptions := TStringList.Create;
FUsedFieldNames := TStringList.Create;
FID := 0;
FRepKind := 0;
if AOwner <> nil then
FRepKind := AOwner.RepType;
FDescending := biFalse;
FCaseSensitive := biFalse;
end;
destructor TReportSortInfo.Destroy;
begin
FreeAndNil(FAllFieldNames);
FreeAndNil(FAllFieldCaptions);
FreeAndNil(FUsedFieldNames);
inherited;
end;
function TReportSortInfo.GetFieldCaption(const AFName: String): String;
var
StrIndex: Integer;
begin
Result := '';
StrIndex := FAllFieldNames.IndexOf(AFName);
if StrIndex <> -1 then
Result := FAllFieldCaptions[StrIndex];
end;
Procedure TReportSortInfo.ClearFields;
begin
if FAllFieldNames <> nil then
FAllFieldNames.Clear;
if FAllFieldCaptions <> nil then
FAllFieldCaptions.Clear;
if FUsedFieldNames <> nil then
FUsedFieldNames.Clear;
end;
procedure TF_ResourceReport.Act_EditReportSortInfoExecute(Sender: TObject);
var
ReportItemParams: TReportItemParams;
begin
ReportItemParams := nil;
if tvReports.Selected <> nil then
ReportItemParams := TReportItemParams(tvReports.Selected.Data);
if ReportItemParams <> nil then
begin
if TF_Main(GForm).CreateFItemsSelector.SelectReportSortFields(ReportItemParams.FReportSortInfo) then
TF_Main(GForm).DM.SaveReportSortInfo(ReportItemParams.FReportSortInfo);
end;
end;
procedure TF_ResourceReport.tvReportTargetCollapsing(Sender: TObject;
Node: TFlyNode; var AllowCollapse: Boolean);
begin
AllowCollapse := false;
end;
procedure TF_ResourceReport.Timer_ShowReportTimer(Sender: TObject);
begin
TTimer(Sender).Enabled := false;
Act_ShowWizardReport.Execute;
end;
procedure TF_ResourceReport.Act_ExportToBc3Execute(Sender: TObject);
var
RootObjectsCatalog: TSCSCatalog;
TargetFolder: TSCSCatalog;
ReportItemParams: TReportItemParams;
ReportItemParamValues: TReportItemParams;
StringList: TStringList;
Str: String;
ProjCurrency: TNBCurrency;
CurrencySign: String;
Dialog: TSaveDialog;
procedure AddCatalogInfoToStrings(ACatalog: TSCSCatalog);
var
CatalogChild: TSCSCatalog;
Compon: TSCSComponent;
TopSign: String;
CatalogName: String;
i: Integer;
begin
Str := '';
// Для 2-х верхних уровней, кроме самого верхнего(-1) добавляем символ '#'
TopSign := '';
CatalogName := '';
if (ACatalog.Level <= 1) and (ACatalog.Level <> -1) then
TopSign := '#';
if ACatalog.Level <> -1 then
CatalogName := ACatalog.Name;
Str := '~C|'+ACatalog.NameMark+TopSign+'||'+CatalogName+'|0|211108|0|';
StringList.Add(Str);
// Записываем подкаталоги и компоненты
Str := '';
Str := Str + '~D|'+ACatalog.NameMark+TopSign+'|';
for i := 0 to ACatalog.ChildCatalogs.Count - 1 do
begin
CatalogChild := ACatalog.ChildCatalogs[i];
Str := Str + CatalogChild.NameMark+'\1\0\';
end;
for i := 0 to ACatalog.SCSComponents.Count - 1 do
begin
Compon := ACatalog.SCSComponents[i];
Str := Str + Compon.ArticulProducer+'\1\0\';
end;
Str := Str + '|';
StringList.Add(Str);
end;
procedure LoadCatalogList;
var
SortedCatalogs: TStringList;
Catalog: TSCSCatalog;
i: Integer;
begin
SortedCatalogs := CreateStringListSorted;
// Сортируем каталоги по маркировке
for i := 0 to RootObjectsCatalog.ChildCatalogReferences.Count - 1 do
begin
Catalog := RootObjectsCatalog.ChildCatalogReferences[i];
SortedCatalogs.AddObject(Catalog.NameMark, Catalog);
end;
for i := 0 to SortedCatalogs.Count - 1 do
begin
Catalog := TSCSCatalog(SortedCatalogs.Objects[i]);
AddCatalogInfoToStrings(Catalog);
end;
AddCatalogInfoToStrings(RootObjectsCatalog);
FreeAndNil(SortedCatalogs);
end;
procedure LoadComponList;
var
SortedCompons: TStringList;
Compon: TSCSComponent;
ComponPrice, ComponCount: Double;
i: integer;
DescriptionStream: TStream;
NBQuerySelect: TpFIBQuery;
begin
SortedCompons := TStringList.Create;
for i := 0 to RootObjectsCatalog.ComponentReferences.Count - 1 do
begin
Compon := RootObjectsCatalog.ComponentReferences[i];
SortedCompons.AddObject(Compon.ArticulProducer, Compon);
end;
for i := 0 to SortedCompons.Count - 1 do
begin
Compon := TSCSComponent(SortedCompons.Objects[i]);
GetComponQtPriceInUOM(Compon, TF_Main(GForm).FUOM, @ComponPrice, @ComponCount);
Str := '~C|'+Compon.ArticulProducer+'|'+Compon.Izm+'|'+Compon.Name+'|'+FloatToStr(ComponPrice)+'|211108|3|';
StringList.Add(Str);
end;
// Скрипт загрузки описания компонента из НБ
NBQuerySelect := TF_Main(GForm).FNormBase.DM.Query_Select;
// Описания компонентов
for i := 0 to SortedCompons.Count - 1 do
begin
Compon := TSCSComponent(SortedCompons.Objects[i]);
DescriptionStream := TF_Main(GForm).FNormBase.DM.GetStreamFromTableByGUID(tnComponent, fnDescription, Compon.GuidNB, qmPhisical);
Str := GetStringFromStream(DescriptionStream);
if Str <> '' then
begin
Str := '~T|'+Compon.ArticulProducer +'|'+ Str+'|';
StringList.Add(Str);
end;
FreeAndNil(DescriptionStream);
end;
FreeAndNil(SortedCompons);
end;
begin
try
if tvReports.Selected <> nil then
begin
ReportItemParams := TReportItemParams(tvReports.Selected.Data);
TargetFolder := GetTargetFolder;
if TargetFolder = nil then
MessageInfo(cResourceReport_Msg8)
else
begin
Dialog := TSaveDialog.Create(nil);
Dialog.Title := cSavingToFile;
//SetParamsToDialog(Dialog, FFileExt);
Dialog.DefaultExt := '*'+enBc3;
Dialog.Filter := GetDialogFilter(GetExtensionDescription(enBc3), enBc3);
Dialog.InitialDir := '';
Dialog.FileName := '';
Dialog.FileName := '';
Dialog.Options := Dialog.Options + [ofOverwritePrompt];
if Dialog.Execute then
begin
Application.ProcessMessages;
ReportItemParamValues := GetCurrReportItemParamValues;
RootObjectsCatalog := PrepareCommerceInvoiceObjects(TargetFolder, ReportItemParams, ReportItemParamValues);
BeginProgress;
try
ProjCurrency := TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.GetCurrencyByType(ctMain);
CurrencySign := '';
if ProjCurrency <> nil then
CurrencySign := ProjCurrency.Data.NameBrief;
StringList := TStringList.Create;
// Заголовок
StringList.Add('~V|SOFT S.A.|FIEBDC-3/2002|Presto 8.8||ANSI|');
// Инфа о валюте
StringList.Add('~K|\3\3\3\3\3\3\3\'+CurrencySign+'\|0|');
// Список Каталогов
LoadCatalogList;
// Компоненты
LoadComponList;
//StringList.SaveToFile('c:\file.bc3');
StringList.SaveToFile(Dialog.FileName);
FreeAndNil(StringList);
finally
EndProgress;
FreeAndNil(RootObjectsCatalog);
end;
FreeAndNil(ReportItemParamValues);
end;
Dialog.Free;
end;
end;
except
on E: Exception do AddExceptionToLogExt(ClassName, MethodName(@TF_ResourceReport.Act_ExportToBc3Execute), E.Message);
end;
end;
procedure TF_ResourceReport.nePricePrecisionChange(Sender: TObject);
begin
if nePricePrecision.IntValue <> GSCSIni.PM.RepPricePrecision then
begin
GSCSIni.PM.RepPricePrecision := nePricePrecision.IntValue;
WritePMIni(GSCSIni.PM);
end;
end;
procedure TF_ResourceReport.neKolvoPrecisionChange(Sender: TObject);
begin
if neKolvoPrecision.IntValue <> GSCSIni.PM.RepKolvoPrecision then
begin
GSCSIni.PM.RepKolvoPrecision := neKolvoPrecision.IntValue;
WritePMIni(GSCSIni.PM);
end;
end;
procedure TF_ResourceReport.Timer_TimeOutExecTimer(Sender: TObject);
var i: integer;
begin
if self.Visible then
begin
TTimer(Sender).Enabled := false;
SendKeyDown(tvReports, VK_HOME, []);
Application.ProcessMessages;
if TTimer(Sender).Tag > 0 then
begin
for i := 1 to TTimer(Sender).Tag do
begin
SendKeyDown(tvReports, VK_DOWN, []);
Application.ProcessMessages;
end;
end;
Act_ShowWizardReport.Execute;
end;
end;
{
procedure TF_ResourceReport.ShowEtazhClick(Sender: TObject);
begin
ShowAllResourses.Enabled:=(ShowEtazh.Checked or ShowKabinet.Checked);
end;
procedure TF_ResourceReport.ShowKabinetClick(Sender: TObject);
begin
ShowAllResourses.Enabled:=(ShowEtazh.Checked or ShowKabinet.Checked);
end;
}
procedure TF_ResourceReport.cbCanShowKabinetClick(Sender: TObject);
begin
if cbCanShowKabinet.Checked then
cbGroupByHeightOfPlacing.Checked := False;
cbCanShowObjHierarchy.Enabled := cbCanShowKabinet.Visible and cbCanShowKabinet.Checked;
cbAsPlacingInProj.Enabled := not cbCanShowKabinet.Checked;
//cbReportWithStamp.Enabled := not cbCanShowKabinet.Checked and not cbCanGroupByName.Checked;
//if cbCanShowKabinet.Checked then
// cbReportWithStamp.Checked := false;
//if cbCanGroupByName.Checked then
// cbReportWithStamp.Checked := false;
// cbCanGroupByName.Enabled:=cbCanShowKabinet.Visible and cbCanShowKabinet.Checked;
end;
procedure TF_ResourceReport.cbAsPlacingInProjClick(Sender: TObject);
begin
//cbCanshowKabinet.Enabled := cbAsPlacingInProj.Checked;
//cbCanShowObjHierarchy.Enabled := cbCanShowKabinet.Checked and cbCanShowKabinet.Enabled;
//cbCanGroupByName.Enabled := cbAsPlacingInProj.Checked;
end;
procedure TF_ResourceReport.cbCanGroupByNameClick(Sender: TObject);
begin
//cbReportWithStamp.Enabled := not cbCanShowKabinet.Checked and not cbCanGroupByName.Checked;
//if cbCanShowKabinet.Checked then
// cbReportWithStamp.Checked := false;
//if cbCanGroupByName.Checked then
// cbReportWithStamp.Checked := false;
end;
procedure TF_ResourceReport.cbReportWithStampClick(Sender: TObject);
begin
cbShowCablePath.Enabled := not cbReportWithStamp.Checked;
end;
procedure TF_ResourceReport.cbShowCablePathClick(Sender: TObject);
begin
cbReportWithStamp.Enabled := not cbShowCablePath.Checked;
//cbShowCablePath.Enabled := not cbReportWithStamp.Checked;
end;
//Tolik
procedure TF_ResourceReport.CheckAllReportsClick(Sender: TObject);
var i: Integer;
Node: TFlyNode;
ReportItemParams: TReportItemParams;
begin
for i := 0 to tvReports.Items.Count - 1 do
begin
Node := tvReports.Items[i];
if Node.Hidden = False then
begin
ReportItemParams := TReportItemParams(Node.Data);
if ((ReportItemParams.RepType <> rtCompoSpecification) and (ReportItemParams.RepType <> rtDefectAct)) then
begin
if CheckAllReports.Checked then
tvReports.Items[i].Cells[rciIsOn] := bsTrue
else
tvReports.Items[i].Cells[rciIsOn] := bsFalse;
end;
end;
end;
end;
// Tolik --10/08/2017 --
procedure TF_ResourceReport.cbOldReportFormClick(Sender: TObject);
var
ReportItemParams: TReportItemParams;
begin
ReportItemParams := nil;
if tvReports.Selected <> nil then
ReportItemParams := TReportItemParams(tvReports.Selected.Data);
if ReportItemParams <> nil then
begin
ReportItemParams.FReportSortInfo.ClearFields;
if cbOldReportForm.checked then
begin
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameMark, cRepMsg58); //AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg58); //NUMCABLE //AReportItemParams.FReportSortInfo.AddFieldInfo(fnMarkID, cRepMsg58); //NUMCABLE
ReportItemParams.FReportSortInfo.AddFieldInfo(fnComponentIndex, cResourceReport_Msg42); // индекс кабеля
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameCable, cRepMsg77); //CABLETYPE
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg78); //NUMSWITCHBOARD
ReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameTo, cRepMsg79); //NUMSWITCHBOARDPORT
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameList, cRepMsg80); //COMESFROM
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg81); //NUMOUTLETORSWITCHBOARD
ReportItemParams.FReportSortInfo.AddFieldInfo(fnPortNameFrom, cRepMsg82); //NUMOUTLETORSWITCHBOARDPORT
end
else
begin
ReportItemParams.FReportSortInfo.AddFieldInfo(fnName, cRepMsg247);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameFrom, cRepMsg250);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameTo, cRepMsg251);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnTraceCabling, cRepMsg249);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnNameMark, cRepMsg256);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnTotalKolvo, cRepMsg255);
ReportItemParams.FReportSortInfo.AddFieldInfo(fnLength, cRepMsg154);
end;
end
end;
procedure TF_ResourceReport.cbGroupByHeightOfPlacingClick(Sender: TObject);
begin
if cbGroupByHeightOfPlacing.Checked then
begin
cbCanShowKabinet.Checked := False;
cbCanShowObjHierarchy.Enabled := True;
end
else
cbCanShowObjHierarchy.Enabled := False;
end;
end.