expertcad/SRC/CadEngine/U_ESCadClasess.pas
2025-08-29 13:48:16 +03:00

28849 lines
1023 KiB

unit U_ESCadClasess;
//{J+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, PCPanel, PCDrawBox, PCDrawing, DrawEngine, PowerCad, StdCtrls,
pcMsbar, ComCtrls, ToolWin, PCTypesUtils, DrawObjects, Menus, DlgBase, ExtDlgs,
FastStrings, PCLayerDlg, OleCtnrs, buttons, PCgui, GuiStrings, Math, RichForm, Contnrs, U_HouseClasses{Tolik},
U_BaseConstants, cxClasses, U_Common_Classes;
const
dimp_draw = 1.1; //1.25; //0.75;
dimp_add = 1; //2;
dim2: double = 2;
dim02: double = 0.2;
dim1: double = 1;
dim4: double = 4;
Type
TPolyArr = array [1..4] of TPoint;
TClickType = (ct_Single, ct_Double);
TConnectorType = (ct_Clear, ct_NB, ct_Default);
TOrthoLineType = (ot_Clear, ot_NB, ot_Default);
// ñòèëü òðàññû (ïîä ïîòîëêîì, ïóñòàÿ, äî 10 êàáåëåé, äî 10 â êîðîáå, áîëåå 10 êàáåëåé)
TTraceStyle = (ts_UnderFalseFloor, ts_ClearTrace, ts_Until10, ts_Until10InCorob, ts_Over10);
// òèï ñ-ï ëèíèè (ïîäúåì, ñïóñê, îòñóòñâóåò)
TLineRaiseType = (lrt_Up, lrt_Down, lrt_None);
// Ñòåïåíü çàïîëíåíèÿ èíòåðôåéñîâ êîìïîíåíòîâ (êàáåëè è òî÷. êîìïîíåíòû)
TComponInterfacesFullness = (cif_None, cif_Empty, cif_HalfEmpty, cif_Full);
// Ñòåïåíü äåôåêòíîñòè
TDefectDegree = (dodNone, dodNormal, dodDefect, dodPartDefect);
// Âåðøèíà ñ-ï - òèï: îáû÷íûé, ìåæýòàæíûé, îòñóòñâóåò
TConnRaiseType = (crt_None, crt_OnFloor, crt_BetweenFloorUp, crt_BetweenFloorDown, crt_TrunkUp, crt_TrunkDown);
// Òèï ñåòè â îáúåêòå
TObjectNetworkTypes = set of (nt_All, nt_Computer, nt_Telephon, nt_Television, nt_Gas, nt_Electric);
// Òèï ðèñîâàíèÿ ñòðåëîê ê ïîäïèñÿì äëÿ NotesGroup
TNotesRowsType = (nr_AutoSide, nr_UpLeftSide, nr_DownLeftSide, nr_UpRightSide, nr_DownRightSide);
// Òèï îòîáðàæåíèÿ äëèííû ëèíèè: íàä ëèíèåé, ïîä ëèíèåé
// Tolik -- 30/11/2015
// TLineCaptionsViewType = (cv_OverLine, cv_UnderLine);
// äîáàâëåíû íîâûå ñâîéñòâà cv_Center -- ïî öåíòðó ëèíèè, cv_Auto -- íàä ëèíèåé, åñëè â íàäïèñè îäíà ñòðîêà, èíà÷å - ïî öåíòðó
TLineCaptionsViewType = (cv_OverLine, cv_UnderLine, cv_Center, cv_Auto);
//
// Òèï îòîáðàæåíèÿ ïîäïèñè ê êîííåêòîðàì: ââåðõó, âíèçó, ñëåâà, ñïðàâà
TConnCaptionsViewType = (cv_Up, cv_Down, cv_Left, cv_Right);
// Tolik 10/02/2021 -- äîáàâëåí òèï ëèñòà "lt_ElScheme" äëÿ îäíîëèíåéíîé ýëåêòðè÷åñêîé ñõåìû
// Òèï ëèñòà (îáû÷íûé èëè äèçàéí øêàôà)
//TListType = (lt_Normal, lt_DesignBox, lt_ProjectPlan);
//TListType = (lt_Normal, lt_DesignBox, lt_ProjectPlan, lt_ElScheme);
TListType = (lt_Normal, lt_DesignBox, lt_ProjectPlan, lt_ElScheme, lt_AScheme); // Tolik -- äîáàâëåí òèï ëèñòà äëÿ ìîíòàæíîé ñõåìû ùèòêà
//
// Òèï ðàçìåùåíèÿ òî÷. îáúåêòîâ
TConnTracingType = (ctt_FromCeiling, ctt_FromFalseFloor, ctt_FromFloor);
// Òèï ïðîêëàäêè òðàññû/êàáåëÿ/êîðîáà
TLineTracingType = (ltt_FromCeiling, ltt_FromFalseFloor, ltt_FromFloor, ltt_FromConnObjects);
// Òèï óãîëêà
TCornerType = (crn_None, crn_Out, crn_In, crn_Vertical, crn_Adapter);
// Òèï êàáèíåòà
TCabinetType = (ct_Virtual, ct_Visual);
// Òèï îòîáðàæåíèÿ èçìåðèòåëüíîé ëèíèè
TDimLinesType = (dlt_None, dlt_Row, dlt_Stroke);
//
TRtfNoteType = (rnt_Caption, rnt_Note, rnt_None);
TRtfObjectType = (rot_Line, rot_Conn, rot_None);
// òèï ïå÷àòè
TPrintType = (pt_Black, pt_Color);
// òèï ëèñòà ÑÊÑ
TSCSType = (st_NoChoose, st_Internal, st_External);
// òèï òðàññèðîâêè (îò ÐÌ èëè îò ÊÎ)
TWayType = (wt_Begin, wt_End);
// Òèï äëèíû íîâûõ òðàññ - àâòî, ïîëüçîâàòåëüñêàÿ
TTraceLengthType = (tltNone, tltAuto, tltUser);
//Tolik 04/09/2017 --
TOrthoLineCrossInfo = Record
StartPoint: TDoublePoint;
EndPoint: TDoublePoint;
DrawColor: Integer;
DrawFigureType: Integer;
CrossLineID: Integer;
disttoFirstPoint: Double;
isDrawPoint: Boolean;
isCritical: Byte;
end;
POrthoLineCrossInfo = ^TOrthoLineCrossInfo;
//
TFigureGrpMod = class;
TFigureGrpNotMod = class;
TConnectorObject = class;
TOrthoLine = class;
TRichTextMod = class;
TPlanObject = class;
TPlanConnector = class;
TPlanTrace = class;
TCabinet = class;
TCabinetNumber = class;
TSCSFigureGrp = class;
///----------- ÎÐÒÎËÈÍÈß------------------------------------------------------
TOrthoLine = class(TLine)
private
FOrthoLineTypeIndex: integer;
FDrawFigureIndex: integer;
FSingleBlockIndex: integer;
FMultilineCaptionBoxIndex: integer;
FCaptionsGroupIndex: integer;
FNotesGroupIndex: integer;
FLength: Double;
FOrthoLineType: TOrthoLineType;
FDrawFigure: TFigureGrpMod;
FGroupObjectIndex: Integer;
FJoinFigure1Index: integer;
FJoinFigure2Index: integer;
FObjectFromRaisedLineIndex: Integer;
FJoinFigure1IndexForGrp: integer;
FJoinFigure2IndexForGrp: integer;
FObjectFromRaisedLineIndexForGrp: Integer;
//FWasIsSnap: boolean; //óäàëèòü ñàìûêîâ
FisSnap: Boolean;
function GetActualZOrder(Index: Integer): Double;
procedure SetActualZOrder(Index: Integer; const Value: Double);
procedure SetDrawFigure(const Value: TFigureGrpMod);
procedure SetOrthoLineType(const Value: TOrthoLineType);
procedure SetLineLength(const Value: Double);
procedure SetIsSnap(const Value: Boolean);
protected
FActualZOrder: Array of Double;
procedure DrawVertical(ADEngine: TPCDrawEngine);
public
isTraceShow: Boolean; // ðåæèì ïîêàçà òðàññû äî ñåðâåðà
IsShowBlock: Boolean; // îòîáðàæàòü óñë.îáîçíà÷åíèå
FIsRaiseUpDown: Boolean;
FIsVertical: Boolean;
ShowLength: Boolean; // ïîêàçûâàòü äëèíó òðàññû
ShowCaptions: Boolean; // ïîêàçûâàòü ïîäïèñè
ShowNotes: Boolean; // ïîêàçûâàòü âûíîñêè
IsLengthAboveLimit: Boolean; // â òðàññå åñòü êàáåëü ñ ïðåâûøàþùåé äëèíîé
FNotRecalcLength: Boolean;
FConnectingLine: Boolean;
// ñâ-âà èçìåíåíííûõ ïîëåé
FIsNameChanged: Boolean;
FIsCaptionsChanged: Boolean;
FIsNotesChanged: Boolean;
FIsBlockChanged: Boolean;
FCaptionsFontBold: Boolean;
FExistOtherObjectType: Boolean;
FIsRotated: Boolean;
FIsCableChannel: Boolean;
FOrthoStatus: Boolean;
FMarkTracing: Boolean;
FDisableTracing: Boolean;
FIsDraw: Boolean; //05.04.2011
// Shadow
tmpDrawShadow: Boolean;
tmpWasOrtho: Boolean;
tmpShadowP1: TDoublePoint;
tmpShadowP2: TDoublePoint;
FCount: Integer; // êîë-âî ëèíèé
FIndex: Integer; // Èíäåêñ îáúåêòà
FBlockID: Integer; // BLOCK ID
FObjectType: Integer;
FTraceWidth: Integer;
FCabinetID: Integer;
FConnectingPos: Integer;
tmpParentDupID: Integer;
FCaptionsFontSize: Integer;
FNotesFontSize: Integer;
FCaptionsFontColor: Integer;
FNotesFontColor: Integer;
FTagPM: Integer;
FDrawColor: Integer;
FDrawStyle: Integer;
GrpSizeX: Double; // ðàçìåðû îäèíî÷íîãî áëîêà
GrpSizeY: Double;
BlockStep: Double; // øàã óñë.îáîçíà÷åíèÿ
FGap: Double; // ðàññòîÿíèå
UserLength: Double; // þçåð-äëèíà
CalculLength: Double; // âû÷èñëÿåìàÿ äëèíà
FDrawFigureAngle: Double;
FSingleBlockDelta: Double;
FOriginalSizeX: Double;
FOriginalSizeY: Double;
FDrawFigurePercent: Double;
DrawFigureH: Double;
CaptionsGroupH: Double;
FCaptionsFontName: string;
FNotesFontName: string;
FTrunkNumber: string;
FBlockGUID: string; // BLOCK GUID
FMark: string;
SaveCaption: String;
NotesGroup: TFigureGrpNotMod;
OutTextCaptions: TStringList;
OutTextNotes: TStringList;
FTraceCaptionsList: TStringList;
tmpCaptionsGroup: TFigure;
tmpCaptions: TFigure;
tmpNotesCaptions: TFigure;
JoinConnector1: TFigure; // ñîåäèíèòåëü 1
JoinConnector2: TFigure; // ñîåäèíèòåëü 2
FTextBox: TFigure;
MultilineCaptionBox: TFigure;
FObjectFromRaisedLine: TConnectorObject;
FSingleBlock: TFigureGrpMod; // Îäèíî÷íûé áëîê
CaptionsGroup: TFigureGrpNotMod;
// ***
FCableFullnessSide1: TComponInterfacesFullness; // çàïîëíåííîñòü èíòåðôåéñîâ êàáåëåé ñòîðîíà1
FCableFullnessSide2: TComponInterfacesFullness; // çàïîëíåííîñòü èíòåðôåéñîâ êàáåëåé ñòîðîíà2
FCableChannelFullness: TComponInterfacesFullness; // çàïîëíåííîñòü êàáåëüíûõ êàíàëîâ
FCableChannelClosedSide1: TComponInterfacesFullness; // çàêðûòîñòü/îòêðûòîñòü êàá.êàíàëà ñòîðîíà1
FCableChannelClosedSide2: TComponInterfacesFullness; // çàêðûòîñòü/îòêðûòîñòü êàá.êàíàëà ñòîðîíà2
FDefectDegree: TDefectDegree; // ñòåïåíü äåôåêòíîñòè
// ***
FLineType: TTraceStyle; // òèï ëèíèè (äåéñòâóþùàÿ, ïðîåêòèðóåìàÿ)
FLineRaiseType: TLineRaiseType;
FNetworkTypes: TObjectNetworkTypes; // òèïû ñåòåé îáúåêòà
FNotesRowsType: TNotesRowsType;
FCaptionsViewType: TLineCaptionsViewType;
// âèä îòîáðàæåíèÿ òðàññ
FTraceColor: TColor;
FTraceStyle: TPenStyle;
// åñëè â ãðóïïå - ññûëêà íà ãðóïïó
FGroupObject: TSCSFigureGrp;
F3DObject: TObject;
FRegionPoints: array[0..4] of TPoint;
FRegionPointsIsActual: boolean;
//Tolik 04/09/2017 --
CrossList: TList;
//
property isSnap: Boolean read FisSnap write SetIsSnap; // åñòü ïðèâÿçêà
property ActualZOrder[Index: Integer]: Double read GetActualZOrder write SetActualZOrder;
property LineLength: Double read FLength write SetLineLength;
property DrawFigure: TFigureGrpMod read FDrawFigure write SetDrawFigure;
property OrthoLineType: TOrthoLineType read FOrthoLineType write SetOrthoLineType;
//Tolik -- 24/11/2015
{
constructor create(aX1, aY1, aZ1, aX2, aY2, aZ2 : Double; w: Integer; s: Integer; c: Integer; row: Integer;
LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent; aCreateCaptionNotes: Boolean = True);
}
constructor create(aX1, aY1, aZ1, aX2, aY2, aZ2 : Double; w: Integer; s: Integer; c: Integer; row: Integer;
LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent; aCreateCaptionNotes: Boolean = True;
aCanRecalcCaptionsGroupPos: Boolean = True);
//
destructor Destroy; override;
procedure Select; override;
procedure Initialize; override;
function getclred: TColor;
procedure Draw(DEngine: TPCDrawEngine; isFlue: Boolean); override;
procedure DrawTraceStyle(ADEngine: TPCDrawEngine);
procedure DrawActiveTrace(ADEngine: TPCDrawEngine; aPoint1, aPoint2: TDoublePoint);
procedure DrawProjectibleTrace(ADEngine: TPCDrawEngine; aPoint1, aPoint2: TDoublePoint);
procedure GetBounds(var figMaxX, figMaxY, figMinX, figMinY: Double); override;
procedure GetBoundsWithOutGrpSize(var figMaxX, figMaxY, figMinX, figMinY: Double); override;
//procedure GetModPoints(ModList: TList); override;
procedure GetModPoints(ModList: TMyList); override; // Tolik 24/12/2019 --
procedure Move(deltax, deltay: Double); override;
procedure MoveOrthoLine(deltax, deltay: Double);
procedure Delete; // DELETE!!!
// Tolik -- 20/04/2017 --
//procedure SetJConnector1(jc: TFigure);
//procedure SetJConnector2(jc: TFigure);
// ïåðåïèñàíî, ÷òîáû ìîæíî áûëî â çàâèñèìîñòè îò ïàðàìåòðà èçìåíèòü êîîðäèíàòû êðàÿ îðòîëèíèè
// íà êîîðäèíàòû êîííåêòîðà, êîòîðûé çàäàí íà ñîîòâåòñòâóþùåì êðàå
procedure SetJConnector1(jc: TFigure; CanChangeActuals: Boolean = True);
procedure SetJConnector2(jc: TFigure; CanChangeActuals: Boolean = True);
//
procedure MoveTextBox(MvFig: TObject; Point1, Point2: TDoublePoint; isMove: Boolean);
procedure UpdateLengthTextBox(aNeedReCreate: Boolean; aReturnToPos: Boolean);
//
//procedure ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean);
// Tolik -- 01/11/2015 --
procedure ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean; OldCaptionList: TStringList = nil; OldH: Double = -1; OldW: Double = -1);
//
function CreateNotesRowGroup(ANotesRowsType: TNotesRowsType; aDeltaLineX: Double = -1; aDeltaLineY: Double = -1): TFigureGrpNotMod;
procedure ReCreateNotesGroup(aNeedReCreate: Boolean = False);
//Tolik
Procedure CheckDrawFigure(aFigure: TFigureGrpMod);
procedure ReCreateDrawFigureBlock;
Procedure Deselect; override;
//
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
// 31.07.2015 Tolik
//procedure RaiseProperties;
Procedure RaiseProperties(CadFigList: TList);
//
procedure ReRaiseProperties;
function ShadowTrace(ClickIndex: Integer; x, y: Double): Boolean; override;
function ShadowClick(ClickIndex: Integer; x, y: Double): Boolean; override;
function CreateModification: TFigure; override;
function TraceModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x: Double; y: Double; Shift: TShiftState): Boolean; override;
function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x: Double; y: Double; Shift: TShiftState): Boolean; override;
function isPointIn(x,y: Double): boolean; override;
function Duplicate: TFigure; override;
function GetAngle(AP1x, AP1y, AP2x, AP2y: Double): Double;
// Tolik 22/10/2015 äëÿ ôèãóðû îòðèñîâêè (áåç îêðóãëåíèÿ)
function GetAngleDF(AP1x, AP1y, AP2x, AP2y: Double): Double;
//
function LengthCalc: Double;
function AngleCalc(X1, Y1, Z1, X2, Y2, Z2: Double): Double;
function AngleCalcDF(X1, Y1, Z1, X2, Y2, Z2: Double): Double;
function MoveMultilineCaptionCalc(X1, Y1, Z1, X2, Y2, Z2, Angle, CaptionH: Double): TDoublePoint;
function TextRotate(OldAngle, NewAngle: Double): Double;
// Tolik -- 30/11/2015 --
//function CaptionsGroupRemoveCalc(TBGrpCP, OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint; aH: Double): TDoublePoint;
function CaptionsGroupRemoveCalc(TBGrpCP, OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint; aH: Double; LineCount : Integer): TDoublePoint;
function DrawFigureRemoveCalc(TBGrpCP, OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint; aH: Double): TDoublePoint;
function CalcHDrawFigure: Double;
function CalcHCaptionsGroup: Double;
// Tolik -- 30/11/2015
// function GetCaptionsGroupNewPos(ADelta: Double): TDoublePoint;
function GetCaptionsGroupNewPos(ADelta: Double; LineCount: Integer): TDoublePoint;
//
function GetAngleInRad(aX1, aY1, aX2, aY2: Double): Double;
function GetAllBlocks(ADuplicateBlock: TFigureGrpMod): TFigureGrpMod;
function CreateDuplicate: TOrthoLine;
function CheckTraceNotHaveConnect(CheckAll: boolean = True): Boolean;
function GetBreakPointOnShadowTrace(P1, P2: TDoublePoint; aCtrl: Boolean = False): TDoublePoint;
function ConnectorByNum(aNum: Integer): TConnectorObject; //12.03.2012
procedure SetNewLength(aVal: Double);
class function CreateFromShadow(aOwner: TComponent; LHandle: Longint; Shadow: TFigure): TFigure; override;
class function CreateShadow(x, y: Double): TFigure; override;
end;
///----------- CONNECTOR -----------------------------------------------------
TConnectorObject = class(TFigure)
private
FConnectorTypeIndex: Integer;
FDrawFigureIndex: Integer;
FCaptionsGroupIndex: Integer;
FNotesGroupIndex: Integer;
FActualZOrder: Array of Double;
FDrawFigure: TFigureGrpMod;
FConnectorType: TConnectorType;
//FDrawStyle: TDrawStyle;
FGroupObjectIndex: Integer;
FObjectFromRaiseIndex: Integer;
FObjectFromRaiseIndexForGrp: Integer;
FHouseIndex: Integer;
FisSnap : Boolean; //06.11.2013 ñàìûêîâ
FindSnapTimer : TTimer;
FFindSnapEnable : Boolean;
FDeltaPoint : TDoublePoint;
function GetActualZOrder(Index: Integer): Double;
procedure SetActualZOrder(Index: Integer; const Value: Double);
procedure SetDrawFigure(const Value: TFigureGrpMod);
procedure SetConnectorType(const Value: TConnectorType);
procedure SetIsSnap(const Value: Boolean);
procedure OnFindSnapTimer(Sender:TObject);//ther test
protected
// ïðîðèñîâêà ñòðåëêè-ïîäúåìà
procedure DrawRaiseUp(ADEngine: TPCDrawEngine; AObjectFromRaise: TConnectorObject);
procedure DrawRaiseDown(ADEngine: TPCDrawEngine; AObjectFromRaise: TConnectorObject);
public
// Tolik 02/04/2018 --
FJoinedOrthoLinesByVerticals: TList; // ñïèñîê òðàññ, ïðèñîåäèíåííûõ ÷åðåç âåðòèêàëüíûå òðàññû (ñèäÿò íà èõ êîííåêòîðàõ)
//
isPrevSnap: Boolean; // ïðåäûäóùàÿ ïðèâÿçêà
AsEndPoint: Boolean; // êàê òåêóùèé îáúåêò
ShowCaptions: Boolean; // ïîêàçûâàòü ïîäïèñè
ShowNotes: Boolean; // ïîêàçûâàòü âûíîñêè
FCornerTypeChangedByUser: Boolean;
// ñâ-âà èçìåíåíííûõ ïîëåé
FIsNameChanged: Boolean;
FIsCaptionsChanged: Boolean;
FIsNotesChanged: Boolean;
FIsBlockChanged: Boolean;
FDisableTracing: Boolean;
FMirrored: Boolean;
FIsApproach: Boolean;
FIsHouseJoined: Boolean;
FIsDraw: Boolean; //05.04.2011
FIndex: Integer; // Èíäåêñ îáúåêòà
// äëÿ ìåæýòàæíûõ ïåðåõîäîâ
FID_ListToPassage: Integer;
FID_ConnToPassage: Integer;
FBlockID: Integer; // BLOCK ID
FObjectType: Integer;
FBlockCount: Integer;
FCabinetID: Integer;
tmpParentDupID: Integer;
FCaptionsFontSize: Integer;
FNotesFontSize: Integer;
FCaptionsFontColor: Integer;
FNotesFontColor: Integer;
FTagPM: Integer;
FComponID: Integer;
// ñâ-âî äëÿ øêàôà, ïðèâÿçêà ê ëèñòó
FJoinedListIDForBox: Integer;
FLHandle: Longint;
FJoinedConnectorsIndexes: array of Integer; // ìàññèâ ïðèñîåäèíåííûõ êîííåêòîðîâ
FJoinedConnectorsIndexesForGrp: array of Integer; // ìàññèâ ïðèñîåäèíåííûõ êîííåêòîðîâ äëÿ ãðóïïû
GrpSizeX: Double; // ðàçìåð X
GrpSizeY: Double; // ðàçìåð Y
FDrawFigureAngle: Double;
FDrawFigureMoved: Boolean;
FOriginalSizeX: Double;
FOriginalSizeY: Double;
FDrawFigurePercent: Double;
FRaiseShiftX: Double;
FRaiseShiftY: Double;
FCaptionsFontName: string;
FNotesFontName: string;
FBlockGUID: string; // BLOCK GUID
FMark: string;
FTrunkName: string; // ñèñòåìíîå èìÿ äëÿ ìàãèñòðàëè
OutTextCaptions: TStringList;
OutTextNotes: TStringList;
RemJoined: TList; // òåìï. óäàëåíèå ïðèñîåäèíåííûõ îáúåêòîâ
JoinedOrtholinesList: TList; // ïðèâÿçàííûå îðòîëèíèè
JoinedConnectorsList: TList; // ïðèâÿçàííûå êîííåêòîðû
tmpCaptionsGroup: TFigure;
tmpNotesCaptions: TFigure;
FTextBox: TFigure;
CaptionsGroup: TRichTextMod;
NotesGroup: TFigureGrpNotMod;
// ***
FConnFullness: TComponInterfacesFullness; // çàïîëíåííîñòü èíòåðôåéñîâ òî÷. îáúåêòîâ
FDefectDegree: TDefectDegree; // ñòåïåíü äåôåêòíîñòè
// ***
// äëÿ ïîäúåìîâ
FConnRaiseType: TConnRaiseType;
FObjectFromRaise: TConnectorObject;
FNetworkTypes: TObjectNetworkTypes; // òèïû ñåòåé îáúåêòà
FNotesRowsType: TNotesRowsType;
FCaptionsViewType: TConnCaptionsViewType;
// òèï óãîëêà äëÿ êîííåêòîðà
FCornerType: TCornerType;
// åñëè â ãðóïïå - ññûëêà íà ãðóïïó
FGroupObject: TSCSFigureGrp;
FHouse: THouse;
F3DObject: TObject;
FIsRotating: Boolean; //11.03.2012
//23.07.2013
FModPosOffset: TDoublePoint;
FModConnsOtherSides: TList; // Ñîåäèíèòåëè ñ äðóãèõ ñòîðîí òðàññ
//Tolik 08/11/2017 --
RedRect: array[1..2] of TDoublePoint;
//
ByDrawF: integer;
property HouseIndex: integer read FHouseIndex; // Tolik 13/02/2020 --
property ActualZOrder[Index: Integer]: Double read GetActualZOrder write SetActualZOrder;
property DrawFigure: TFigureGrpMod read FDrawFigure write SetDrawFigure;
property ConnectorType: TConnectorType read FConnectorType write SetConnectorType;
property isSnap: Boolean read FisSnap write SetIsSnap; // åñòü ïðèâÿçêà
constructor Create(aX, aY, aZ: Double; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent);
destructor Destroy; override;
procedure Select; override;
procedure DeSelect; override;
procedure CreateSnapTimer(CheckDrawStyle: Boolean = True);
procedure Initialize; override;
procedure Draw(DEngine: TPCDrawEngine; isGrayed: Boolean); override;
procedure GetBoundsDef(var figMaxX, figMaxY, figMinX, figMinY: Double); // Tolik 09/03/2021 --
procedure GetBounds(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure getboundsWithoutGrpSize(var figMaxX, figMaxY, figMinX, figMinY: Double); override;
procedure Delete(Recurse: Boolean = True; DelRaise: Boolean = True); /// DELETE !!!
// Tolik 06/08/2018 --
Function isToRaise: Boolean;
//Function GetSelPoints: TList;
Function GetSelPoints: TMyList; // Tolik 24/12/2019 --
//
//procedure GetModPoints(ModList: TList); override;
procedure GetModPoints(ModList: TMyList); override; // Tolik 24/12/2019 --
// MOVE !!!
procedure Move(deltax: Double; deltay: Double); override;
//Tolik 03/08/2021 --
//procedure MoveP(deltax: Double; deltay: Double; FindSnap: Boolean = True);// override;
procedure MoveP(deltax: Double; deltay: Double; FindSnap: Boolean = True; aCanAlign: Boolean = True);
//
procedure MoveConnector(deltax, deltay: Double; aFindSnap: Boolean = True; aMoveByVertical: Boolean = False; CheckDelta: Boolean = True);
procedure MoveRaiseConnector(deltax, deltay: Double);
procedure MoveBetweenRaiseConnector(deltax, deltay: Double);
procedure FindObjectsOnMove(deltax, deltay: Double);
procedure ReMoveJoinedOrthoLines(AJoinedLine: TOrthoLine; deltax, deltay: Double; CheckDelta: boolean = True);
procedure DrawSnapFigures(FFigure: TFigure; SetSnapStatus: Boolean);
procedure ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean);
procedure ReCreateNotesGroup(aNeedReCreate: Boolean = False);
//Stream
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
//Tolik
procedure RaiseProperties(CadFigList: TList);
//procedure RaiseProperties;
procedure ReRaiseProperties;
// for DrawShadow Connected Lines
procedure SetConnectedLinesDrawShadow(X, Y: Double);
procedure SkipConnectedLinesDrawShadow;
procedure SetDrawFigurePercent(aPercent: Double);
function ShadowClick(ClickIndex: Integer; x: Double; y: Double): Boolean; override;
function ShadowTrace(ClickIndex: Integer; x, y: Double): Boolean; override;
function IsPointIn(x: Double; y: Double): Boolean; override;
function IsPointInDrawFigure(x: Double; y: Double): Boolean;
function duplicate: TFigure; override;
function CreateModification: TFigure; override;
function CreateRotModification: TFigure; //11.03.2012
function TraceModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x: Double; y: Double; Shift: TShiftState): Boolean; override;
function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x: Double; y: Double; Shift: TShiftState): Boolean; override;
//11.03.2012
Function TraceRotate(CadControl: Pointer;mp:TModPoint;var TraceFigure:TFigure; x,y:Double;Shift: TShiftState):boolean; override;
//11.03.2012
Function EndRotate(CadControl: Pointer;mp:TModPoint;TraceFigure:TFigure; x,y:Double;Shift: TShiftState):boolean; override;
// ïîèñê îáúåêòîâ
function FindSnapObject(aFindX, aFindY: Double): TFigure;
// Ïðîâåðèòü ìîãóò ëè îáúåêòû ïðèâÿçûâàòüñÿ
function CanSnapToFindFigure(aFindedFigure: TFigure; aFindedList: TList): Boolean;
// Ñîçäàíèå äóáëèêàòîâ
function CreateDuplicate(x, y: double): TConnectorObject;
function CreateCrossATSDuplicate(x, y: double): TConnectorObject;
function CreateDistribCabDuplicate(x, y: double): TConnectorObject;
function CreateNotesRowGroup(ANotesRowsType: TNotesRowsType; aDeltaLineX: Double = -1; aDeltaLineY: Double = -1): TFigureGrpNotMod;
function GetPosWithAngle(aX, aY, aAngle: Double): TDoublePoint;
function IsApproachInHouse(adeltax, adeltay: double): Boolean;
procedure RotateByParams(aAngleRad: Double; aPoint: TDoublePoint); //11.03.2012
//Procedure Rotate(aAngle: Double; cPoint: TDoublePoint); override; //30.08.2012
procedure DefRaizeDrawFigurePos; //28.05.2013
class function CreateShadow(x: Double; y: Double): TFigure; override;
class function CreateFromShadow(aOwner: TComponent; LHandle: Longint; Shadow: TFigure)
: TFigure; override;
//Tolik 08/06/2017--
//Procedure AddAutoCreatedObjsToDrawFigure(Angle, aTransparency: Integer; cpx, cpy, Radius, CutRadius: Double; FillColor: TColor; ACutStyle: TPieCutStyle; aRotateAngle: integer = -1);
Procedure AddAutoCreatedObjsToDrawFigure(AFigClassName: String; AParamList: TStringList);
//Procedure RemoveAutoCreatedObjsFromDrawFigure;
//Procedure DrawRaise;
//
end;
///------------ TEXT OBJECT (äëèíà ëèíèè)------------------------------------
TTextMod = class(TText)
procedure Select; override;
//procedure getModPoints(ModList: TList); override;
procedure getModPoints(ModList: TMyList); override;
procedure GetBounds(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure GetBoundsWithoutGrpSize(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
function isPointIn(x: Double; y: Double): Boolean; override;
public
procedure Delete;
end;
///----------- FIGURE GROUP (DrawFigure) -------------------------------------
TFigureGrpMod = class(TFigureGrp)
//procedure getModPoints(ModList: TList); override;
procedure getModPoints(ModList: TMyList); override;
procedure GetBounds(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure GetBoundsWithoutGrpSize(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure select; override;
function IsPointIn(x: Double; y: Double): Boolean; override;
public
FNetworkTypes: TObjectNetworkTypes; // òèïû ñåòåé îáúåêòà (îòîáðàæàòü âèä òî÷.îáúåêòà)
// Äëÿ ïîäúåçäîâ
fFromApproach: TConnectorObject;
fFromHouse: THouse;
fRMode: Boolean;
fTraceMod: Boolean;
fHasParent: Boolean;
procedure move(deltax, deltay: double);override;
Function EndRotate(CadControl: Pointer;mp:TModPoint;TraceFigure:TFigure; x,y:Double;Shift: TShiftState): boolean; override;
Function TraceModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x, y: double; Shift: TShiftState): boolean; override;
Function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x, y: double;Shift: TShiftState): boolean; override;
// **************
constructor create(LHandle: LongInt;aOwner: TComponent);
procedure Delete;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
procedure draw(DEngine: TPCDrawEngine; isGrayed: Boolean); override;
function Duplicate: TFigure; override;
// Tolik -- 11/08/2017 --
Procedure RemoveAutoCreatedFigures;
//
end;
///----------- ÌÀÊÅÒ ÝÒÀÆÀ ---------------------------------------------------
TFrame = class(TBlock)
public
constructor create(LHandle: Longint; aOwner: TComponent);
destructor Destroy; override;
procedure Select; override;
procedure Move(deltax, deltay: double); override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
procedure RaiseProperties;
function IsPointIn(x: Double; y: Double): Boolean; override;
end;
/// -------- ÑÊÑ DimLines ----------------------------------------------------
TSCSHDimLine = class(THDimLine)
Function ShadowClick(ClickIndex:Integer;x,y:Double):Boolean;override;
Function ShadowTrace(ClickIndex:Integer;x,y:Double):Boolean;override;
class Function CreateShadow(x,y:Double): TFigure;override;
private
class function CreateFromShadow(aOwner: TComponent; LHandle: LongInt; Shadow: TFigure): TFigure; override;
public
FValue: Double;
Procedure Draw(DEngine: TPCDrawEngine; isGrayed:Boolean);override;
Procedure ReScaleHCAD(aOldValue, aNewValue: Double);
Procedure WriteToStream(Stream: TStream); override;
Procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
Function GetValue: Double;
Function Edit: Boolean; override;
//
Function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x,y: Double;Shift: TShiftState): boolean; override;
end;
TSCSVDimLine = class(TVDimLine)
Function ShadowClick(ClickIndex:Integer;x,y:Double):Boolean;override;
Function ShadowTrace(ClickIndex:Integer;x,y:Double):Boolean;override;
class Function CreateShadow(x,y:Double): TFigure;override;
private
class function CreateFromShadow(aOwner: TComponent; LHandle: LongInt; Shadow: TFigure): TFigure; override;
public
FValue: Double;
Procedure Draw(DEngine: TPCDrawEngine; isGrayed:Boolean);override;
Procedure ReScaleVCAD(aOldValue, aNewValue: Double);
Procedure WriteToStream(Stream: TStream); override;
Procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
Function GetValue: Double;
Function Edit: Boolean; override;
Function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x,y: Double;Shift: TShiftState): boolean; override;
end;
///----------- FIGURE GROUP (äëÿ âûíîñîê, ShadowObject åùå) ------------------
TFigureGrpNotMod = class (TFigureGrp)
public
ShadowCP: TDoublePoint;
fHasParent: boolean;
procedure Move(deltax: Double; deltay: Double); override;
procedure Delete;
procedure draw(DEngine: TPCDrawEngine; isGrayed: Boolean); override;
//procedure getModPoints(ModList: TList); override;
procedure getModPoints(ModList: TMyList); override;
procedure GetBounds(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure GetBoundsWithoutGrpSize(var figMaxX: Double; var figMaxY: Double; var figMinX: Double; var figMinY: Double); override;
procedure select; override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
function IsPointIn(x: Double; y: Double): Boolean; override;
Function Edit: Boolean; override;
function Duplicate: TFigure; override;
end;
///----------- RICH TEXT (äëÿ ïîäïèñåé) --------------------------------------
TRichTextMod = class(TRichText)
public
fHasParent: boolean;
constructor create(aX1, aY1, aX2, aY2: Double; w, s, c, abrs, abrc: integer;
LHandle: LongInt; aDrawStyle: TDrawStyle; aOwner: TComponent;
aObjectType: TRtfObjectType; aNoteType: TRtfNoteType; aAlignment: Integer = 0; AText: Boolean=true);
procedure Delete;
procedure draw(DEngine: TPCDrawEngine; isGrayed:Boolean); override;
Procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
Function Edit: Boolean; override;
end;
// ---------------- ÄËß ÊÀÁÈÍÅÒÎÂ --------------------------------------------
TCabinet = class(TRectangle)
private
FNumberObjectIndex: Integer;
public
FSCSID: Integer;
FIndex: Integer;
FFalseFloorHeight: Double;
FType: TCabinetType;
FNumberObject: TCabinetNumber;
// Tolik (ïëîùàäü êàáèíåòà)
FCabinetSquare: Double;
//
CabinetConfig: TRoomConfig;
constructor create(aX1, aY1, aX2, aY2: Double; w, s, c, abrs, abrc: integer; LHandle: LongInt; aDrawStyle: TDrawStyle; aOwner: TComponent);
destructor Destroy; override;
procedure select; override;
procedure Delete;
procedure Draw(DEngine: TPCDrawEngine; isFlue: Boolean); override;
procedure Move(deltax, deltay: Double); override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
//Tolik
//procedure RaiseProperties;
procedure RaiseProperties(CadFigList: TList);
//
Function Edit: Boolean; override;
function isPointIn(x,y:Double): boolean;override;
function isPointInMod(x,y:Double): boolean;
Function EndModification(CadControl: Pointer;mp:TModPoint;TraceFigure:TFigure;x,y:Double;Shift: TShiftState):boolean;override;
class function CreateFromShadow(aOwner: TComponent; LHandle: Integer; Shadow: TFigure): TFigure;override;
procedure Initialize; override;
end;
TCabinetExt = class(TPolyLine)
private
FNumberObjectIndex: Integer;
public
FSCSID: Integer;
FIndex: Integer;
FFalseFloorHeight: Double;
FType: TCabinetType;
FNumberObject: TCabinetNumber;
// Tolik (ïëîùàäü êàáèíåòà)
FCabinetSquare: Double;
//
CabinetConfig: TRoomConfig;
constructor create(Points: TDoublePointArr; w, s, c, abrs, abrc: integer; row: integer; aClosed: Boolean;
LHandle: LongInt; aDrawStyle: TDrawStyle; aOwner: TComponent);
destructor Destroy; override;
procedure select; override;
procedure Delete;
procedure Draw(DEngine: TPCDrawEngine; isFlue: Boolean); override;
procedure Move(deltax, deltay: Double); override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
//Tolik
//procedure RaiseProperties;
procedure RaiseProperties(CadFigList: TList);
//
Function Edit: Boolean; override;
function isPointIn(x,y:Double): boolean;override;
function isPointInMod(x,y:Double): boolean;
Function EndModification(CadControl: Pointer;mp:TModPoint;TraceFigure:TFigure;x,y:Double;Shift: TShiftState):boolean;override;
class function CreateFromShadow(aOwner: TComponent; LHandle: Integer; Shadow: TFigure): TFigure;override;
procedure Initialize; override;
procedure CenterNumberObject;
end;
TCabinetNumber = class(TFigureGrp)
public
FCabinetID: Integer;
FPositionIndex: Integer;
IsCabinetExt: Boolean;
CircleRadius: Integer;
procedure Draw(DEngine: TPCDrawEngine; isFlue: Boolean); override;
procedure Delete;
procedure Select; override;
Procedure WriteToStream(Stream:TStream);override;
Procedure SetPropertyFromStream(xCode:Byte;data:pointer;size:integer);override;
function isPointIn(x,y: double): boolean;override;
Function Edit: Boolean; override;
end;
// ------------ ÄËß ÏËÀÍÀ ÇÄÀÍÈß ---------------------------------------------
TPlanObject = class(TFigureGrp)
private
FJoinedConnectorsIndexes: array of Integer;
public
FMoveWithConnector: Boolean;
FSCSID: Integer;
FFloorNumber: Integer;
FCabNumber: Integer;
FSizeX: Double;
FSizeY: Double;
JoinedConnectors: TList;
constructor create(LHandle: LongInt; aOwner: TComponent);
// Tolik --23/02/2018 --
destructor Destroy; override;
//
procedure Delete;
procedure move(deltax, deltay: double); override;
Procedure WriteToStream(Stream: TStream); override;
Procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
//Tolik
//procedure RaiseProperties;
procedure RaiseProperties(CadFigList: TList);
//
Function Edit: Boolean; override;
function IsPointIn(x: Double; y: Double): Boolean; override;
end;
TPlanConnector = class(TConnectorObject)
private
FJoinedPlanObjectIndex: integer;
FJoinedTracesIndexes: array of Integer;
public
FBegType: string;
FEndType: string;
FBegSCSID: Integer;
FEndSCSID: Integer;
JoinedTraces: TList;
JoinedPlanObject: TPlanObject;
constructor Create(aX, aY, aZ: Double; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent);
// -- Tolik -- 23/02/2018 --
destructor destroy; override;
//
procedure Delete;
procedure move(deltax, deltay: double); override;
Procedure WriteToStream(Stream: TStream); override;
Procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
//Tolik
//procedure RaiseProperties;
procedure RaiseProperties(CadFigList: TList);
//
function IsPointIn(x: Double; y: Double): Boolean; override;
end;
TPlanTrace = class(TLine)
private
FJoinObject1Index: integer;
FJoinObject2Index: integer;
FCaptionIndex: Integer;
public
FBegType: string;
FEndType: string;
FBegSCSID: Integer;
FEndSCSID: Integer;
JoinObject1: TFigure;
JoinObject2: TFigure;
Caption: TRichText;
constructor create(aX1, aY1, aX2, aY2: Double; w: Integer; s: Integer; c: Integer;
row: Integer; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent);
//Tolik 23/02/2018 --
destructor destroy; override;
//
procedure Delete;
//procedure GetModPoints(ModList: TList); override;
procedure getModPoints(ModList: TMyList); override;
procedure SetJConnector1(aObject: TFigure);
procedure SetJConnector2(aObject: TFigure);
procedure Draw(DEngine: TPCDrawEngine; isFlue: Boolean); override;
procedure Move(deltax, deltay: Double); override;
procedure WriteToStream(Stream: TStream); override;
procedure SetPropertyFromStream(xCode: Byte; data: Pointer; size: Integer); override;
//Tolik
//procedure RaiseProperties;
procedure RaiseProperties(CadFigList: TList);
//
function isPointIn(x,y: Double): boolean; override;
function CreateModification: TFigure; override;
end;
// Âåäîìîñòü íîðì
TCadNorms = class(TFigureGrp)
public
fTableWidth: Integer;
fTextSize: Integer;
fTextStyle: TFontStyles;
fNumberSize: Double;
fNameSize: Double;
fIzmSize: Double;
fCountSize: Double;
fColumnSize: Double;
fLineHeight: Double;
FNormsList: TObjectList;
constructor Create(LHandle: LongInt; aOwner: TComponent);
Procedure Build;
Procedure ReBuild;
procedure DrawTable;
function DrawTextFileds(aBnd: TDoubleRect): Boolean;
function DrawTextToField(aFieldBnd: TDoubleRect; aText: string; aCentered: Boolean = True; aMaxWidth: Double = -1): Double;
procedure Delete;
//Tolik
destructor destroy; override;
//
Procedure WriteToStream(Stream:TStream);override;
Procedure SetPropertyFromStream(xCode:Byte;data:pointer;size:integer);override;
function isPointIn(x,y: double): boolean;override;
Function Edit: Boolean; override;
end;
// SCS FigureGroup
TSCSFigureGrp = class(TFigureGrp)
public
constructor create(LHandle: LongInt; aOwner: TComponent);
procedure UnGroup;
procedure move(deltax, deltay: double); override;
procedure getbounds(var figMaxX, figMaxY, figMinX, figMinY: double); override;
procedure getboundsWithOutGrpSize(var figMaxX, figMaxY, figMinX, figMinY: double); override;
Procedure scale(percentx, percenty: double; rPoint: Tdoublepoint); override;
procedure Delete;
Function Edit: Boolean; override;
function isPointIn(x, y: double): boolean; override;
Function EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure;
x, y: double; Shift: TShiftState): boolean; override;
Procedure WriteToStream(Stream: TStream); override;
Procedure SetPropertyFromStream(xCode: Byte; data: pointer; size: integer); override;
//Tolik
procedure RaiseProperties(CadFigList: TList);
//
Procedure Rotate(aAngle: Double; cPoint: TDoublePoint); override; //30.08.2012
end;
TBetweenFloorDownVertex = class(TVertex)
class function CreateFromShadow(aOwner: TComponent; LHandle: LongInt; Shadow: TFigure): TFigure; override;
end;
TBetweenFloorUpVertex = class(TVertex)
class function CreateFromShadow(aOwner: TComponent; LHandle: LongInt; Shadow: TFigure): TFigure; override;
end;
implementation
uses
U_Common, U_CAD, USCS_Main, U_Main, Types, U_DimLineDialog,
RichEdit2, U_ProjectPlan, U_BaseCommon, U_SCSComponent, U_TrunkSCS, U_Constants, U_Protection,
U_SCSClasses, {Tolik}FPlan, U_SCSLists;
destructor TCabinet.Destroy;
begin
if TDrawStyle(DrawStyle) <> dsTrace then
begin
try
if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
TF_CAD(TPowerCad(Owner ).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TCabinet.Destroy FNeedUpdateCheckedFigures', E.Message);
end;
end;
inherited;
end;
destructor TCabinetExt.Destroy;
begin
if TDrawStyle(DrawStyle) <> dsTrace then
begin
try
if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
TF_CAD(TPowerCad(Owner ).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TCabinetExt.Destroy FNeedUpdateCheckedFigures', E.Message);
end;
end;
inherited;
end;
//==============================================================================
//============== ORTHOLINE =====================================================
//==============================================================================
function TOrthoLine.LengthCalc: Double;
var
X1, X2, Y1, Y2, Z1, Z2: Double;
Length_X, Length_Y, Length_Z: Double;
GetPointObject: TConnectorObject;
StrLength: String;
DblLength: Double;
begin
try
Result := 0;
X1 := ActualPoints[1].x;
X2 := ActualPoints[2].x;
Y1 := ActualPoints[1].y;
Y2 := ActualPoints[2].y;
Z1 := ActualZOrder[1];
Z2 := ActualZOrder[2];
/////////// ïåðåñ÷åò äëèíí òðàññ /////////////////////////////////////////
// Side = 1
if (JoinConnector1 = nil) or not (CheckFigureByClassName(JoinConnector1, cTConnectorObject)) then
begin
X1 := ActualPoints[1].x;
Y1 := ActualPoints[1].y;
end
else
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
begin
X1 := ActualPoints[1].x;
Y1 := ActualPoints[1].y;
end
else
begin
// !!!
GetPointObject := TConnectorObject(JoinConnector1).JoinedConnectorsList[0];
if CheckTrunkObject(GetPointObject) then
begin
X1 := ActualPoints[1].x;
Y1 := ActualPoints[1].y;
end
else
begin
X1 := GetPointObject.ActualPoints[1].x;
Y1 := GetPointObject.ActualPoints[1].y;
end;
end;
Z1 := ActualZOrder[1];
end;
// Side = 2
if (JoinConnector2 = nil) or not (CheckFigureByClassName(JoinConnector2, cTConnectorObject)) then
begin
X2 := ActualPoints[2].x;
Y2 := ActualPoints[2].y;
end
else
begin
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
begin
X2 := ActualPoints[2].x;
Y2 := ActualPoints[2].y;
end
else
begin
GetPointObject := TConnectorObject(JoinConnector2).JoinedConnectorsList[0];
if CheckTrunkObject(GetPointObject) then
begin
X2 := ActualPoints[2].x;
Y2 := ActualPoints[2].y;
end
else
begin
X2 := GetPointObject.ActualPoints[1].x;
Y2 := GetPointObject.ActualPoints[1].y;
end;
end;
Z2 := ActualZOrder[2];
end;
if GCadForm.PCad.RulerMode = rmPage then
begin
Length_X := abs(X1 - X2) / 10;
Length_Y := abs(Y1 - Y2) / 10;
end
else
if GCadForm.PCad.RulerMode = rmWorld then
begin
Length_X := abs(X1 - X2) / 1000 * GCadForm.PCad.MapScale;
Length_Y := abs(Y1 - Y2) / 1000 * GCadForm.PCad.MapScale;
end;
Length_Z := abs(Z1 - Z2);
DblLength := SQRT(SQR(Length_X) + SQR(Length_Y) + SQR(Length_Z));
// StrLength := FormatFloat(ffMask, DblLength);
Result := DblLength;//StrToFloat_My(StrLength);
if FIsRaiseUpDown then
begin
// if FLineRaiseType = lrt_Down then
// Result := - Result;
end;
if Result = 0 then
ShowLength := False;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.LengthCalc', E.Message);
end;
end;
function TOrthoLine.AngleCalc(X1, Y1, Z1, X2, Y2, Z2: Double): Double;
var
Len_X, Len_Y, Len_Z: Double;
AngleA: Double;
Degree: Double;
begin
try
Result := 0;
Degree := 0;
Len_X := X1 - X2;
Len_Y := Y1 - Y2;
Len_Z := Z1 - Z2;
if Len_X = 0 then
Len_X := 0.001;
Degree := ArcTan(Len_Y / Len_X) * 180 / pi; // â ãðàäóñàõ
Degree := round(Degree);
if Degree = 90 then
Degree := -90;
Result := Degree / 180 * pi; // â ðàäèàíàõ
except
on E: Exception do addExceptionToLogEx('TOrthoLine.AngleCalc', E.Message);
end;
end;
function TOrthoLine.AngleCalcDF(X1, Y1, Z1, X2, Y2, Z2: Double): Double;
var
Len_X, Len_Y, Len_Z: Double;
AngleA: Double;
Degree: Double;
begin
try
Result := 0;
Degree := 0;
Len_X := X1 - X2;
Len_Y := Y1 - Y2;
Len_Z := Z1 - Z2;
if Len_X = 0 then
Len_X := 0.001;
Degree := ArcTan(Len_Y / Len_X);
Result := Degree; // â ðàäèàíàõ
except
on E: Exception do addExceptionToLogEx('TOrthoLine.AngleCalcDF', E.Message);
end;
end;
function TOrthoLine.MoveMultilineCaptionCalc(X1, Y1, Z1, X2, Y2, Z2, Angle, CaptionH: Double): TDoublePoint;
begin
try
Result.x := 0;
Result.y := 0;
if (X1 = X2) then
Exit
else
Result.y := - CaptionH;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.MoveMultilineCaptionCalc', E.Message);
end;
end;
function TOrthoLine.TextRotate(OldAngle, NewAngle: Double): Double;
var
Diff: Double;
begin
try
Result := 0;
Diff := - OldAngle + NewAngle;
if Diff > 360 then
Diff := round(Diff) mod 360;
Result := Diff;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.TextRotate', E.Message);
end;
end;
////////////////////////////////////////////////////////////////////////////////
// Tolik --24/11/2015 --
{constructor TOrthoLine.Create(aX1, aY1, aZ1, aX2, aY2, aZ2: Double; w: Integer; s: Integer;
c: Integer; row: Integer; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent; aCreateCaptionNotes: Boolean = True);}
constructor TOrthoLine.Create(aX1, aY1, aZ1, aX2, aY2, aZ2: Double; w: Integer; s: Integer;
c: Integer; row: Integer; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent; aCreateCaptionNotes: Boolean = True;
aCanRecalcCaptionsGroupPos: Boolean = True);
// aCanRecalcCaptionsGroupPos -- äîáàâëåí ïàðàìåòð, ÷òîáû íå âûðàâíèâàòü ïîëîæåíèå CaptionsGroup, åñëè èäåò äóáëèðîâàíèå ëèíèè
//
var
i: integer;
CPLine: TDoublePoint;
CalcItemWidth: Double;
CaptionsLHandle: integer;
NotesLHandle: integer;
Text_str: string;
NotesRowsPoints: TDoublePoint;
NotesRows: TFigureGrpNotMod;
NotesCaptions: TRichTextMod;
Captions: TRichTextMod;
Background: TRectangle;
Str: String;
ProgramRegisterPro_2: Boolean;
ProgramRegisterTrial_2: Boolean;
addcod: integer;
OldAP1, OldAP2: TDoublePoint;
NewAP1, NewAP2: TDoublePoint;
mydeltax, mydeltay: Double;
CP: TDoublePoint;
x1, y1, z1, x2, y2, z2: double;
ResPoints: TDoublePoint;
begin
try
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
{$IF Defined(FINAL_SCS) or Defined(TRIAL_SCS)}
ProgramRegisterPro_2 := ProgProtection.CheckIsVer2(PRO, addcod);
{$ELSE}
ProgramRegisterPro_2 := True;
{$IFEND}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IF Defined(TRIAL_SCS)}
addcod := 0;
{$IFEND}
{$IF Not Defined(FINAL_SCS)}
addcod := 0;
{$IFEND}
{$IF Defined(FINAL_SCS) and Not Defined(TRIAL_SCS)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
if Not ProgramRegisterPro_2 then
exit;
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IFEND}
{$ELSE}
addcod := 0;
{$IFEND}
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
{$IFEND}
inherited create(aX1 + addcod, aY1 + addcod, aX2, aY2 + addcod, w, s, c, row, LHandle, aDrawStyle, aOwner);
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IFEND}
//Initialize;
OutTextCaptions := TStringList.Create;
i := OutTextCaptions.Count;
OutTextNotes := TStringList.Create;
FTraceCaptionsList := TStringList.Create;
// Tolik -- 06/10/2015 -- ïðè êàæäîì ñîçäàíèè îðòîëèíèè êîííåêòîðû ñîçäàþòñÿ îòäåëüíî è ïåðåïðèñâàèâàþòñÿ,
// à ñîçäàííûå êîííåêòîðû íå óáèâàþòñÿ... ïîýòîìó îáíóëèë, ò.ê. íåõ ìíîæèòü óòå÷êè ïàìÿòè
// JoinConnector1 := TFigure.Create(LHandle, mydsNormal, aOwner);
// JoinConnector2 := TFigure.Create(LHandle, mydsNormal, aOwner);
JoinConnector1 := nil;
JoinConnector2 := nil;
//
UserLength := -1; // ïîëüçîâàòåëüñêàÿ äëèíà ïîêà íå çàäàíà
FLineType := ts_ClearTrace;
ShowLength := GCadForm.FShowLinesLength;
IsShowBlock := True;
ShowCaptions := GCadForm.FShowLinesCaptions;
ShowNotes := GCadForm.FShowLinesNotes;
//FWasIsSnap := False;
FIsRaiseUpDown := False;
FIsVertical := False;
FLineRaiseType := lrt_None;
FObjectFromRaisedLine := Nil;
FIndex := -1;
// çàïîëíåííîñòü èíòåðôåéñîâ
FCableFullnessSide1 := cif_None;
FCableFullnessSide2 := cif_None;
FCableChannelFullness := cif_None;
FCableChannelClosedSide1 := cif_None;
FCableChannelClosedSide2 := cif_None;
FDefectDegree := dodNormal;
// aZ1 := GCadForm.FLineHeight;
// aZ2 := GCadForm.FLineHeight;
OriginalPoints[1] := DoublePoint(aX1,aY1);
OriginalPoints[2] := DoublePoint(aX2,aY2);
OriginalPoints[3] := DoublePoint(aX2,aY2);
ActualPoints[1] := DoublePoint(aX1,aY1);
ActualPoints[2] := DoublePoint(aX2,aY2);
ActualZOrder[1] := aZ1;
ActualZOrder[2] := aZ2;
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(3);
NotesLHandle := GCadForm.PCad.GetLayerHandle(5);
FOrthoLineType := ot_Clear;
FDrawFigure := Nil;
FDrawFigureIndex := 0;
FOrthoLineTypeIndex := 0;
FObjectType := 2;
FCabinetID := -1;
// Öåíòð-òî÷êè îðòîëèíèè
CPLine.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
CPLine.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
if DrawStyle = mydsNormal then
begin
FNotesRowsType := nr_AutoSide;
FCaptionsViewType := cv_OverLine;
FTraceColor := GCadForm.FDefaultTraceColor;
FTraceStyle := GCadForm.FDefaultTraceStyle;
FTraceWidth := GCadForm.FDefaultTraceWidth;
FNotRecalcLength := False;
FConnectingLine := False;
FConnectingPos := -1;
tmpParentDupID := -1;
FOriginalSizeX := 0;
FOriginalSizeY := 0;
FDrawFigurePercent := 100;
FCaptionsFontSize := GCadForm.FLinesCaptionsFontSize;
FCaptionsFontBold := GCadForm.FLinesCaptionsFontBold;
FNotesFontSize := GCadForm.FLinesNotesFontSize;
FCaptionsFontName := GCadForm.FFontName;
FNotesFontName := GCadForm.FFontName;
FCaptionsFontColor := GCadForm.FLinesCaptionsColor;
FNotesFontColor := GCadForm.FLinesNotesColor;
FTrunkNumber := '';
FSingleBlockDelta := 0;
FIsRotated := False;
FIsCableChannel := False;
// Shadow
tmpDrawShadow := False;
tmpWasOrtho := false;
tmpShadowP1 := DoublePoint(-1, -1);
tmpShadowP2 := DoublePoint(-1, -1);
DrawFigureH := 0;
CaptionsGroupH := 0;
FTagPM := 0;
// ñîçäàòü òåêñò-îáüåêò äëèííû ëèíèè
CalculLength := LengthCalc;
{//08.10.2012 - ×òîáû áûëà àâòî äëèíà
if GCadForm.FShowLineCaptionsType = skExternalSCS then
UserLength := 0
else
UserLength := -1;}
//09.10.2012
if GCadForm.FNewTraceLengthType = tltUser then
UserLength := 0
else
UserLength := -1;
LineLength := CalculLength;
IsLengthAboveLimit := False;
OutTextCaptions.Clear;
Str := GetLineCaptionFormat(Self, GCadForm.FShowLineCaptionsType);
// åñëè òèï ïîäïèñè - âíåøíèå ÑÊÑ, òî ñîçäàòü ñïåðâà ìàðêèðîâêó
// Tolik 05/02/2021 --
{if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
OutTextCaptions.Add('0');
end;
}
OutTextCaptions.Add(Str);
OutTextNotes.Clear;
// Äëÿ óñë.îáîçíà÷åíèé
FSingleBlock := TFigureGrpMod.create(LHandle, aOwner);
FDrawFigure := TFigureGrpMod.create(LHandle, aOwner);
//////GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), FSingleBlock, False);
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), FDrawFigure, False);
// Tolik
// çäåñü FSingleBlock áóäåò ñèäåòü ïåðâîé ôèãóðîé â ôèãóðå îòðèñîâêè
FDrawFigure.AddFigure(FSingleBlock);
MoveTextBox(FDrawFigure, ActualPoints[1], ActualPoints[2], False);
FDrawFigure.LockModify := True;
IsShowBlock := True;
BlockStep := GCadForm.FDefaultBlockStep;
FDrawFigure.Visible := True;
if FCount = 1 then
FGap := 1;
// Ñîçäàâàòü ïîäïèñè è âûíîñêè äëÿ äàííîãî îáúåêòà
if aCreateCaptionNotes then
begin
Captions := TRichTextMod.create(0, 0, 0, 0, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Caption, 2);
Captions.RE.Lines.Clear;
Captions.RE.Font.Size := FCaptionsFontSize;
Captions.re.Font.Name := FCaptionsFontName;
Captions.re.Font.Color := FCaptionsFontColor;
if FCaptionsFontBold then
Captions.RE.Font.Style := [fsBold]
else
Captions.RE.Font.Style := [];
Captions.re.Font.Name := FCaptionsFontName;
if GCadForm.PCad.PageColor = 0 then
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor + 1
else
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor - 1;
Captions.Visible := True;
Background := TRectangle.create(0, 0, 0, 0, 1, ord(psClear), clNone, ord(bsClear), clNone,
CaptionsLHandle, mydsNormal, GCadForm.PCad);
CaptionsGroup := TFigureGrpNotMod.create(CaptionsLHandle, aOwner);
CaptionsGroup.AddFigure(Background);
CaptionsGroup.AddFigure(Captions);
CaptionsGroup.LockModify := True;
GCadForm.PCad.AddCustomFigure (GLN(CaptionsLHandle), CaptionsGroup, False);
ReCreateCaptionsGroup(false, false);
// Tolik --- 07/12/2015 ---
// âûñòàâëÿåì âûñîòó ðàñïîëîæåíèÿ, ÷òîáû ìîæíî áûëî âåðíóòü íà âûñîòó
// CaptionsGroupH := CalcHCaptionsGroup;
//
// Tolik -- 24/11/2015
{ if aCanRecalcCaptionsGroupPos then
begin
//
// íóæíî äëÿ ïîäðàâíèâàíèÿ ïîäïèñè
NewAP1 := ActualPoints[1];
NewAP2 := ActualPoints[2];
OldAP1 := ActualPoints[1];
OldAP2 := ActualPoints[2];
if CaptionsGroup <> nil then
begin
// ïåðåñîçäàòü ïîäïèñü â íóæíîì ìåñòå
ResPoints := CaptionsGroupRemoveCalc(CaptionsGroup.CenterPoint, OldAP1, OldAP2, NewAP1, NewAP2, CaptionsGroupH);
UpdateLengthTextBox(false, false);
CaptionsGroup.Move(ResPoints.x - CaptionsGroup.CenterPoint.x,
ResPoints.y - CaptionsGroup.CenterPoint.y);
// new mark - íóæíî áóäåò âîçìîæíî çäåñü äîðèõòîâûâàòü ïî àíàëîãèè ñ êîäîì â ReMoveJoinedOrthoLines
end;
end; }
NotesRows := CreateNotesRowGroup(nr_AutoSide);
NotesRows.Visible := True;
NotesCaptions := TRichTextMod.create(0, 0, 0, 0, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Note);
NotesCaptions.RE.Lines.Clear;
NotesCaptions.RE.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
NotesCaptions.Visible := True;
// ñîçäàòü NotesGroup è ïåðåáðîñèòü â íåãî îáüåêòû
NotesGroup := TFigureGrpNotMod.create(NotesLHandle, aOwner);
NotesGroup.AddFigure(NotesRows);
NotesGroup.AddFigure(NotesCaptions);
NotesGroup.LockModify := True;
NotesGroup.Radius := -1;
GCadForm.PCad.AddCustomFigure (GLN(NotesLHandle), NotesGroup, False);
ReCreateNotesGroup;
end;
// ÄËß ÌÓËÜÒÈËÈÍÈÈ ñîçäàòü òåêñò-îáüåêò äëÿ íàçâàíèÿ ëèíèè
if FCount > 1 then
begin
Text_str := '';
FTextBox := TTextMod.Create(CPLine.x, CPLine.y, cCadTextModHeight, cCadTextModWidth, Text_str, GCadForm.FFontName, RUSSIAN_CHARSET,
clBlue, CaptionsLHandle, mydsNormal, aOwner);
TTextMod(FTextBox).LockMove := true;
TTextMod(FTextBox).LockModify := true;
TFigure(FTextBox).SelOrder := ord(osBack);
FTextBox.Move(- TTextMod(FTextBox).TextLength / 2, 0);
MultilineCaptionBox := TFigure(FTextBox);
MoveTextBox(MultilineCaptionBox, ActualPoints[1], ActualPoints[2], false);
GCadForm.PCad.AddCustomFigure (GLN(CaptionsLHandle), MultilineCaptionBox, False);
end;
FTextBox := nil;
FGroupObject := nil;
F3DObject := nil;
end;
FIsDraw := false; //05.04.2011
if aDrawStyle <> dsTrace then
begin
// Tolik -- âûñîòà ðàçìåùåíèÿ íàäïèñè -- 09/12/2015
Self.CaptionsGroupH := Self.CalcHCaptionsGroup;
//
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Create', E.Message);
end;
end;
procedure TOrthoLine.MoveTextBox(MvFig: TObject; Point1: TDoublePoint;
Point2: TDoublePoint; isMove: Boolean);
var
MvAngle: Double;
MvMoveDelta: TDoublePoint;
MvTextRotate: Double;
CapH: Double;
i: integer;
DrawPoint: TDoublePoint;
begin
try
// äëÿ MultilineCaptionBox
if (MvFig = MultilineCaptionBox) then
begin
// ïîäñ÷èòàòü óãîë ïîâîðîòà
// Tolik 25/11/2015
// MvAngle := AngleCalc(Point1.x, Point1.y, ActualZOrder[1], Point2.x, Point2.y, ActualZOrder[2]);
MvAngle := AngleCalcDF(Point1.x, Point1.y, ActualZOrder[1], Point2.x, Point2.y, ActualZOrder[2]);
//
CapH := TTextMod(MultilineCaptionBox).Height / 2;
if isMove = False then
begin
TFigure(MvFig).Rotate(MvAngle, TFigure(MvFig).CenterPoint);
end
else
if isMove = True then
begin
MvTextRotate := TextRotate(MultilineCaptionBox.Angle, MvAngle);
TFigure(MvFig).Rotate(MvTextRotate, TFigure(MvFig).CenterPoint);
end;
MvMoveDelta := MoveMultilineCaptionCalc(Point1.x, Point1.y, ActualZOrder[1], Point2.x, Point2.y, ActualZOrder[2], MvAngle, CapH);
if isMove = False then
TFigure(MvFig).Move(MvMoveDelta.x, MvMoveDelta.y);
end;
// DrawFigure
if (MvFig = DrawFigure) then
begin
FTextBox := TFigureGrpMod(MvFig);
// ïîäñ÷èòàòü óãîë ïîâîðîòà
MvAngle := AngleCalcDF(Point1.x, Point1.y, ActualZOrder[1],
Point2.x, Point2.y, ActualZOrder[2]);
DrawPoint := FTextBox.CenterPoint;
if FSingleBlock.InFigures.Count > 0 then
begin
DrawPoint.y := TFigureGrpMod(FSingleBlock.InFigures[0]).CenterPoint.y;
end;
if isMove = False then
FTextBox.Rotate(MvAngle, DrawPoint)
else
if isMove = True then
begin
MvTextRotate := TextRotate(0, MvAngle);
FTextBox.Rotate(MvTextRotate, DrawPoint);
end;
// 180
// if FIsRotated then
// FTextBox.Rotate(pi, DrawPoint);
// ïîäñ÷èòàòü ïåðåìåùåíèå
if isMove = False then
begin
MvMoveDelta.x := (Point1.x + Point2.x) / 2 - FTextBox.CenterPoint.x;
MvMoveDelta.y := (Point1.y + Point2.y) / 2 - FTextBox.CenterPoint.y;
FTextBox.Move(MvMoveDelta.x, MvMoveDelta.y);
end;
FDrawFigureAngle := MvAngle;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.MoveTextBox', E.Message);
end;
end;
function TOrthoLine.CaptionsGroupRemoveCalc(TBGrpCP, OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint; aH: Double; LineCount: Integer): TDoublePoint;
var
OldA, OldB, OldC: Double;
NewA, NewB, NewC: Double;
OldPart1, OldPart2: Double;
NewPart1, NewPart2: Double;
H, P: Double;
KoefPart: Double;
AngleDegrees: Double;
AngleRad: Double;
dx, dy: Double;
divPoint: TDoublePoint;
PointPos: boolean;
//Tolik
FontStyles: TFontStyles;
OutTextStrings: TStringList;
Captions: TRichTextMod;
dd: double;
// ôóíêöèÿ äëÿ îïðåäåëåíèÿ ïîëîæåíèÿ íàäïèñè îòíîñèòåëüíî ëèíèè
// ïðè àâòîìàòè÷åñêîì ðàñïîëîæåíèè (åñëè ïîëüçîâàòåëü ñàì êóäà-òî íàäïèñü óòàùèë)
// çäåñü íóæíî çíàòü ñâåðõó èëè ñíèçó, ÷òîáû ïðàâèëüíî îïðåäåëèòü ñìåùåíèÿ äëÿ ïîâîðîòà
// ïðàêòè÷åñêè, íóæíî îïðåäåëèòü êîîðäèíàòû îñíîâàíèÿ ïåðïåíäèêóëÿðà íà ëèíèþ èç öåíòðà íàäïèñè
// è ïî íèì áóäåò âèäíî
function GetCaptAutoPosition: boolean;
var
PPoint: TDoublePoint;
begin
Result := False;
{A(xa,ya) è B(xb,yb) — ïðÿìàÿ, O(xo,yo) — îñíîâàíèå ïåðïåíäèêóëÿðà, îïóùåííîãî èç òî÷êè P(xp,yp).
Åñëè xa = xb (âåðòèêàëü), òî xo = xa è yo = yp. Åñëè ya = yb (ãîðèçîíòàëü), òî xo = xp è yo = ya.
Âî âñåõ îñòàëüíûõ ñëó÷àÿõ
xo = (xa*(yb-ya)^2 + xp*(xb-xa)^2 + (xb-xa) * (yb-ya) * (yp-ya)) / ((yb-ya)^2+(xb-xa)^2);
yo = (yb-ya)*(xo-xa)/(xb-xa)+ya.}
// - çäåñü ïîêà áîëüøîé ÕÇ -- âåðòèêàëüíàÿ òðàññà â 3ä
// if (OldAP1.x = OldAP2.x) and (OldAP1.y = OldAP2.y) then // ýòî âåðòèêàëü â 3Ä
if ((CompareValue(OldAP1.x, OldAP2.x) = 0) and (CompareValue(OldAP1.y, OldAP2.y) = 0)) then
exit;
// âåðòèêàëü
//if OldAP1.x = OldAP2.x then
if CompareValue(OldAP1.x, OldAP2.x) = 0 then
begin
PPoint.x := OldAP1.x;
PPoint.y := TBGrpCP.y;
end
else
// ãîðèçîíòàëü
// if OldAP1.y = OldAP2.y then
if CompareValue(OldAP1.y, OldAP2.y) = 0 then
begin
PPoint.x := TBGrpCP.x;
PPoint.y := OldAP1.y;
end
else
// íàêëîííàÿ (íà ïëîñêîñòè)
// if (OldAP1.x <> OldAP2.x) and (OldAP1.y <> OldAP2.y) then
if (CompareValue(OldAP1.x, OldAP2.x) <> 0) and (CompareValue(OldAP1.y, OldAP2.y) <> 0) then
begin
PPoint.x := (OldAP1.x*SQR(OldAP2.y - OldAP1.y) + TBGrpCP.x*SQR(OldAP2.x - OldAP1.x) + (OldAP2.x - OldAP1.x)*
(OldAP2.y - OldAP1.y)*(TBGrpCP.y - OldAP1.y)) /(sqr(OldAP2.y - OldAP1.y)+sqr(OldAP2.x - OldAP1.x));
PPoint.y := ((OldAP2.y - OldAP1.y)*(PPoint.x - OldAP1.x))/(OldAP2.x - OldAP1.x) + OldAP1.y;
end;
// ÎÏÐÅÄÅËßÅÌ ÍÀÄ ËÈÍÈÅÉ
// âåðòèêàëü
//if PPoint.x = OldAP1.x then
// Result := (PPoint.x < TBGrpCP.x);
if CompareValue(PPoint.x, OldAP1.x) = 0 then
Result := (CompareValue(PPoint.x , TBGrpCP.x) = -1)
else
// ãîðèçîíòàëü (è íàêëîííàÿ - îäíî##éñòâåííî)
//if CompareValue(PPoint.y, OldAP1.y) = 0 then
Result := (CompareValue(PPoint.y , TBGrpCP.y) = 1);
end;
begin
try
Result := DoublePoint(0, 0);
PointPos := GetCaptAutoPosition;
if FIsRaiseUpDown then
begin
Result.x := TBGrpCP.x + (NewAP1.x - OldAP1.x);
Result.y := TBGrpCP.y + (NewAP1.y - OldAP1.y);
end
else
begin
OldA := SQRT(SQR(OldAP1.x - OldAP2.x ) + SQR(OldAP1.y - OldAP2.y ));
if OldA = 0 then
begin
Result.x := TBGrpCP.x;
Result.y := TBGrpCP.y;
Exit;
end;
OldB := SQRT(SQR(OldAP1.x - TBGrpCP.x ) + SQR(OldAP1.y - TBGrpCP.y ));
if OldB < 0.00001 then
OldB := 0;
OldC := SQRT(SQR(OldAP2.x - TBGrpCP.x ) + SQR(OldAP2.y - TBGrpCP.y ));
if OldC < 0.00001 then
OldC := 0;
// Tolik --25/11/2015 -- íå þçàåòñÿ - íåõ âû÷èñëÿòü
{
P := (OldA + OldB + OldC) / 2;
if P < 0.00001 then
P := 0;
}
{
try
H := (2 * SQRT(P * (P - OldA) * (P - OldB) * (P - OldC))) / OldA;
except
H := 0;
end;
}
H := aH;
//
OldPart1 := SQRT(SQR(OldB) - SQR(H));
OldPart2 := SQRT(SQR(OldC) - SQR(H));
/////////////////////////////////////
NewA := SQRT(SQR(NewAP1.x - NewAP2.x) + SQR(NewAP1.y - NewAP2.y));
KoefPart := NewA / OldA;
NewPart1 := KoefPart * OldPart1;
NewPart2 := KoefPart * OldPart2;
NewB := SQRT(SQR(NewPart1) + SQR(H));
NewC := SQRT(SQR(NewPart2) + SQR(H));
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
//Tolik -- 25/11/2015
//AngleDegrees := GetAngle(NewAP1.x, NewAP1.y, NewAP2.x, NewAP2.y);
//AngleDegrees := round(AngleDegrees) mod 360;
AngleDegrees := GetAngleDF(NewAP1.x , NewAP1.y, NewAP2.x, NewAP2.y);
While AngleDegrees > 360 do
AngleDegrees := AngleDegrees - 360;
//
AngleRad := AngleDegrees * pi / 180;
// Tolik -- 16/12/2015 -- ïåðåêðûòèå FDrawfigure
{ if ((FCaptionsViewType <> cv_Center) and (FCaptionsViewType <> cv_Auto)) then
begin
dx := NewPart1 * Cos(AngleRad) + GrpSizeY * Cos(AngleRad);
dy := NewPart1 * Sin(AngleRad) + GrpSizeY * Sin(AngleRad);
end
else
begin}
dx := NewPart1 * Cos(AngleRad);
dy := NewPart1 * Sin(AngleRad);
//end;
//
divPoint.x := NewAP1.x + dx;
divPoint.y := NewAP1.y + dy;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
// Tolik -- 25/11/2015
// While AngleDegrees > 360 do
While AngleDegrees > 360 do
AngleDegrees := AngleDegrees - 360;
//AngleDegrees := round(AngleDegrees) mod 360;
//
AngleRad := AngleDegrees * pi / 180;
dx := H * Cos(AngleRad);
dy := H * Sin(AngleRad);
if (AngleDegrees >= 0) and (AngleDegrees <= 180) then
begin
dx := -dx;
dy := -dy;
end;
// ñâîéñòâî îòîáðàæåíèÿ
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
dx := -dx;
dy := -dy;
end
else
begin
// íàä ëèíèåé
// Tolik -- 30/11/2015 --
// if FCaptionsViewType = cv_OverLine then
if FCaptionsViewType = cv_OverLine then //or ((FCaptionsViewType = cv_Auto) and (LineCount = 1))) then
//
begin
dx := dx;
dy := dy;
end
else
// ïîä ëèíèåé
if FCaptionsViewType = cv_UnderLine then
begin
dx := -dx;
dy := -dy;
end
//Tolik --09/12/2015
// ïî öåíòðó
else
if FCaptionsViewType = cv_Center then
begin
dx := 0; dy := 0;
{ AngleDegrees := GetAngleDF(NewAP1.x , NewAP1.y, NewAP2.x, NewAP2.y);
While AngleDegrees > 360 do
AngleDegrees := AngleDegrees - 360;
//
AngleRad := AngleDegrees * pi / 180;
dx := 0.75 * Cos(AngleRad);
AngleRad := AngleRad + pi;
dy := 0.25*Sin(AngleRad);
if (AngleDegrees >= 90) and (AngleDegrees <= 180) then
begin
dx := dx;
dy := dy;
end;
if (AngleDegrees >= 180) and (AngleDegrees <= 270) then
begin
//dd := dx;
//dx := -dy;
//dy := dx;
dx := -dx;
dy := -dy;
end;
if (AngleDegrees >= 270) and (AngleDegrees <= 360) then
begin
dx := -dx;
dy := -dy;
end;
if (AngleDegrees >= 0) and (AngleDegrees <= 90) then
begin
dx := dx;
dy := dy;
end;
{ FontStyles := [];
if FCaptionsFontBold then
FontStyles := [fsBold];
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
if Captions.re.Lines.Count > 0 then
begin
//OutTextStrings.Text := Captions.re.Text;
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', OutTextCaptions, dy, dx);
dx := -(dx+3)/8;
dy := dy/4;
end;}
end
// àâòî
else
// if ((FCaptionsViewType = cv_Auto) and (not PointPos)) then
if FCaptionsViewType = cv_Auto then
begin
if PointPos then
begin
dx := dx;
dy := dy;
end;
if Not PointPos then
begin
dx := -dx;
dy := -dy;
end;
end;
end;
Result.x := divPoint.x + dx;
Result.y := divPoint.y + dy;
end;
except
Result.x := TBGrpCP.x;
Result.y := TBGrpCP.y;
// on E: Exception do addExceptionToLogEx('TOrthoLine.TextBoxesGrpRemoveCalc', E.Message);
end;
end;
// Tolik -- 30/11/2015 --
// function TOrthoLine.GetCaptionsGroupNewPos(ADelta: Double): TDoublePoint;
function TOrthoLine.GetCaptionsGroupNewPos(ADelta: Double; LineCount: Integer): TDoublePoint;
var
HalfPart: Double;
AngleDegrees: Double;
AngleRad: Double;
dx, dy: Double;
CPLine: TDoublePoint;
begin
try
Result := DoublePoint(0, 0);
CPLine.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
CPLine.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
// dx := 0;
// dy := 0;
HalfPart := SQRT(SQR(ActualPoints[1].x - CPLine.x) + SQR(ActualPoints[1].y - CPLine.y));
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
AngleDegrees := GetAngle(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
AngleRad := AngleDegrees * pi / 180;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
AngleDegrees := round(AngleDegrees) mod 360;
AngleRad := AngleDegrees * pi / 180;
//23/12/2015
if FCaptionsViewType = cv_UnderLine then
ADelta := ADelta + 0.25;
//
dx := ADelta * Cos(AngleRad);
dy := ADelta * Sin(AngleRad);
if (AngleDegrees >= 0) and (AngleDegrees < 180) then
begin
dx := -dx;
dy := -dy;
end;
// ñâîéñòâî îòîáðàæåíèÿ
dx := -dx;
dy := -dy;
end
else
begin
HalfPart := SQRT(SQR(ActualPoints[1].x - CPLine.x) + SQR(ActualPoints[1].y - CPLine.y));
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
//Tolik -- 03/12/2015
// AngleDegrees := GetAngle(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
AngleDegrees := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
//
AngleRad := AngleDegrees * pi / 180;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
// Tolik 25/11/2015
// AngleDegrees := round(AngleDegrees) mod 360;
While AngleDegrees > 360 do
AngleDegrees := AngleDegrees - 360;
//
AngleRad := AngleDegrees * pi / 180;
//Tolik -- 16/12/2015
if FCaptionsViewType = cv_UnderLine then
ADelta := ADelta + 0.25;
dx := (ADelta + GRPSizeY/2) * Cos(AngleRad);
dy := (ADelta + GRPSizeY/2) * Sin(AngleRad);
//dx := ADelta * Cos(AngleRad);
//dy := ADelta * Sin(AngleRad);
//
if (AngleDegrees >= 0) and (AngleDegrees < 180) then
begin
dx := -dx;
dy := -dy;
end;
// ñâîéñòâî îòîáðàæåíèÿ
// íàä ëèíèåé
// Tolik -- 30/11/2015 --
if FCaptionsViewType = cv_OverLine then
//if ((FCaptionsViewType = cv_OverLine) or ((FCaptionsViewType = cv_Auto) and (LineCount = 1))) then
//
begin
dx := dx;
dy := dy;
end
else
// ïîä ëèíèåé
if FCaptionsViewType = cv_UnderLine then
begin
dx := -dx;
dy := -dy;
end
else
if FCaptionsViewType = cv_Center then
begin
dx := 0;
dy := 0;
end;
end;
//
Result.x := CPLine.x + dx;
Result.y := CPLine.y + dy;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetCaptionsGroupNewPos', E.Message);
end;
end;
procedure TOrthoLine.Initialize;
begin
try
inherited;
FClassIndex := ciOrthoLine; //04.11.2011
FGap := GDefaultGap;
FCount := GDefaultNum;
FOrthoStatus := GOrthoStatus;
if FCount < 1 then
FCount := 1;
if FCount > 100 then
FCount := 100;
if FCount = 1 then
FGap := 0.1;
FRegionPoints[0].x := 0;
FRegionPoints[0].y := 0;
FRegionPoints[1].x := 0;
FRegionPoints[1].y := 0;
FRegionPoints[2].x := 0;
FRegionPoints[2].y := 0;
FRegionPoints[3].x := 0;
FRegionPoints[3].y := 0;
FRegionPoints[4].x := 0;
FRegionPoints[4].y := 0;
FRegionPointsIsActual := false;
//Tolik 04/03/2017 --
CrossList := TList.Create;
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Initialize', E.Message);
end;
end;
function TOrthoLine.getclred: TColor;
begin
result := clRed;
if Self.Owner <> nil then
if TPowerCad(Self.Owner).Owner <> nil then
if TF_Cad(TPowerCad(Self.Owner).Owner).FListSettings.ShowTracesCrossPoints = 2 then
// result := RGB(255, 187, 187); //clPurple;
result := RGB($FF, $AA, $AA);
end;
procedure TOrthoLine.Draw(DEngine: TPCDrawEngine; isFlue: Boolean);
var
points: array[0..2] of TDoublePoint;
endp: TDoublePoint;
len, f, Gap2, XGap: Extended;
x1, y1, x2, y2, x3, y3, resx1, resx2, resx3, resy1, resy2, resy3: Double;
i, j, k, dynarrlen: Integer;
EndPointsColor: Integer;
ActualsArrayCount: Integer;
tracecount: Integer;
isLineConnected: Boolean;
IsDraw: Boolean;
ActualsCount: integer;
CrossPoint1, CrossPoint2: TDoublePoint;
BasisPoints: TDoublePoint;
RaizeKoeff: double;
// Tolik 05/09/2017 --
PointInfo: POrthoLineCrossInfo;
FirstLinePoint, LastLinePoint, LastPoint, LinePoint, p1, p2: TDoublePoint;
reg: HRGN;
l: Integer;
// Tolik 11/09/2017 --
LinePenstyle: TPenStyle;
LineWidth: Integer;
LineColor: Integer;
isDrawTraceStyle: Boolean;
//CanCheckColor: Boolean;
CurrFTraceColor: TColor;
AlternateTraceColor: TColor;
ShowCriticalCrossPoints: Boolean;
Procedure SetDrawLineProps;
begin
try
if GCadForm.FKeepLineTypesRules then
begin
if FLineType = ts_UnderFalseFloor then
begin
LinePenstyle := psDash;
LineWidth := 1;
end;
if FLineType = ts_ClearTrace then
begin
LinePenstyle := psDashDot;
LineWidth := 1;
end;
if FLineType = ts_Until10 then
begin
LinePenstyle := psSolid;
LineWidth := 1;
end;
if FLineType = ts_Until10InCorob then
begin
LinePenstyle := psSolid;
// Âíåøíèå ÑÊÑ
if GCadForm.FShowLineCaptionsType = skExternalSCS then
LineWidth := 1
else
LineWidth := 2;
end;
if FLineType = ts_Over10 then
begin
LinePenstyle := psSolid;
// Âíåøíèå ÑÊÑ
if GCadForm.FShowLineCaptionsType = skExternalSCS then
LineWidth := 1
else
LineWidth := 3;
end;
if FIsRaiseUpDown then
begin
LinePenstyle := psClear;
LineWidth := 1;
end;
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
if FObjectType = 1 then
begin
if GCadForm.FPrintType = pt_Black then
begin
LinePenstyle := psDash;
LineColor := clBlack;
LineWidth := 2;
end;
if GCadForm.FPrintType = pt_Color then
begin
LinePenstyle := psDash;
LineColor := clRed;
LineWidth := 1;
end;
end;
end;
end
else
begin
LinePenstyle := FTraceStyle;
LineWidth := FTraceWidth;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetDrawLineProps', E.Message);
end;
end;
//
begin
try
If Deleted then
Exit;
// Tolik 29/03/2021 --
x3 := 0;
y3 := 0;
//
//Tolik 11/09/2017 --
isDrawTraceStyle := False;
AlternateTraceColor := 0;
ShowCriticalCrossPoints := False;
if Self.Owner <> nil then
if TPowerCad(Self.Owner).Owner <> nil then
if TF_Cad(TPowerCad(Self.Owner).Owner).FListSettings.ShowTracesCrossPoints = 2 then
ShowCriticalCrossPoints := True;
If DrawStyle = mydsNormal then
begin
if tmpDrawShadow then
begin
x1 := tmpShadowP1.x;
y1 := tmpShadowP1.y;
x2 := tmpShadowP2.x;
y2 := tmpShadowP2.y;
Points[0].x := x1;
Points[0].y := y1;
Points[1].x := x2;
Points[1].y := y2;
DEngine.Canvas.Pen.Mode := pmXor;
DEngine.Canvas.Pen.Color := clBlue xor clWhite;
DEngine.Canvas.Pen.Style := psDash;
DEngine.Canvas.Pen.Width := 1;
DEngine.Canvas.Brush.Style := bsClear;
DEngine.Canvas.Brush.Color := clBlack;
DEngine.DrawLine(points[0], points[1]);
// Tolik 21/04/2018 -- ÷òîáû íå ïîòåðÿòü îðèãèíàëüíîå èçîáðàæåíèå òðàññû ïðè îáíîâëåíèè Êàäà (à òî îñòàâàëñÿ òîëüêî SHADOW)
if GCadForm <> nil then
if not GCadForm.PCad.isDrawingFigures then
Exit;
end;
end;
// TRACE ----------------------------------------
if (DrawStyle = dsTrace) then
begin
if FIsRaiseUpDown then
begin
RaizeKoeff := 1;
if (FIsRaiseUpDown) and (FObjectFromRaisedLine <> nil) and (ConnectorDetect(FObjectFromRaisedLine)) then
begin
RaizeKoeff := Self.FDrawFigurePercent / 100;
if FObjectFromRaisedLine.DrawFigure.InFigures.Count = 0 then
begin
BasisPoints.x := FObjectFromRaisedLine.ActualPoints[1].x + FObjectFromRaisedLine.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaisedLine.ActualPoints[1].y - FObjectFromRaisedLine.GrpSizeY / 2;
end
else
begin
BasisPoints.x := FObjectFromRaisedLine.DrawFigure.CenterPoint.x + FObjectFromRaisedLine.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaisedLine.DrawFigure.CenterPoint.y - FObjectFromRaisedLine.GrpSizeY / 2;
end;
{if FLineRaiseType = lrt_Up then
begin
x1 := BasisPoints.x;
y1 := BasisPoints.y;
x2 := BasisPoints.x + (2.5*RaizeKoeff);
y2 := BasisPoints.y - (2.5*RaizeKoeff);
end
else
if FLineRaiseType = lrt_Down then
begin
x1 := BasisPoints.x + (1.5*RaizeKoeff);
y1 := BasisPoints.y - (1.5*RaizeKoeff);
x2 := BasisPoints.x + (4*RaizeKoeff);
y2 := BasisPoints.y - (4*RaizeKoeff);
end;
}
BasisPoints := GetBasisPointByObjFromRaise(FObjectFromRaisedLine);
CrossPoint1.x := BasisPoints.x;
CrossPoint1.y := BasisPoints.y;
CrossPoint2.x := BasisPoints.x + Round4(4 * RaizeKoeff);
CrossPoint2.y := BasisPoints.y - Round4(4 * RaizeKoeff);
//DEngine.DrawLine(CrossPoint1, CrossPoint2);
actuals[0] := CrossPoint1;
actuals[1] := CrossPoint2;
FIsRaiseUpDown := False;
end;
end;
DEngine.Canvas.Pen.Mode := pmXor;
//Tolik 03/02/2022 --
//DEngine.Canvas.Pen.Color := clBlue xor clWhite;
DEngine.Canvas.Pen.Color := clLime;
//
DEngine.Canvas.Pen.Style := psDash;
DEngine.Canvas.Pen.Width := 1;
//Tolik 03/02/2022 --
//DEngine.Canvas.Brush.Style := bsClear;
//DEngine.Canvas.Brush.Color := clBlack;
//
if GCadForm.PCad.ToolIdx = toSelect then
begin
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
end
else
begin
x1 := OriginalPoints[1].x;
y1 := OriginalPoints[1].y;
x2 := OriginalPoints[2].x;
y2 := OriginalPoints[2].y;
x3 := OriginalPoints[3].x;
y3 := OriginalPoints[3].y;
end;
end
else
// NORMAL --------------------------------------
begin
// if DrawFigure <> nil then
// DrawFigure.Visible := IsShowBlock;
// if FSingleBlock <> nil then
// FSingleBlock.Visible := IsShowBlock;
// if FIsRaiseUpDown then
// begin
// DrawFigure.Visible := False;
// FSingleBlock.Visible := False;
// end;
// òèïû ñåòåé
IsDraw := IsViewObjectInCurrentNetwork(Self);
FIsDraw := IsDraw; //05.04.2011
if IsDraw then
begin
if CaptionsGroup <> nil then
CaptionsGroup.Visible := ShowCaptions;
if Assigned(NotesGroup) then
begin
if IsNoteExist(NotesGroup) then
NotesGroup.Visible := ShowNotes
else
NotesGroup.Visible := False;
end;
if DrawFigure <> nil then
DrawFigure.Visible := IsShowBlock;
if FSingleBlock <> nil then
FSingleBlock.Visible := IsShowBlock;
if FIsRaiseUpDown then
if Not TF_CAD(TPowerCad(Owner).Owner).FListSettings.CADShowRaiseDrawFigure then //28.05.2013
begin
//Tolik
if DrawFigure <> nil then
//
DrawFigure.Visible := False;
//Tolik
if FSingleBlock <> nil then
//
FSingleBlock.Visible := False;
end;
// if FSingleBlock <> nil then
// FSingleBlock.Visible := True;
// if DrawFigure <> nil then
// DrawFigure.Visible := True;
// Tolik 16/04/2020 -- ýòîò áëîê íóæåí êàê ðàç çäåñü... åñëè îñòàâèòü íèæå -- êàê áûë, òî
// ïðè ôèëüòðàöèè ïî òèïàì ñåòåé íà Êàäå îñòàíóòñÿ ïîäïèñè è âûíîñêè ê ðàéçàì, ÷òî íå êîìèëüôî.....
if FIsRaiseUpDown then
begin
if CaptionsGroup <> nil then
begin
if GCadForm.FShowRaise then
begin
CaptionsGroup.Visible := ShowCaptions;
end
else
begin
CaptionsGroup.Visible := False;
end;
end;
if NotesGroup <> nil then
begin
if IsNoteExist(NotesGroup) then
begin
if GCadForm.FShowRaise then
begin
NotesGroup.Visible := ShowNotes;
end
else
begin
NotesGroup.Visible := False;
end;
end
else
NotesGroup.Visible := False;
end;
end;
end
else
begin
if CaptionsGroup <> nil then
CaptionsGroup.Visible := False;
if Assigned(NotesGroup) then
NotesGroup.Visible := False;
if FSingleBlock <> nil then
FSingleBlock.Visible := False;
if DrawFigure <> nil then
DrawFigure.Visible := False;
end;
{
if FIsRaiseUpDown then
begin
if CaptionsGroup <> nil then
begin
if GCadForm.FShowRaise then
begin
CaptionsGroup.Visible := ShowCaptions;
end
else
begin
CaptionsGroup.Visible := False;
end;
end;
if NotesGroup <> nil then
begin
if IsNoteExist(NotesGroup) then
begin
if GCadForm.FShowRaise then
begin
NotesGroup.Visible := ShowNotes;
end
else
begin
NotesGroup.Visible := False;
end;
end
else
NotesGroup.Visible := False;
end;
end;
}
if not IsDraw then
Exit;
if GCadForm.FShowCableChannelsOnly then
if not FIsCableChannel then
begin
DrawFigure.Visible := False;
FSingleBlock.Visible := False;
Exit;
end;
DEngine.Canvas.Pen.Mode := pmCopy;
// ïîäëîæêà!
if isFlue then
DEngine.Canvas.Pen.Color := clGray
else
DEngine.Canvas.Pen.Color := FTraceColor;
//Tolik 31/08/2021 -- Ýòî ïåðåíåñåíî ñþäà, ÷òîáû áûëî âûøå, ÷åì îòðèñîâêà ñíàïà, ÷òîáû åñëè íà òðàññó áóäåò ñíàï,
// äàæå åñëè òðàññà âûäåëåíà -- ÷òîáû áûëî âèäíî, ÷òî ñíàï
if not FIsRaiseUpDown then
begin
// ëèíèÿ âûäåëåííàÿ
if Selected then
begin
try
if JoinConnector1 <> nil then
begin
if not JoinConnector1.Selected then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
//Tolik 03/02/2022 --
// EndPointsColor := clGreen
EndPointsColor := $00E8731A
//
else
EndPointsColor := clRed;
DEngine.drawrect(ActualPoints[1].x - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].y - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].x + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].y + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
end;
end;
except
JoinConnector1 := nil;
end;
try
if JoinConnector2 <> nil then
begin
if not JoinConnector2.Selected then
begin
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
//Tolik 03/02/2022 --
// EndPointsColor := clGreen
EndPointsColor := $00E8731A
//
else
EndPointsColor := clRed;
DEngine.drawrect(ActualPoints[2].x - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].y - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].x + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].y + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
end;
end;
except
JoinConnector2 := nil;
end;
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Style := psSolid;
if GCadForm.PCad.Focused then
DEngine.Canvas.Pen.Color := clBlue
else
DEngine.Canvas.Pen.Color := clGray;
end;
end;
{***********************************************}
// îòîáðàæàåòüñÿ êàê òðàññà! (æèðíûé êðàñíûé)
if isTraceShow then
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Width := 2;
DEngine.Canvas.Pen.Color := clRed;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end
else
// âîçìîæíîñòü ïðèâÿçêè! (êðàñíûé)
if (isSnap){ or (InsideCabinet) }then
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Width := 3;
DEngine.Canvas.Pen.Color := clRed;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
//FWasIsSnap := True; test ther
end
else
// òðàññà îòìå÷åíà äëÿ òðàññèðîâêè
if FMarkTracing then
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Width := 3;
DEngine.Canvas.Pen.Style := psDot;
DEngine.Canvas.Pen.Color := clGreen;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end
else
// òðàññà îòìå÷åíà äëÿ çàïðåòà òðàññèðîâêè ÷åðåç íåå
if FDisableTracing then
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Width := 3;
DEngine.Canvas.Pen.Style := psDot;
DEngine.Canvas.Pen.Color := clGray;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end
else
if InsideCabinet then
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Width := 3;
DEngine.Canvas.Pen.Color := $1f7ffa;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end
else
begin
if FIsRaiseUpDown then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
begin
DrawTraceStyle(DEngine);
if Not CmpFloatByCP(ActualZOrder[1], ActualZOrder[2]) then
begin
if FIsVertical then
DEngine.Canvas.Pen.Color := clMaroon
else
DEngine.Canvas.Pen.Color := clLime;
end;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
end;
//FWasIsSnap:=false;
// D0000006113
{ çàêîììåíòèðîâàë ñàìûêîâ 01.11.2013
//(*if FWasIsSnap and Not isSnap then*)
//begin
// DEngine.Canvas.Pen.Width := 3;
// DEngine.Canvas.Pen.Color := GCadForm.PCad.PageColor;
// FWasIsSnap := False;
//end;
}
DEngine.canvas.Brush.Style := bsClear;
{***********************************************}
(* if not FIsRaiseUpDown then
begin
// ëèíèÿ âûäåëåííàÿ
if Selected then
begin
try
if JoinConnector1 <> nil then
begin
if not JoinConnector1.Selected then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
EndPointsColor := clGreen
else
EndPointsColor := clRed;
DEngine.drawrect(ActualPoints[1].x - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].y - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].x + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[1].y + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
end;
end;
except
JoinConnector1 := nil;
end;
try
if JoinConnector2 <> nil then
begin
if not JoinConnector2.Selected then
begin
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
EndPointsColor := clGreen
else
EndPointsColor := clRed;
DEngine.drawrect(ActualPoints[2].x - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].y - dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].x + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
ActualPoints[2].y + dimp_draw / (GCadForm.PCad.ZoomScale / 100),
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
end;
end;
except
JoinConnector2 := nil;
end;
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Style := psSolid;
if GCadForm.PCad.Focused then
DEngine.Canvas.Pen.Color := clBlue
else
DEngine.Canvas.Pen.Color := clGray;
end;
end;
*)
{***********************************************}
// îòîáðàçèòü çàïîëíåííîñòü îáúåêòîâ
// êàáåëè
if GCadForm.FShowCableFullness then
begin
// Side = 1
if FCableFullnessSide1 = cif_None then
EndPointsColor := clBlack;
if FCableFullnessSide1 = cif_Empty then
EndPointsColor := clRed;
if FCableFullnessSide1 = cif_HalfEmpty then
EndPointsColor := clYellow;
if FCableFullnessSide1 = cif_Full then
EndPointsColor := clGreen;
DEngine.drawrect(ActualPoints[1].x - dimp_draw, ActualPoints[1].y - dimp_draw, ActualPoints[1].x + dimp_draw, ActualPoints[1].y + dimp_draw,
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
// Side = 2
if FCableFullnessSide2 = cif_None then
EndPointsColor := clBlack;
if FCableFullnessSide2 = cif_Empty then
EndPointsColor := clRed;
if FCableFullnessSide2 = cif_HalfEmpty then
EndPointsColor := clYellow;
if FCableFullnessSide2 = cif_Full then
EndPointsColor := clGreen;
DEngine.drawrect(ActualPoints[2].x - dimp_draw, ActualPoints[2].y - dimp_draw, ActualPoints[2].x + dimp_draw, ActualPoints[2].y + dimp_draw,
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
DEngine.Canvas.Pen.Color := FTraceColor;
if FIsRaiseUpDown then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
if ActualZOrder[1] <> ActualZOrder[2] then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Color := FTraceColor;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
end;
// êàáåëüíûå êàíàëû
if GCadForm.FShowCableChannelFullness then
begin
// çàêðûòîñòü/îòêðûòîñòü
// Side = 1
if FCableChannelClosedSide1 = cif_None then
EndPointsColor := clBlack;
if FCableChannelClosedSide1 = cif_Empty then
EndPointsColor := clRed;
if FCableChannelClosedSide1 = cif_HalfEmpty then
EndPointsColor := clYellow;
if FCableChannelClosedSide1 = cif_Full then
EndPointsColor := clGreen;
DEngine.drawrect(ActualPoints[1].x - dimp_draw, ActualPoints[1].y - dimp_draw, ActualPoints[1].x + dimp_draw, ActualPoints[1].y + dimp_draw,
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
// Side = 2
if FCableChannelClosedSide2 = cif_None then
EndPointsColor := clBlack;
if FCableChannelClosedSide2 = cif_Empty then
EndPointsColor := clRed;
if FCableChannelClosedSide2 = cif_HalfEmpty then
EndPointsColor := clYellow;
if FCableChannelClosedSide2 = cif_Full then
EndPointsColor := clGreen;
DEngine.drawrect(ActualPoints[2].x - dimp_draw, ActualPoints[2].y - dimp_draw, ActualPoints[2].x + dimp_draw, ActualPoints[2].y + dimp_draw,
EndPointsColor, 1, ord(psSolid), EndPointsColor, ord(bsSolid));
// ñòåïåíü çàïîëíåíîñòè
if FCableChannelFullness = cif_None then
DEngine.Canvas.Pen.Color := clBlack;
if FCableChannelFullness = cif_Empty then
DEngine.Canvas.Pen.Color := clGreen;
if FCableChannelFullness = cif_HalfEmpty then
DEngine.Canvas.Pen.Color := clYellow;
if FCableChannelFullness = cif_Full then
DEngine.Canvas.Pen.Color := clRed;
if FIsRaiseUpDown then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
if ActualZOrder[1] <> ActualZOrder[2] then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
begin
DrawTraceStyle(DEngine);
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
end;
// êàáåëè ñ ïðåâûøàþùåé äëèíîé
if GCadForm.FShowTracesLengthLimit then
begin
if IsLengthAboveLimit then
begin
if FIsRaiseUpDown then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
if ActualZOrder[1] <> ActualZOrder[2] then
begin
DEngine.Canvas.Pen.Width := FTraceWidth;
DEngine.Canvas.Pen.Color := FTraceColor;
end
else
begin
DrawTraceStyle(DEngine);
DEngine.Canvas.Pen.Color := $000080FF;
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
end;
end;
// îòîáðàçèòü ñòåïåíü äåôåêòà
if GCadForm.FShowDefectObjects then
begin
DEngine.Canvas.Pen.Style := psSolid;
if FDefectDegree = dodDefect then
DEngine.Canvas.Pen.Color := clRed;
if FDefectDegree = dodPartDefect then
DEngine.Canvas.Pen.Color := clYellow;
DrawTraceStyle(DEngine);
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
// îòîáðàçèòü îáúåêòû, êîòîðûå íè ê ÷åìó íå ïðèñîåäèíåíû
if GCadForm.FShowDisconnectedObjects then
begin
if CheckTraceNotHaveConnect and Not isSnap then
begin
DrawTraceStyle(DEngine);
//DEngine.Canvas.Pen.Color := clPurple;
DEngine.Canvas.Pen.Width := 3;
DEngine.Canvas.Pen.Color := RGB($80, 0, $FF);
//Tolik -- 11/09/2017 --
isDrawTraceStyle := True;
end;
end;
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
end;
// ÏÐÎÑ×ÅÒ -----------------------------------------------------
for i := 0 to FCount - 1 do
begin
Gap2 := 0;
XGap := 0;
if FCount > 1 then
begin
Gap2 := FGap / 2;
XGap := FGap - ((FGap / (FCount - 1)) * i) - Gap2;
end;
len := sqrt(sqr(x1 - x2) + sqr(y1 - y2));
//if FIsRaiseUpDown and (DrawStyle = dsTrace) then
begin
if self.FDrawFigurePercent <> 0 then
begin
//len := len * (self.FDrawFigurePercent / 100);
len := len;
end;
end;
if len = 0 then
len := 0.01;
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
resx1 := XGap * cos((f - 90) * pi / 180) + x1;
resy1 := XGap * sin((f - 90) * pi / 180) + y1;
resx2 := XGap * cos((f - 90) * pi / 180) + x2;
resy2 := XGap * sin((f - 90) * pi / 180) + y2;
resx3 := XGap * cos((f - 90) * pi / 180) + x3;
resy3 := XGap * sin((f - 90) * pi / 180) + y3;
points[0].x := resx1;
points[0].y := resy1;
points[1].x := resx2;
points[1].y := resy2;
points[2].x := resx3;
points[2].y := resy3;
if (DrawStyle = dsTrace) then
begin
ActualsCount := Length(GTempActualPoints);
for k := 1 to ActualsCount - 2 do
begin
//Tolik 03/02/2022 --
//DEngine.Canvas.Pen.Mode := pmMask;
DEngine.Canvas.Pen.Mode := pmCopy;
DEngine.Canvas.Pen.Color := $00E8731A;
//
DEngine.DrawLine(GTempActualPoints[k], GTempActualPoints[k + 1]);
DEngine.Canvas.Pen.Mode := pmXor;
DEngine.Canvas.Pen.Color := clLime;
end;
//
if GReDrawAfterRefresh then
begin
DEngine.Canvas.Pen.Mode := pmXor;
// *VISIO*
DEngine.DrawLine(points[0], points[1]);
DEngine.DrawLine(points[1], points[2]);
// *VISIO*
GReDrawAfterRefresh := False;
end;
end;
if not FIsRaiseUpDown then
begin
// *VISIO*
if (DrawStyle = dsTrace) and (GCadForm.PCad.ToolIdx = toFigure) then
begin
DEngine.DrawLine(points[0], points[1]);
DEngine.DrawLine(points[1], points[2]);
end
else
begin
if not Self.FIsVertical then
begin
// Tolik 05/09/2017 --
// DEngine.DrawLine(points[0], points[1]);
if CrossList.Count = 0 then
begin
LineColor := DEngine.Canvas.Pen.Color;
if LineColor = clRed then
AlternateTraceColor := getclRed;
if AlternateTraceColor = 0 then
DEngine.DrawLine(points[0], points[1])
else
DEngine.DrawLine(points[0], points[1], AlternateTraceColor, DEngine.Canvas.Pen.Width, ord(DEngine.Canvas.Pen.Style), 0, 3.5, 1.2, False);
end
else
begin
if not isDrawTraceStyle then
SetDrawLineProps;
LinePenStyle := DEngine.Canvas.Pen.Style;
LineWidth := DEngine.Canvas.Pen.Width;
LineColor := DEngine.Canvas.Pen.Color;
if LineColor = clRed then
AlternateTraceColor := getclRed;
//
reg := 0;
// îòðèñîâêó ëèíèè îðèåíòèðóåì îòíîñèòåëüíî (0; 0), ò.êàê ñïèñîê ïåðåñå÷åíèé îòñîðòèðîâàí òàê æå
{FirstLinePoint := Points[0];
LastLinePoint := Points[1];
if CompareValue(sqrt(sqr(Points[0].x) + sqr(Points[0].y)), sqrt(sqr(Points[1].x) + sqr(Points[1].y))) = 1 then
begin
FirstLinePoint := Points[1];
LastLinePoint := Points[0];
end;
}
FirstLinePoint := AP1;
LastLinePoint := AP2;
if CompareValue(sqrt(sqr(AP1.x) + sqr(AP1.y)), sqrt(sqr(AP2.x) + sqr(AP2.y))) = 1 then
begin
{FirstLinePoint := Points[1];
LastLinePoint := Points[0];}
FirstLinePoint := AP2;
LastLinePoint := AP1;
end;
{if LineColor = clRed then
begin
for l := 0 to CrossList.Count - 1 do
begin
if POrthoLineCrossInfo(CrossList[l]).isDrawPoint then
if POrthoLineCrossInfo(CrossList[l]).DrawColor = clRed then
begin
AlternateTraceColor := getclRed;
end;
end;
end;}
PointInfo := POrthoLineCrossInfo(CrossList[0]);
if PointInfo.isDrawPoint then // åñëè ýòî - òî÷êà îòðèñîâêè ïåðåñå÷åíèÿ
begin
{
if isSnap then
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, LineColor,LineWidth,0,0,0,0,reg, p1, p2, true,0)
else
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, PointInfo.DrawColor,LineWidth,0,0,0,0,reg, p1, p2, true,0);
}
if ((PointInfo.isCritical = 1) and ShowCriticalCrossPoints) then
begin
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, clRed,LineWidth,0,0,0,0,reg, p1, p2, true,0)
end
else
begin
if AlternateTraceColor = 0 then
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, LineColor,LineWidth,0,0,0,0,reg, p1, p2, true,0)
else
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, AlternateTraceColor,LineWidth,0,0,0,0,reg, p1, p2, true,0);
end;
DEngine.Canvas.Pen.Color := LineColor;
LinePoint := p1;
LastPoint := p2;
if CompareValue(Sqrt(sqr(FirstLinePoint.x - p1.x) + sqr(FirstLinePoint.y - p1.y)),
Sqrt(sqr(FirstLinePoint.x - p2.x) + sqr(FirstLinePoint.y - p2.y))) = 1 then
begin
LinePoint := p2;
LastPoint := p1;
end;
//DEngine.DrawLine(FirstLinePoint, LinePoint, FDrawColor, FTraceWidth, Ord(FTraceStyle), 0, 3.5, 1.2, False);
if AlternateTraceColor = 0 then
DEngine.DrawLine(FirstLinePoint, LinePoint, LineColor, LineWidth, ord(LinePenstyle), 0, 3.5, 1.2, False)
else
begin
DEngine.DrawLine(FirstLinePoint, LinePoint, AlternateTraceColor, LineWidth, ord(LinePenstyle), 0, 3.5, 1.2, False);
DEngine.Canvas.Pen.Color := LineColor;
end;
end
else // åñëè ïåðåñå÷åíèå íå ðèñóåì
begin
//DEngine.DrawLine(FirstLinePoint, PointInfo.StartPoint, FDrawColor, FTraceWidth, Ord(FTraceStyle),0);
if AlternateTraceColor = 0 then
DEngine.DrawLine(FirstLinePoint, PointInfo.StartPoint, LineColor, LineWidth, ord(LinePenstyle),0)
else
begin
DEngine.DrawLine(FirstLinePoint, PointInfo.StartPoint, AlternateTraceColor, LineWidth, ord(LinePenstyle),0);
DEngine.Canvas.Pen.Color := LineColor;
end;
LastPoint.x := Pointinfo.StartPoint.x;
LastPoint.y := PointInfo.StartPoint.y;
end;
if CrossList.Count > 1 then
begin
for l := 1 to CrossList.Count - 1 do
begin
reg := 0;
PointInfo := POrthoLineCrossInfo(CrossList[l]);
if PointInfo.isDrawPoint then
begin
//DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, FDrawFigureAngle, PI + FDrawFigureAngle, 255,LineWidth,0,0,0,0,reg, p1, p2, true,0);
{ if isSnap then
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, FDrawFigureAngle, PI + FDrawFigureAngle, LineColor,LineWidth,0,0,0,0,reg, p1, p2, true,0)
else
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, FDrawFigureAngle, PI + FDrawFigureAngle, PointInfo.DrawColor,LineWidth,0,0,0,0,reg, p1, p2, true,0);
}
{ if isSnap then
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, LineColor,LineWidth,0,0,0,0,reg, p1, p2, true,0)
else
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, PointInfo.DrawColor,LineWidth,0,0,0,0,reg, p1, p2, true,0);
}
if ((PointInfo.isCritical = 1) and ShowCriticalCrossPoints) then
begin
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, clRed,LineWidth,0,0,0,0,reg, p1, p2, true,0)
end
else
begin
if AlternateTraceColor = 0 then
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, LineColor,LineWidth,0,0,0,0,reg, p1, p2, true,0)
else
DEngine.drawbezarc(PointInfo.StartPoint.x, PointInfo.StartPoint.y, 1, PI + FDrawFigureAngle, FDrawFigureAngle, AlternateTraceColor,LineWidth,0,0,0,0,reg, p1, p2, true,0);
end;
DEngine.Canvas.Pen.Color := LineColor;
LinePoint := p1;
if CompareValue(Sqrt(sqr(FirstLinePoint.x - p1.x) + sqr(FirstLinePoint.y - p1.y)),
Sqrt(sqr(FirstLinePoint.x - p2.x) + sqr(FirstLinePoint.y - p2.y))) = 1 then
begin
LinePoint := p2;
end;
//DEngine.DrawLine(LastPoint, LinePoint{PointInfo.StartPoint}, FDrawColor, FTraceWidth, Ord(FTraceStyle),0);
if AlternateTraceColor = 0 then
DEngine.DrawLine(LastPoint, LinePoint{PointInfo.StartPoint}, LineColor, LineWidth, ord(LinePenstyle),0)
else
begin
DEngine.DrawLine(LastPoint, LinePoint{PointInfo.StartPoint}, AlternateTraceColor, LineWidth, ord(LinePenstyle),0);
DEngine.Canvas.Pen.Color := LineColor;
end;
LastPoint := p1;
if CompareValue(Sqrt(sqr(FirstLinePoint.x - p1.x) + sqr(FirstLinePoint.y - p1.y)),
Sqrt(sqr(FirstLinePoint.x - p2.x) + sqr(FirstLinePoint.y - p2.y))) = -1 then
begin
LastPoint := p2;
end;
end
else
begin
//DEngine.DrawLine(FirstLinePoint, PointInfo.StartPoint, FDrawColor, FTraceWidth, Ord(FTraceStyle),0);
//DEngine.DrawLine(FirstLinePoint, PointInfo.StartPoint, LineColor, LineWidth, ord(LinePenstyle),0);
if AlternateTraceColor = 0 then
DEngine.DrawLine(LastPoint, PointInfo.StartPoint, LineColor, LineWidth, ord(LinePenstyle),0)
else
begin
DEngine.DrawLine(LastPoint, PointInfo.StartPoint, AlternateTraceColor, LineWidth, ord(LinePenstyle),0);
DEngine.Canvas.Pen.Color := LineColor;
end;
LastPoint.x := Pointinfo.StartPoint.x;
LastPoint.y := PointInfo.StartPoint.y;
end;
end;
end;
//DEngine.DrawLine(LastPoint, LastLinePoint, FDrawColor, FTraceWidth, Ord(FTraceStyle),0);
if AlternateTraceColor = 0 then
DEngine.DrawLine(LastPoint, LastLinePoint, LineColor, LineWidth, ord(LinePenstyle),0)
else
begin
DEngine.DrawLine(LastPoint, LastLinePoint, AlternateTraceColor, LineWidth, ord(LinePenstyle),0);
DEngine.Canvas.Pen.Color := LineColor;
end;
end;
//
end;
// *VISIO*
end;
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
if FExistOtherObjectType then
begin
// äîðèñîâàòü äåéñòâóþùóþ
if FObjectType = 1 then
begin
DEngine.Canvas.Pen.color := clBlack;
DEngine.Canvas.Pen.width := 1;
DEngine.Canvas.Pen.Style := psSolid;
DrawActiveTrace(DEngine, points[0], points[1]);
end
else
// äîðèñîâàòü ïðîåêòèðóåìóþ
if FObjectType = 2 then
begin
if GCadForm.FPrintType = pt_Black then
begin
DEngine.Canvas.Pen.color := clBlack;
DEngine.Canvas.Pen.width := 2;
DEngine.Canvas.Pen.Style := psDash;
DrawProjectibleTrace(DEngine, points[0], points[1]);
end
else
if GCadForm.FPrintType = pt_Color then
begin
DEngine.Canvas.Pen.color := clRed;
DEngine.Canvas.Pen.width := 1;
DEngine.Canvas.Pen.Style := psDash;
DrawProjectibleTrace(DEngine, points[0], points[1]);
end;
end;
end;
end;
end;
end;
if AlternateTraceColor <> 0 then
FDrawColor := AlternateTraceColor
else
FDrawColor := DEngine.Canvas.Pen.Color;
FDrawStyle := ord(DEngine.Canvas.Pen.Style);
if FIsVertical then
DrawVertical(DEngine);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Draw', E.Message);
end;
end;
// Tolik -- 19/11/2016 --
// Ñòàðàÿ çàêîììåí÷åíà -- ñì. íèæå
// Çäåñü âûïîëíåíû ïðîâåðêè è íå äîïóñêàåòñÿ óäàëåíèå êîííåêòîðîâ ìàãèñòðàëåé è
// ìåæýòàæíûõ Ñ/Ï, ÷òîáû ïîòîì íå áûëî ïðîáëåì ïîñëå UNDO
class function TOrthoLine.CreateFromShadow(aOwner: TComponent; LHandle: Integer; Shadow: TFigure): TFigure;
var
i, j, ConnIndex, ConnID: integer;
x, y, z: double;
PrevFigure: TFigure;
Connector: TFigure;
isFigure: TFigure;
ConnAsDefault: TConnectorObject;
CableAsDefault: TOrthoLine;
CurrSnapFigure: TFigure;
CurrSavedConn: TConnectorObject;
LastObjectHeight: Double;
SavedConnectorsList: TList;
SavedLinesList: TList;
TypeIndex: Integer;
SavedSnapFigure: TFigure;
StartConn, EndConn: TConnectorObject;
TraceCount: integer;
Res1, Res2: TFigure;
InCab: boolean;
// Tolik
// 27/02/2017 -- äëÿ êîíòðîëü ïðåâûøåíèÿ êîëè÷åñòâà îáúåêòîâ USER
TracedLineCount: Integer;
UserQuotaReached_Message: String;
TraceElectric: Boolean;
CallAutoTraceElectricMaster: Boolean;
CurrEndPoint: TFigure;
ConnectFigList: TList;
SCSCatalog: TSCSCatalog;
SCSComponent: TSCSComponent;
SnapFigureConn: TConnectorObject;
//
SnapGrids,SnapGuides: Boolean;
CanSnapConnectors: Boolean;
LastClickFigure: TFigure;
CadSCSFiguresIDList: TIntList;
BreakedELCableTracing: Boolean;
LastPoint, TmpPoint: TDoublepoint;
CreatedTracesList: TList;
WasCadNoMoveObjects, WasCadNoMoveObjectsPressed: Boolean;
AllTraceList: TList;
FirstConn, LastConn: TConnectorObject;
CableTraceErr: Boolean;
SavedMarkedCadTraceList: TList;
//Tolik 28/08/2025--
isNormbaseCable: Boolean;
SavedDropComponent: TSCSComponent;
//
function CheckIsElComponToConnect(aObject: TConnectorObject):Boolean;
var i: integer;
SCSCatalog: TSCSCatalog;
SCSCompon: TSCSComponent;
begin
Result := False;
if not AObject.Deleted then
begin
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.GetCatalogFromReferencesBySCSID(aObject.ID);
if SCSCatalog <> nil then
begin
for i := 0 to SCSCatalog.ComponentReferences.Count - 1 do
begin
SCSCompon := SCSCatalog.ComponentReferences[i];
if SCSCompon.IsLine = biFalse then
begin
if SCSCompon.IDNetType = 3 then
begin
if F_NormBase.GSCSBase.SCSComponent.CheckJoinTo(SCSCompon,1,0).CanConnect = True then
begin
Result := True;
break;
end;
end;
end;
end;
end;
end;
end;
function CheckCanSnapConnectors(AConntoSnap, currConn: TConnectorObject) : Boolean;
var i, j: Integer;
NextRaiseConnector: TConnectorObject;
isTrunk: Boolean;
JoinedLine: TOrthoLine;
// ïåðåêîííåêòèòü íà ìåæýòàæêå èëè ìàãèñòðàëè
procedure ReconnectWithoutSnap;
var i: Integer;
JoinedLine :TOrthoLine;
begin
for i := 0 to currConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(currConn.JoinedOrtholinesList[i]);
if TConnectorObject(JoinedLine.JoinConnector1).Id = currConn.ID then
JoinedLine.SetJConnector1(AConnToSnap)
else
if TConnectorObject(JoinedLine.JoinConnector2).Id = currConn.ID then
JoinedLine.SetJConnector2(AConnToSnap);
end;
currConn.JoinedOrtholinesList.Clear;
currConn.Delete(True, False);
end;
begin
Result := True;
if (AConntoSnap <> nil) and (not AConnToSnap.Deleted) then
begin
isTrunk := False;
NextRaiseConnector := nil;
if (AConntoSnap.FConnRaiseType = crt_BetweenFloorUp) or (AConntoSnap.FConnRaiseType = crt_BetweenFloorDown) or
(AConntoSnap.FConnRaiseType = crt_TrunkUp) or (AConntoSnap.FConnRaiseType = crt_TrunkDown) then
begin
isTrunk := True;
Result := False;
ReconnectWithoutSnap;
end;
if not isTrunk then
begin
for i := 0 to AConntoSnap.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(AConntoSnap.JoinedOrthoLinesList[i]);
if JoinedLine.FIsRaiseUpDown then
begin
NextRaiseConnector := nil;
if TConnectorObject(JoinedLine.JoinConnector1).ID = AConntoSnap.ID then
NextRaiseConnector := TConnectorObject(JoinedLine.JoinConnector2)
else
if TConnectorObject(JoinedLine.JoinConnector2).ID = AConntoSnap.ID then
NextRaiseConnector := TConnectorObject(JoinedLine.JoinConnector1);
if NextRaiseConnector <> nil then
begin
if (NextRaiseConnector.FConnRaiseType = crt_BetweenFloorUp) or (NextRaiseConnector.FConnRaiseType = crt_BetweenFloorDown) or
(NextRaiseConnector.FConnRaiseType = crt_TrunkUp) or (NextRaiseConnector.FConnRaiseType = crt_TrunkDown) then
begin
isTrunk := True;
Break; //// BREAK ////;
end;
end;
end;
end;
if isTrunk then
begin
Result := False;
ReconnectWithoutSnap;
end;
end;
end;
end;
// Tolik 02/03/2021 --
function GetTypeIndex: integer;
var SCSCatalog: TSCSCatalog;
SCSComponent: TSCSComponent;
begin
Result := 2;
//if not GCallElectricAutoTraceMaster then
if not GAutoAddCableAfterDragDrop then
exit;
//if (LastClickFigure <> nil) and (not GAutoAddCableAfterDragDrop) then
if (LastClickFigure <> nil) then
begin
Result := 1;
exit;
end;
if GSnapFiguresList.Count > 0 then
begin
if GSnapFiguresList[GSnapFiguresList.Count -1] <> nil then
begin
if TFigure(GSnapFiguresList[GSnapFiguresList.Count -1]) is TConnectorObject then
begin
if TConnectorObject(GSnapFiguresList[GSnapFiguresList.Count -1]).ConnectorType = ct_NB then
begin
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TFigure(GSnapFiguresList[GSnapFiguresList.Count -1]).ID);
if SCSCatalog <> nil then
begin
SCSComponent := SCSCatalog.GetFirstComponent;
if SCSComponent <> nil then
begin
if SCSComponent.IDNetType = 3 then
if (SCSComponent.ComponentType.SysName = ctsnShield) or (SCSComponent.ComponentType.SysName = ctsnTerminalBox) then
Result := 1;
end;
end;
end;
end;
end;
end;
end;
function CheckCanCallAutoTraceElectricMaster: Boolean;
var i: integer;
ElComponCount: integer;
SCSCatalog: TSCSCatalog;
SCSCompon: TSCSComponent;
CanConnToLastPoint: Boolean;
begin
Result := False;
ElComponCount := 0;
CanConnToLastPoint := False;
if GCallElectricAutoTraceMaster then
begin
for i := 0 to GSnapFiguresList.Count - 1 do
begin
if GSnapFiguresList[i] <> nil then
begin
if TFigure(GSnapFiguresList[i]) is TConnectorObject then
begin
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TConnectorObject(GSnapFiguresList[i]).ID);
if SCSCatalog <> nil then
begin
SCSCompon := SCSCatalog.GetFirstComponent;
if SCSCompon <> nil then
begin
if SCSCompon.IDNetType = 3 then
begin
inc(ElComponCount);
if GCadForm.FAutoCadMouse then
begin
if GSnapFiguresList[GSnapFiguresList.Count - 1] <> nil then
begin
if i = GSnapFiguresList.Count - 1 then
begin
if (SCSCompon.ComponentType.SysName = ctsnShield) or (SCSCompon.ComponentType.SysName = ctsnTerminalBox) then
CanConnToLastPoint := True;
end;
end
else
begin
if GSnapFiguresList.Count > 2 then
begin
if GSnapFiguresList[GSnapFiguresList.Count - 2] <> nil then
begin
if i = GSnapFiguresList.Count - 2 then
begin
if (SCSCompon.ComponentType.SysName = ctsnShield) or (SCSCompon.ComponentType.SysName = ctsnTerminalBox) then
CanConnToLastPoint := True;
end;
end;
end;
end;
end
else
begin
if GSnapFiguresList[i] <> nil then
begin
if i = GSnapFiguresList.Count - 1 then
begin
if (SCSCompon.ComponentType.SysName = ctsnShield) or (SCSCompon.ComponentType.SysName = ctsnTerminalBox) then
CanConnToLastPoint := True;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
if ((ElComponCount > 1) and CanConnToLastPoint) then
Result := True;
end;
//
// Tolik 04/03/2021 -- try to delete double path connections
Procedure CheckDelOverlappedLines;
var
i, j: integer;
jc1, jc2, jc3, jc4: TConnectorObject;
oldLine, currLine: TOrthoLine;
isBreak: Boolean;
begin
isBreak := True;
while isBreak do
begin
isBreak := False;
for i := 0 to GCadForm.FSCSFigures.Count - 1 do
begin
if TFigure(GCadForm.FSCSFigures[i]) is TOrthoLine then
begin
if not TOrthoLine(GCadForm.FSCSFigures[i]).deleted then
begin
oldLine := TOrthoLine(GCadForm.FSCSFigures[i]);
if CreatedTracesList.IndexOf(oldLine) = -1 then
begin
jc1 := TConnectorObject(oldLine.JoinConnector1);
if jc1.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc1.JoinedConnectorsList[0]).deleted then
jc1 := TConnectorObject(jc1.JoinedConnectorsList[0]); // point
jc2 := TConnectorObject(oldLine.JoinConnector2);
if jc2.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc2.JoinedConnectorsList[0]).deleted then
jc2 := TConnectorObject(jc2.JoinedConnectorsList[0]); // point
for j := CreatedTracesList.Count - 1 downto 0 do
begin
currLine := TOrthoLine(CreatedTracesList[j]);
if currLine.Id <> oldLine.ID then
begin
if not currLine.Deleted then
begin
jc3 := TConnectorObject(currLine.JoinConnector1);
if jc3.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc3.JoinedConnectorsList[0]).deleted then
jc3 := TConnectorObject(jc3.JoinedConnectorsList[0]);
jc4 := TConnectorObject(currLine.JoinConnector2);
if jc4.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc4.JoinedConnectorsList[0]).deleted then
jc4 := TConnectorObject(jc4.JoinedConnectorsList[0]);
if ((jc1.ID = jc3.ID) and (jc2.ID = jc4.ID) or (jc2.ID = jc3.ID) and (jc1.ID = jc4.ID)) then
begin
CreatedTracesList.Remove(currLine);
if SavedLinesList.IndexOf(currLine) <> -1 then
SavedLinesList.Remove(currLine);
currLine.Delete;
isBreak := True;
if CallAutoTraceElectricMaster then
begin
if SavedLinesList.IndexOf(oldLine) = -1 then
begin
oldLine.FMarkTracing := True;
SavedLinesList.Add(oldLine);
end;
end;
end;
end;
end;
end;
if ((CreatedTracesList.Count = 0) or isBreak) then
break;
end;
end;
end;
end;
end;
end;
{ Procedure CheckDelOverlappedLines;
var
i, j: integer;
jc1, jc2, jc3, jc4: TConnectorObject;
oldLine, currLine: TOrthoLine;
begin
for i := GCadForm.FSCSFigures.Count - 1 downto 0 do
begin
if TFigure(GCadForm.FSCSFigures[i]) is TOrthoLine then
begin
if not TOrthoLine(GCadForm.FSCSFigures[i]).deleted then
begin
if CadSCSFiguresIDList.IndexOf(TOrthoLine(GCadForm.FSCSFigures[i]).Id) <> -1 then
break;
currLine := TOrthoLine(GCadForm.FSCSFigures[i]);
// currLineConns
jc1 := TConnectorObject(currLine.JoinConnector1);
if jc1.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc1.JoinedConnectorsList[0]).deleted then
jc1 := TConnectorObject(jc1.JoinedConnectorsList[0]); // point
jc2 := TConnectorObject(currLine.JoinConnector2);
if jc2.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc2.JoinedConnectorsList[0]).deleted then
jc2 := TConnectorObject(jc2.JoinedConnectorsList[0]); // point
for j := 0 to GCadForm.FSCSfigures.Count - 1 do
begin
if TFigure(GCadForm.FSCSfigures[j]) is TOrthoLine then
begin
if not TOrthoLine(GCadForm.FSCSfigures[j]).deleted then
begin
if TOrthoLine(GCadForm.FSCSfigures[j]).ID <> currLine.Id then
begin
oldLine := TOrthoLine(GCadForm.FSCSfigures[j]);
if not OldLine.deleted then
begin
jc3 := TConnectorObject(OldLine.JoinConnector1);
if jc3.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc3.JoinedConnectorsList[0]).deleted then
jc3 := TConnectorObject(jc3.JoinedConnectorsList[0]);
jc4 := TConnectorObject(OldLine.JoinConnector2);
if jc4.JoinedConnectorsList.Count > 0 then
if not TConnectorObject(jc4.JoinedConnectorsList[0]).deleted then
jc4 := TConnectorObject(jc4.JoinedConnectorsList[0]);
if ((jc1.ID = jc3.ID) and (jc2.ID = jc4.ID) or (jc2.ID = jc3.ID) and (jc1.ID = jc4.ID)) then
begin
if SavedLinesList.IndexOf(currLine) <> -1 then
SavedLinesList.Remove(currLine);
currLine.Delete;
if CallAutoTraceElectricMaster then
begin
oldLine.FMarkTracing := True;
if SavedLinesList.IndexOf(oldLine) = -1 then
SavedLinesList.Add(oldLine);
end;
break;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
}
function isLastELShied: Boolean;
var SCSCatalog: TSCSCatalog;
SCSCompon: TSCSComponent;
begin
Result := False;
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(LastClickFigure.ID);
if SCSCatalog <> nil then
begin
SCSCompon := SCSCatalog.GetFirstComponent;
if SCScompon <> nil then
if SCSCompon.IDNetType = 3 then
if SCSCompon.ComponentType.SysName = ctsnShield then
Result := True;
end;
end;
//Tolik 08/06/2021 --
Procedure SaveDropCadMarkedTraces;
var i: integer;
MarkedLine: TOrthoLine;
begin
for i := 0 to GCadForm.FSCSFigures.Count - 1 do
begin
if CheckFigureByClassName(TFigure(GCadForm.FSCSFigures[i]), CTOrthoLine) then
begin
MarkedLine := TOrthoLine(GCadForm.FSCSFigures[i]);
if not MarkedLine.Deleted then
if MarkedLine.FMarkTracing then
if SavedMarkedCadTraceList.IndexOf(MarkedLine) = -1 then
SavedMarkedCadTraceList.Add(MarkedLine);
end;
end;
for i := 0 to SavedMarkedCadTraceList.Count - 1 do
TOrthoLine(SavedMarkedCadTraceList[i]).FMarkTracing := False;
end;
Procedure RestoreCadMarkedTraces;
var i, j: integer;
MarkedLine: TOrthoLine;
begin
for i := 0 to SavedMarkedCadTraceList.Count - 1 do
begin
MarkedLine := TOrthoLine(SavedMarkedCadTraceList[i]);
if not MarkedLine.Deleted then
begin
for j := 0 to GCadForm.FSCSFigures.Count - 1 do
begin
if TFigure(GCadForm.FSCSFigures[j]).ID = MarkedLine.ID then
begin
MarkedLine.FMarkTracing := True;
break;
end;
end;
end;
end;
SavedMarkedCadTraceList.free;
end;
//
begin
GisOrthoLineHadow := True; // Tolik 27/08/2021 -- ôëàæîê, ÷òîáû ïîêàçàòü, ÷òî â äàííûé ìîìåíò ñîçäàåòñÿ òðàññà
// (íóæåí, ÷òîáû ñáðîñèòü ïðîâåðêó êîííåêòîðîâ íà ñíàïå)
Result := nil;
//Tolik 28/08/2025 --
isNormbaseCable := false;
if F_NormBase.GSCSBase.SCSComponent <> nil then
begin
isNormbaseCable := IsCableComponent(F_NormBase.GSCSBase.SCSComponent);
end;
SavedDropComponent := GDropComponent;
GDropComponent := nil;
//
SavedMarkedCadTraceList := TList.Create;
SaveDropCadMarkedTraces; // ñîõðàíèòü ñïèñîê è ñáðîñèòü (îòìå÷åííûõ äëÿ òðàññèðîâêè òðàññ íà êàäå)
// Tolik 01/04/2021 -- ïîêà êîñòûëü, ÷òîáû íå ñäâèãàëî ïîäêëþ÷åííûå ïðè ñîçäàíèè òðàññ, íóæíî ïåðåñìîòåðòü è äîäåëàòü ÏÐÀÂÈËÜÍÎ
WasCadNoMoveObjects := GCadForm.FNoMoveConnectedObjects;
WasCadNoMoveObjectsPressed := GCadForm.tbNoMoveConnectedObjects.Down;
GCadForm.FNoMoveConnectedObjects := True;
GCadForm.tbNoMoveConnectedObjects.Down := True;
//
CreatedTracesList := TList.Create;
BreakedELCableTracing := False;
//GCallAutoTraceElectricMaster := False;
//Tolik 03/03/2021 --
LastClickFigure := nil;
if GSnapFiguresList.Count > 1 then
if GSnapFiguresList[GSnapFiguresList.Count - 1] <> nil then
LastClickFigure := TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]);
{ if GOrthoStatus and (LastClickFigure <> nil) then
begin
if GClickIndex > 1 then
begin
if isLastELShied then
begin
if (GSnapFiguresList[GSnapFiguresList.Count - 1 ] <> nil) and (GSnapFiguresList[GSnapFiguresList.Count - 2] <> nil) then
begin
if (GOrthoStatus) and (GFigureTraceTo <> nil) and CheckFigureByClassName(GFigureTraceTo, cTConnectorObject) then
begin
//if not (DoubleCMP(Shadow.OriginalPoints[1].x, Shadow.OriginalPoints[3].x)) and not (DoubleCMP(Shadow.OriginalPoints[1].y, Shadow.OriginalPoints[3].y)) then
if ((CompareValue(Shadow.ActualPoints[GClickIndex].x, Shadow.ActualPoints[GClickIndex - 1].x) <> 0) and
(CompareValue(Shadow.ActualPoints[GClickIndex].y, Shadow.ActualPoints[GClickIndex - 1].y) <> 0)) then
begin
//Tolik -- 20/04/2017 -- äëÿ îðòîãîíàëüíûõ òðàññ äîáàâëÿòü ëèøíþþ òî÷êó òîëüêî, åñëè
// ííå áûëà çàæàòà êëàâèøà SHIFT -- èíà÷å òðàññà áûòåò ñòðîèòüñÿ òî÷íî îò îáúåêòà ê îáúåêòó è ïðîìåæóòî÷íàÿ
// (îðòîãîíàëüíàÿ) òî÷êà â òàêîì ñëó÷àå íå íóæíà
if not (ssShift in GGlobalShiftState) then
begin
LastPoint := Shadow.ActualPoints[GClickIndex];
TmpPoint.x := Shadow.ActualPoints[GClickIndex - 1].x;
TmpPoint.y := Shadow.ActualPoints[GClickIndex].y;
TmpPoint.z := Shadow.ActualPoints[GClickIndex].z;
Shadow.ActualPoints[GClickIndex + 1] := LastPoint;
Shadow.ActualPoints[GClickIndex] := TmpPoint;
GSnapFiguresList.Insert(GSnapFiguresList.Count, nil);
GTempActualPoints[GClickIndex] := TmpPoint;
GTempActualPoints[GClickIndex + 1] := LastPoint;
inc(GClickIndex);
//GLastClickOrtho := True;
end;
end;
end;
end;
end;
end;
end;
}
TraceElectric := False;
if GCallElectricAutoTraceMaster then
if GAutoAddCableAfterDragDrop then
if F_NormBase.GSCSBase.SCSComponent <> nil then
if F_NormBase.GSCSBase.SCSComponent.ID <> 0 then
if isCableComponent(F_NormBase.GSCSBase.SCSComponent) then
if F_NormBase.GSCSBase.SCSComponent.IDNetType = 3 then
TraceElectric := True;
CallAutoTraceElectricMaster := false;
if TraceElectric then
CallAutoTraceElectricMaster := CheckCanCallAutoTraceElectricMaster;
//
incab := false;
if GCadform.PCad.SnapToGrids then
SnapGrids := True
else
SnapGrids := False;
if GCadform.PCad.SnapToGuides then
SnapGuides := True
else
SnapGuides := False;
//------------------------------------
if GWasShiftOnTraceCreate then
begin
GCadform.PCad.SnapToGrids := false;
GCadform.PCad.SnapToGuides := false;
end;
//Tolik 04/03/2021 --
CadSCSFiguresIDList := TIntList.Create;
for i := 0 to GCadForm.FSCSFigures.Count - 1 do
begin
if TFigure(GCadForm.FSCSFigures[i]) is TOrthoLine then
CadSCSFiguresIDList.Add(TOrthoLine(GCadForm.FSCSFigures[i]).ID);
end;
//
BeginProgress;
try
SavedConnectorsList := TList.Create;
SavedLinesList := TList.Create;
Result := nil;
Connector := nil;
PrevFigure := nil;
GTraceStatus := True;
// Tolik -- 18/11/2015
TraceCount := 0;
//
if GClickIndex > 1 then
begin
if not TraceElectric then // Tolik 22/03/2021 --
if GCadForm.FAutoCadMouse then
begin
if GLastClickOrtho then
begin
//Tolik 06/09/2021 --
//GClickIndex := GClickIndex - 1;
if GSnapFiguresList.Count = GClickIndex then
if GSnapFiguresList[GClickIndex - 1] = nil then
GClickIndex := GClickIndex - 1;
end;
end;
end;
if (((GCadForm.FAutoCadMouse) and ((GClickIndex >= 3) or ((GClickIndex >= 2) and (LastClickFigure <> nil)))) or
//Tolik 07/09/2021 --
//((not GCadForm.FAutoCadMouse) and (GClickIndex >= 2))) then
((not GCadForm.FAutoCadMouse) and ((GClickIndex >= 2) or ((GClickIndex = 2) and (LastClickFigure <> nil))))) then
//
begin
if GCadForm.FAutoCadMouse then
// Tolik 02/03/2021 -- çäåñü, åñëè áóäåì âåñòè ýëåêòðèêó è ïîñëåäíèé êëèê áóäåí íà ùèòêå èëè êîðîáêå -
// íóæíî ÷òîáû è äî íåãî ïîñòðîèëàñü òðàññà, ïîýòîìó èíäåêñ íóæíî áóäåò ïðîñ÷èòàòü
//TypeIndex := 2
//
TypeIndex := GetTypeIndex
else
TypeIndex := 1;
// *UNDO*
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
// Tolik -- 18/11/2015 -- ïðîèíèöèàëèçèðîâàíî, íî íå òàì...â ñàìîì íà÷àëå íóæíî, à òî åñëè â ýòî óñëîâèå íå ïîïàäåì
// à ýòà ïåðåìåííàÿ þçàåòñÿ è âíå óñëîâèÿ -- ïîëó÷àåì áÿêó
// TraceCount := 0;
//
Res1 := nil;
Res2 := nil;
if F_ProjMan.GSCSBase.CurrProject.Setting.FirstTraceCreated then
SetUserLineHeightForAllProj;
// Îñíîâíîé öèêë ñîçäàíèÿ òðàññû
for i := 1 to GClickIndex - TypeIndex do
begin
//----- Connectors -------------------------------------------------------
Connector := TConnectorObject.Create(Shadow.ActualPoints[i].x, Shadow.ActualPoints[i].y, GCadForm.FLineHeight,
LHandle, mydsNormal, aOwner);
TConnectorObject(Connector).ConnectorType := GCurrentConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Connector, false);
SavedConnectorsList.Add(Connector); // Saved
SetConnBringToFront(TConnectorObject(Connector));
// ïðèâÿçêà êîíåêòîðà ê äðóãîé ëèíèè
if PrevFigure <> nil then
TOrthoLine(PrevFigure).SetJConnector2(Connector);
//----- OrthoLine ---------------------------------------------------------
Result := TOrthoLine.Create(Connector.ActualPoints[1].x, Connector.ActualPoints[1].y, GCadForm.FLineHeight,
Shadow.ActualPoints[i + 1].x, Shadow.ActualPoints[i + 1].y, GCadForm.FLineHeight,
1, ord(psSolid), clBlack, 0, LHandle, mydsNormal, aOwner);
TraceCount := TraceCount + 1;
if i = 1 then
Res1 := Result;
if i = (GClickIndex - TypeIndex) then
Res2 := Result;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Result, false);
SavedLinesList.Add(Result); // Saved
TOrtholine(Result).SetJConnector1(Connector);
PrevFigure := Result;
GCadForm.PCad.OrderFigureToFront(TOrtholine(Result).CaptionsGroup);
CreatedTracesList.Add(Result);
end;
//-----Connectors ----------------------------------------------------------
Connector := TConnectorObject.Create(Shadow.ActualPoints[i].x, Shadow.ActualPoints[i].y, GCadForm.FLineHeight,
LHandle, mydsNormal, aOwner);
TConnectorObject(Connector).ConnectorType := GCurrentConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Connector, False);
SavedConnectorsList.Add(Connector); // Saved
SetConnBringToFront(TConnectorObject(Connector));
// ïðèâÿçêà êîíåêòîðà ê äðóãîé ëèíèè
TOrtholine(Result).SetJConnector2(Connector);
// ïåðåñòàâèòü âûñîòû ñ ñîîòâåòñòâèåì ñ ðàçìåùåíèåì ìåæäó ÐÌ
if GCadForm.FAutoPosTraceBetweenRM then
AutoPosTracesBetweenRM(SavedConnectorsList, SavedLinesList, GSnapFiguresList);
// Tolik -- 06/11/2016-- !!!!
While GSnapFiguresList.Count < SavedConnectorsList.Count do
GSnapFiguresList.Add(Nil);
//
// âîçìîæíîñòü ïîäâÿçêè!
for i := 0 to SavedConnectorsList.Count - 1 do
begin
//Tolik 09/02/2021 --
if GSnapFiguresList[i] <> nil then
begin
//
GMovedByOtherObject := True;
CurrSavedConn := TConnectorObject(SavedConnectorsList[i]);
CurrSnapFigure := TFigure(GSnapFiguresList[i]);
GFigureSnap := CurrSnapFigure;
// ×åðåç Ëèíèþ
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
begin
CheckingSnapConnectorToOrtholine(CurrSavedConn, TOrthoLine(GFigureSnap));
end
// ×åðåç Äîì
else if CheckFigureByClassName(GFigureSnap, cTHouse) then
begin
SnapConnectorToHouse(CurrSavedConn, THouse(GFigureSnap));
end
// ×åðåç ÒÎ
else if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
begin
// ×åðåç ïóñòîé ñîåäèíèòåëü
if TConnectorObject(GFigureSnap).ConnectorType = ct_Clear then
begin
SavedSnapFigure := GFigureSnap;
ConnID := TConnectorObject(SavedSnapFigure).ID;
// Tolik -- 19/11/2016 -- ÷òîáû íå ïîëîìàòü ìåæýòàæêè/ìàãèñòðàëè
if CheckCanSnapConnectors(TConnectorObject(GFigureSnap), CurrSavedConn) then
//
begin
if GUseVerticalTraces then
CheckingSnapConnectorToConnector(CurrSavedConn, TConnectorObject(GFigureSnap))
else
begin // Tolik 11/11/2019 -- åñëè íåëüçÿ èñïîëüçîâàòå âåðòèêàëüíûå òðàññû
CheckingSnapConnectorToConnector(CurrSavedConn, TConnectorObject(GFigureSnap), true);
end;
end;
//Tolik 27/08/2021 --
{
if SavedSnapFigure <> nil then
begin
if SavedSnapFigure.Deleted then
begin
SavedSnapFigure := TFigure(CurrSavedConn);
for j := 0 to GCadForm.FSCSFigures.Count - 1 do
begin
if CheckFigureByClassName(GCadForm.FSCSFigures[j], cTOrthoLine) then
begin
if Assigned(TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector1) then
if TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector1.Id = ConnID then
TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector1 := TFigure(CurrSavedConn);
if Assigned(TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector2) then
if TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector2.Id = ConnID then
TOrthoLine(GCadForm.FSCSFigures[j]).JoinConnector2 := TFigure(CurrSavedConn);
end;
end;
end;
end;
}
//
GFigureSnap := SavedSnapFigure;
end
else
// ×åðåç Îáúåêò
begin
SavedSnapFigure := GFigureSnap;
(* if TConnectorObject(CurrSavedConn).ActualZOrder[1] <> TConnectorObject(GFigureSnap).ActualZOrder[1] then
begin
//Tolik -- 21/04/2017
// â çàâèñèìîñòè îò ñîñòîÿíèÿ GWasShiftOnTraceCreate áóäåì äâèãàòü èëè îáúåêò ê êîííåêòîðó èëè êîííåêòîð ê îáúåêòó
if (TConnectorObject(GFigureSnap).JoinedConnectorsList.Count = 0) and
(TConnectorObject(GFigureSnap).JoinedOrtholinesList.Count = 0) then
begin
// Tolik 17/03/2021 -- çíà÷åíèå Øèôòà äëÿ îòðèñîâêè òðàññ ìû ïåðåâåðíóëè, òàê ÷òî è óñëîâèå çäåñü ïîìåíÿåè
// if GWasShiftOnTraceCreate then
if not GWasShiftOnTraceCreate then
{ TConnectorObject(CurrSavedConn).MoveConnector(GFigureSnap.ActualPoints[1].x - TConnectorObject(CurrSavedConn).ActualPoints[1].x,
GFigureSnap.ActualPoints[1].y - TConnectorObject(CurrSavedConn).ActualPoints[1].y
false, false)
else
TConnectorObject(GFigureSnap).MoveConnector(CurrSavedConn.ActualPoints[1].x - TConnectorObject(GFigureSnap).ActualPoints[1].x,
CurrSavedConn.ActualPoints[1].y - TConnectorObject(GFigureSnap).ActualPoints[1].y
false, false);
}
TConnectorObject(CurrSavedConn).MoveConnector(GFigureSnap.ActualPoints[1].x - TConnectorObject(CurrSavedConn).ActualPoints[1].x,
GFigureSnap.ActualPoints[1].y - TConnectorObject(CurrSavedConn).ActualPoints[1].y,
false, false)
else
TConnectorObject(GFigureSnap).MoveConnector(CurrSavedConn.ActualPoints[1].x - TConnectorObject(GFigureSnap).ActualPoints[1].x,
CurrSavedConn.ActualPoints[1].y - TConnectorObject(GFigureSnap).ActualPoints[1].y,
false, false);
end;
{
if (TConnectorObject(GFigureSnap).JoinedConnectorsList.Count = 0) and
(TConnectorObject(GFigureSnap).JoinedOrtholinesList.Count = 0) then
TConnectorObject(GFigureSnap).MoveConnector(CurrSavedConn.ActualPoints[1].x - TConnectorObject(GFigureSnap).ActualPoints[1].x,
CurrSavedConn.ActualPoints[1].y - TConnectorObject(GFigureSnap).ActualPoints[1].y
false, false);
}
end
// Tolik 03/05/2017 --
else
begin
//if not GConnectTraceOnClickPoint then
//if GMoveRouteToPointObject then
if ((GConnectTraceOnClickPoint and GMoveRouteToPointObject) or (not GConnectTraceOnClickPoint)) then
begin
if GFigureSnap <> nil then
begin
if GWasShiftOnTraceCreate then
TConnectorObject(CurrSavedConn).MoveConnector(GFigureSnap.ActualPoints[1].x - TConnectorObject(CurrSavedConn).ActualPoints[1].x,
GFigureSnap.ActualPoints[1].y - TConnectorObject(CurrSavedConn).ActualPoints[1].y,
false, false)
else
begin
// 07/04/2021 --
//TConnectorObject(GFigureSnap).MoveConnector(CurrSavedConn.ActualPoints[1].x - TConnectorObject(GFigureSnap).ActualPoints[1].x,
// CurrSavedConn.ActualPoints[1].y - TConnectorObject(GFigureSnap).ActualPoints[1].y, false, false);
if CompareValue(TConnectorObject(GFigureSnap).ActualZOrder[1], CurrSavedConn.ActualZOrder[1]) = 0 then // åñëè íà îäíîé âûñîòå - âûðàâíèâàíèå ïî íàñòðîéêàì
begin
if (GConnectTraceOnClickPoint and GMoveRouteToPointObject) then
TConnectorObject(CurrSavedConn).MoveConnector(GFigureSnap.ActualPoints[1].x - TConnectorObject(CurrSavedConn).ActualPoints[1].x,
GFigureSnap.ActualPoints[1].y - TConnectorObject(CurrSavedConn).ActualPoints[1].y,
false, false)
end
else
begin // åñëè âûñîòû ðàçíûå - âûðàâíèâàåì êëèê ïî ôèãóðå, íà êîòîðîé îí ïðîèçîøåë, ò.ê. ïîñòðîèòñÿ ðàéç èëè âåðòèêàëü
TConnectorObject(CurrSavedConn).MoveConnector(TConnectorObject(GFigureSnap).ActualPoints[1].x - CurrSavedConn.ActualPoints[1].x,
TConnectorObject(GFigureSnap).ActualPoints[1].y - CurrSavedConn.ActualPoints[1].y, false, false);
end;
end;
end;
end;
end;
*)
GFigureSnap := SavedSnapFigure;
// Tolik 11/11/2019 --
//CheckingSnapConnectorToPointObject(CurrSavedConn, TConnectorObject(GFigureSnap), False);
if GUseVerticalTraces then
// Tolik 12/04/2021 --
//CheckingSnapConnectorToPointObject(CurrSavedConn, TConnectorObject(GFigureSnap), False)
CheckingSnapConnectorToPointObject(CurrSavedConn, TConnectorObject(GFigureSnap), True)
//
else
begin // åñëè çàïðåùåíû âåðòèêàëüíûå òðàññû, äåëàåì òàê, ÷òîáû êîíåö òðàññû ïðèñîåäèíèëñÿ ê êîííåêòîðó íà åãî âûñîòå,
// è íå îêàçàëñÿ ïðîñòî îòîðâàííûì èëè íåïðèñîåäèíåííûì (ïî-ëþáîìó)
//CheckingSnapPointObjectToConnector(TConnectorObject(GFigureSnap), CurrSavedConn, False, False, True);
CheckingSnapPointObjectToConnector(TConnectorObject(GFigureSnap), CurrSavedConn, False, True, False);
end;
//
end;
end;
end;
GMovedByOtherObject := False;
end;
/// **********************************************************************
if GCadForm.FAutoPosTraceBetweenRM then
AutoPosTracesBetweenRMAfterSnap(SavedLinesList);
// î÷èñòèòü ïðèâÿçêè
for i := 0 to GSnapFiguresList.Count - 1 do
begin
CurrSnapFigure := TFigure(GSnapFiguresList[i]);
if CheckFigureByClassName(CurrSnapFigure, cTOrthoLine) then
TOrthoLine(CurrSnapFigure).isSnap := False
else if CheckFigureByClassName(CurrSnapFigure, cTConnectorObject) then
TConnectorObject(CurrSnapFigure).isSnap := False;
end;
//31.01.2011 Åñëè îäíèì êóñêîì òðàññû ñîåäèíèëè ïîäúåçäû îäíîãî äîìà, òî òðàññó ðàçáèâàåì íà äâà ó÷àñòêà
if ((GClickIndex-TypeIndex) = 1) then
AutoDivideLine(TOrthoLine(Result)); //31.01.2011 - ðàçäåëÿåì ëèíèþ åñëè íóæíî
// Tolik 21/03/2018 --
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes1 + FormatFloat(ffMask, MetreToUOM(GCadForm.FLineHeight)) + cCadClasses_Mes2);
end;
// *UNDO*
// Tolik 03/03/2021 -- //GCadForm.FCanSaveForUndo := True;
for i := 0 to SavedLinesList.Count - 1 do
begin
CurrSnapFigure := TFigure(SavedLinesList[i]);
if CheckFigureByClassName(CurrSnapFigure, cTOrtholine) then
begin
GCadForm.PCad.CheckFigureInsideCabinet(GCadForm.FCheckedFigures ,CurrSnapFigure);
if TOrtholine(CurrSnapFigure).InsideCabinet then
begin
incab := true;
break;
end;
end;
end;
////////////////////////////////////////////////
//if SavedConnectorsList <> nil then
// FreeAndNil(SavedConnectorsList);
if SavedLinesList <> nil then
// Tolik 13/09/2017 --
begin
if GCadForm.FListSettings.ShowTracesCrossPoints > 0 then
begin
for i := 0 to SavedLinesList.Count - 1 do
begin
if checkFigureByClassName(TFigure(SavedLinesList[i]), cTOrthoLine) then
begin
if not TOrthoLine(SavedLinesList[i]).FIsVertical then
if not TOrthoLine(SavedLinesList[i]).FIsRaiseUpDown then
if GCadForm.FListSettings.ShowTracesCrossPoints > 0 then
begin
DropCalcCrosses(TOrthoLine(SavedLinesList[i]), False);
end;
end;
end;
end;
end;
//
CheckDelOverlappedLines; // Tolik 04/03/2021 --
if not GNoTraceCable then // Tolik 01/10/2021 --
begin
if not CallAutoTraceElectricMaster then // åñëè ëîæèì êàáåëü, òî ëîæèòü òîëüêîâ òîì ñëó÷àå, åñëè íå áóäåì âûçûâàòü ìàñòåð àâòîòðàññèðîâêè ýëåêòðèêè
begin
if GAutoAddCableAfterDragDrop then
begin
if F_NormBase.GSCSBase.SCSComponent <> nil then
if F_NormBase.GSCSBase.SCSComponent.ID <> 0 then
if isCableComponent(F_NormBase.GSCSBase.SCSComponent) then
if F_NormBase.GSCSBase.SCSComponent.IDNetType = 3 then
GDropComponent := F_NormBase.GSCSBase.SCSComponent;
//if (GDropComponent <> nil) and (GDropComponent.IsLine = 1) then
//if (GDropComponent <> nil) and (GDropComponent.ID <> 0) and (GDropComponent.IsLine = 1) then
if (GDropComponent <> nil) and (GDropComponent.ID <> 0) and (GDropComponent.IsLine = 1) and (GDropComponent.IdNetType = 3) then
begin
if isCableComponent(GDropComponent) and (GDropComponent.IDNetType = 3) and (GSnapFiguresList[0] <> nil) then // äëÿ ýëåêòðèêè ïðîëîæèòü èëè ïî òðàññàì èëè, åñëè åñòü ïåðâûé è ïîñëåäíèé îáúåêò - òî
begin // íå ïðîñòî ïî òðàññàì, à ïî ïóòè ìåæäó íèìè, âêëþ÷àþùåìó ñîçäàííûå òðàññû
if TFigure(GSnapFiguresList[0]) is TConnectorObject then
begin
FirstConn := TConnectorObject(GSnapFiguresList[0]);
LastConn := nil;
CableTraceErr := True;
for i := 1 to GSnapFiguresList.Count - 1 do // Can Connect Anyone?
begin
if GSnapFiguresList[i] <> nil then
begin
if TFigure(GSnapFiguresList[i]) Is TConnectorObject then
begin
CableTraceErr := false;
break;
end;
end;
end;
if not CableTraceErr then
begin
if GConnectEndPoints then // ñîåäèíÿòü òîëüêî êðàéíèå
begin
for I := GSnapFiguresList.Count - 1 downto 1 do
begin
if GSnapFiguresList[i] <> nil then
if TFigure(GSnapFiguresList[i]) is TConnectorObject then
begin
LastConn := TConnectorObject(GSnapFiguresList[i]);
break;
end;
end;
if (LastConn <> nil) and (LastConn.ID <> FirstConn.ID) then
begin
CableTraceErr := True;
if CheckIsElComponToConnect(LastConn) then
begin
if CheckIsElComponToConnect(FirstConn) then
begin
CableTraceErr := false;
for i := 0 to SavedLinesList.Count - 1 do
TOrthoLine(SavedLinesList[i]).FMarkTracing := True;
AllTraceList := GetAllTraceInCADByMarked(LastConn, FirstConn);
if (AllTraceList <> nil) and (AllTraceList.Count > 0) then
begin
for i := 0 to TList(AllTraceList[0]).Count - 1 do
begin
if TFigure(TList(AllTraceList[0])[i]) is TOrthoLine then
begin
CopyComponentToSCSObject(TOrthoLine(TList(AllTraceList[0])[i]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(TList(AllTraceList[0])[i]).ID);
end;
end;
end
else
CableTraceErr := True;
end;
end;
// if err then message!!!
end
else
begin
for i := 0 to SavedLinesList.Count - 1 do
begin
CopyComponentToSCSObject(TOrthoLine(SavedLinesList[i]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(SavedLinesList[i]).ID);
end;
end;
end
else
begin // ñîåäèíÿòü âñå ïîäðÿä
begin
for i := 0 to SavedLinesList.Count - 1 do
TOrthoLine(SavedLinesList[i]).FMarkTracing := True;
firstConn := nil;
LastConn := nil;
for i := 0 to GSnapFiguresList.Count - 1 do
begin
if GSnapFiguresList[i] <> nil then
begin
if TFigure(GSnapFiguresList[i]) is TConnectorObject then
begin
LastConn := TConnectorObject(GSnapFiguresList[i]);
if LastConn.ConnectorType = ct_NB then
begin
if FirstConn <> nil then
begin
if (CheckIsElComponToConnect(LastConn) and CheckIsElComponToConnect(FirstConn)) then
begin
//LastConn
//AllTraceList := GetAllTraceInCADByMarked(LastConn, FirstConn);
AllTraceList := GetAllTraceInCADByMarked(FirstConn, LastConn);
if (AllTraceList <> nil) and (AllTraceList.Count > 0) then
begin
for j := 0 to TList(AllTraceList[0]).Count - 1 do
begin
if TFigure(TList(AllTraceList[0])[j]) is TOrthoLine then
begin
CopyComponentToSCSObject(TOrthoLine(TList(AllTraceList[0])[j]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(TList(AllTraceList[0])[j]).ID);
end;
end;
end
else
begin
if not CableTraceErr then
CableTraceErr := True;
end;
end
else
begin
if not CableTraceErr then
CableTraceErr := True;
end;
FirstConn := LastConn;
LastConn := nil;
end
else
begin
FirstConn := LastConn;
LastConn := nil;
end;
end;
end;
end;
end;
end;
end;
end
else
begin // No Points To Connect (Only 1)
for i := 0 to SavedLinesList.Count - 1 do
begin
CopyComponentToSCSObject(TOrthoLine(SavedLinesList[i]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(SavedLinesList[i]).ID);
end;
end;
end;
if CableTraceErr then
begin
if SavedLinesList.Count > 0 then
begin
PauseProgress(true);
ShowMessage(cPeMes23);
PauseProgress(false);
end;
end;
end
else
begin
for i := 0 to SavedLinesList.Count - 1 do
begin
CopyComponentToSCSObject(TOrthoLine(SavedLinesList[i]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(SavedLinesList[i]).ID);
end;
end;
end;
//GDropComponent := nil;// 25/03/2021 -- Tolik
//GAutoAddCableAfterDragDrop := false;
for i := 0 to SavedLinesList.Count - 1 do
TOrthoLine(SavedLinesList[i]).FMarkTracing := False;
end;
end;
end
else
GNoTraceCable := false;
//CheckDelOverlappedLines; // Tolik 04/03/2021 --
GCadForm.PCad.KillTraceFig(False);
GCadForm.PCad.NeedRefresh := True; // Tolik 23/03/2021 --
GCadForm.PCad.Refresh; // Tolik 04/03/2021 --
// Tolik 03/03/2021 --
if CallAutoTraceElectricMaster then
begin
GCadForm.FCanSaveForUndo := False;
PauseProgress(true);
GCadForm.PCad.DeselectAll(2);
for i := 0 to SavedLinesList.Count - 1 do
TOrthoLine(SavedLinesList[i]).FMarkTracing := True;
ConnectFigList := TList.Create;
for i := 0 to GSnapFiguresList.Count - 1 do
begin
if GSnapFiguresList[i] <> nil then
begin
if TFigure(GSnapFiguresList[i]) is TConnectorObject then
SnapFigureConn := TConnectorObject(GSnapFiguresList[i]);
if SnapFigureConn.ConnectorType = ct_Clear then
if SnapFigureConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(SnapFigureConn.JoinedConnectorsList[0]).ConnectorType = ct_NB then
SnapFigureConn := TConnectorObject(SnapFigureConn.JoinedConnectorsList[0]);
if SnapFigureConn.ConnectorType = ct_NB then
begin
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(SnapFigureConn.ID);
if SCSCatalog <> nil then
begin
SCSComponent := SCSCatalog.GetFirstComponent;
if SCSComponent <> nil then
if SCSComponent.IDNetType = 3 then
SnapFigureConn.Select;
end;
end;
end;
end;
{
for i := 0 to SavedConnectorsList.Count - 1 do
begin
if TConnectorObject(SavedConnectorsList[i]).ConnectorType = CT_Nb then
TConnectorObject(SavedConnectorsList[i]).Select
else
if TConnectorObject(SavedConnectorsList[i]).ConnectorType = ct_Clear then
if TConnectorObject(SavedConnectorsList[i]).JoinedConnectorsList.Count > 0 then
if TConnectorObject(TConnectorObject(SavedConnectorsList[i]).JoinedConnectorsList[0]).ConnectorType = ct_Nb then
TConnectorObject(TConnectorObject(SavedConnectorsList[i]).JoinedConnectorsList[0]).Select;
end;
}
//GCadForm.PCad.SetTool(toSelect, '');
GCadForm.PCad.NeedRefresh := True; // Tolik 23/03/2021 --
GCadForm.PCad.Refresh;
//if GSnapFiguresList[GSnapFiguresList.Count - 1] <> nil then
if CallAutoTraceElectricMaster then
begin
currEndPoint := nil;
currEndPoint := GEndPoint;
GEndPoint := TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]);
GCallAutoTraceElectricMaster := True;
TF_MAIN(F_NormBase).Act_AutoTraceByRayModeExecute(nil);
GEndPoint := currEndPoint;
BreakedELCableTracing := not GCallAutoTraceElectricMaster;
GCallAutoTraceElectricMaster := True;
for i := 0 to SavedLinesList.Count - 1 do
TOrthoLine(SavedLinesList[i]).FMarkTracing := False;
end;
GCadForm.PCad.DeselectAll(2);
GCadForm.PCad.NeedRefresh := True; // Tolik 23/03/2021 --
GCadForm.PCad.Refresh;
PauseProgress(false);
if SavedConnectorsList <> nil then
FreeAndNil(SavedConnectorsList);
//FreeAndNil(SavedLinesList);
end;
//Tolik 28/08/2025 -- Åñëè íå òðàññèðîâêà ýëåêòðèêè(ãëàâíîå, ÷òîá íå ïîëîìàëàñü...), åñëè ëèíåéíûé êîìïîíåíò,
//òî ïîëîæèòü ïî òðàññàì, åñëè âêëþ÷åí ôëàæîê ðó÷íîé ïðîêëàäêè
if ((GDropComponent = nil) and (CallAutoTraceElectricMaster = false)) then
begin
if GAutoAddCableAfterDragDrop then
begin
if F_NormBase.GSCSBase.SCSComponent <> nil then
begin
if F_NormBase.GSCSBase.SCSComponent.IsLine = biTrue then
begin
for i := 0 to SavedLinesList.Count - 1 do
begin
CopyComponentToSCSObject(TOrthoLine(SavedLinesList[i]).ID, F_NormBase.GSCSBase.SCSComponent.ID, True);
if isNormbaseCable then //(åñëè êàáåëü òî ïîñîåäèíÿòü)
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(SavedLinesList[i]).ID);
end;
end;
end;
end;
end;
FreeAndNil(SavedLinesList);
//
GCadForm.PCad.DeselectAll(2);
// ïðîâåðêà íà ïðèâÿçêó îáúåêòà
if TraceCount = 1 then
begin
if Result <> nil then
if TOrthoLine(result).CheckTraceNotHaveConnect(False) then
begin
//GCadForm.PCad.Hint := '';
//GCadForm.PCad.ShowHint := True;
//GCadForm.PCad.Hint := 'not connected';
if(GCurrShadowTraceX >0)and(GCurrShadowTraceY > 0)then
ShowHintRzR(cCadClasses_Mes36, 2000);
end;
end
else
begin
if TraceCount > 1 then
begin
if (Res1 <> nil) and (Res2 <> nil) then
begin
if TOrthoLine(Res1).CheckTraceNotHaveConnect(True) and TOrthoLine(Res2).CheckTraceNotHaveConnect(True) then
begin
if(GCurrShadowTraceX >0)and(GCurrShadowTraceY > 0)then
begin
ShowHintRzR(cCadClasses_Mes36, 2000);
end;
end;
end;
end;
end;
Application.ProcessMessages;
//Sleep(1000);
Sleep(200);
if incab then
ShowHintRzR('This is an unroutable area. You cannot place anything here!', 2000);
Result := nil;
GTraceStatus := False;
SetLength(GTempActualPoints, 0);
GClickIndex := 0;
GIsLastShadowCleared := False;
GSnapFiguresList.Clear;
GCurrShadowTraceX := -1;
GCurrShadowTraceY := -1;
GFigureSnap := nil;
GPrevFigureSnap := nil;
GPrevFigureTraceTo := nil;
GReDrawAfterRefresh := False;
RefreshCAD(GCadForm.PCad);
//Tolik 07/02/2021 --
GCadForm.FContinueTrace := false;
GCadForm.PCad.SetTool(toSelect, '');
//if GOrthoStatus then
//GOrthoStatus := False;
GDefaultGap := 1;
GDefaultNum := 1;
//if CallAutoTraceElectricMaster then
if (CallAutoTraceElectricMaster or GDropPcadTool) then
begin
if GOrthoStatus then
GOrthoStatus := False;
{
GCadForm.FContinueTrace := false;
GCadForm.PCad.SetTool(toSelect, '');
if GOrthoStatus then
GOrthoStatus := False;
GDefaultGap := 1;
GDefaultNum := 1;
}
end
else
begin
if FSCS_Main.tbCADToolsExpert.Visible then // Tolik -- åñëè ðåæèì íóáà - òî ïóñòü íàæèìàåò êàæäûé ðàç òóëçó ðèñîâàíèÿ òðàññû
begin
GCadForm.PCad.SetTool(toFigure, 'TOrthoLine');
GCadForm.FContinueTrace := True;
end;
if GOrthoStatus then
begin
//GDefaultGap := 1;
//GDefaultNum := 1;
GOrthoStatus := True;
GCurrentConnectorType := ct_Clear;
if FSCS_Main.tbCADToolsExpert.Visible then
begin
FSCS_Main.tbSelectExpert.Down := False;
FSCS_Main.tbToolOrtholineExtExpert.Down := True;
end
else
begin
//FSCS_Main.tbSelectNoob.Down := False;
//FSCS_Main.tbToolOrtholineExtNoob.Down := True;
end;
end
else
begin
//GDefaultGap := 1;
//GDefaultNum := 1;
GOrthoStatus := False;
GCurrentConnectorType := ct_Clear;
if FSCS_Main.tbCADToolsExpert.Visible then
begin
FSCS_Main.tbSelectExpert.Down := False;
FSCS_Main.tbToolOrtholineExpert.Down := True;
end
else
begin
//FSCS_Main.tbSelectNoob.Down := False;
//FSCS_Main.tbToolOrtholineNoob.Down := True;
end;
end;
end;
except
on E: Exception do
begin
GWasShiftOnTraceCreate := False; // íà âñÿêèé
addExceptionToLogEx('TOrthoLine.CreateFromShadow', E.Message);
GisOrthoLineHadow := False;
end;
end;
//Tolik 28/08/2025 --
GDropComponent := SavedDropComponent;
//
GisOrthoLineHadow := False; // Tolik 27/08/2021 --
RestoreCadMarkedTraces; // Tolik 08/06/2021 -- âîññòàíîâèòü ñïèñîê ïðîìàðêèðîâàííûõ òðàññ íà êàäå
//GCallAutoTraceElectricMaster := False; // Tolik 11/03/2021 --
GConnectEndPoints := False; // Tolik 01/04/2021 --
GCadForm.FCanSaveForUndo := True;
EndProgress;
GWasShiftOnTraceCreate := False;
if SnapGrids then
GCadform.PCad.SnapToGrids := True;
if SnapGuides then
GCadform.PCad.SnapToGuides := True;
GPrevSnapFigureID := -1; // Tolik 11/03/2021 --
if BreakedELCableTracing then
GCadForm.SCSUndoNormalList;
CreatedTracesList.free;
// Tolik 01/04/2021 --
GCadForm.FNoMoveConnectedObjects := WasCadNoMoveObjects;
GCadForm.tbNoMoveConnectedObjects.Down := WasCadNoMoveObjectsPressed;
GDropPcadTool := False;
ClearTreeSelection; // Tolik 30/11/2021 --
//
GCadform.PCad.NeedRefresh := True;
GCadform.PCad.Refresh;
end;
(*
class function TOrthoLine.CreateFromShadow(aOwner: TComponent; LHandle: Integer; Shadow: TFigure): TFigure;
var
i: integer;
x, y, z: double;
PrevFigure: TFigure;
Connector: TFigure;
isFigure: TFigure;
ConnAsDefault: TConnectorObject;
CableAsDefault: TOrthoLine;
CurrSnapFigure: TFigure;
CurrSavedConn: TConnectorObject;
LastObjectHeight: Double;
SavedConnectorsList: TList;
SavedLinesList: TList;
TypeIndex: Integer;
SavedSnapFigure: TFigure;
StartConn, EndConn: TConnectorObject;
TraceCount: integer;
Res1, Res2: TFigure;
InCab: boolean;
begin
Result := nil;
incab := false;
BeginProgress;
try
SavedConnectorsList := TList.Create;
SavedLinesList := TList.Create;
Result := nil;
Connector := nil;
PrevFigure := nil;
GTraceStatus := True;
// Tolik -- 18/11/2015
TraceCount := 0;
//
if GCadForm.FAutoCadMouse then
begin
if GLastClickOrtho then
GClickIndex := GClickIndex - 1;
end;
if ((GCadForm.FAutoCadMouse) and (GClickIndex >= 3)) or ((not GCadForm.FAutoCadMouse) and (GClickIndex >= 2)) then
begin
if GCadForm.FAutoCadMouse then
TypeIndex := 2
else
TypeIndex := 1;
// *UNDO*
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
// Tolik -- 18/11/2015 -- ïðîèíèöèàëèçèðîâàíî, íî íå òàì...â ñàìîì íà÷àëå íóæíî, à òî åñëè â ýòî óñëîâèå íå ïîïàäåì
// à ýòà ïåðåìåííàÿ þçàåòñÿ è âíå óñëîâèÿ -- ïîëó÷àåì áÿêó
// TraceCount := 0;
//
Res1 := nil;
Res2 := nil;
// Îñíîâíîé öèêë ñîçäàíèÿ òðàññû
for i := 1 to GClickIndex - TypeIndex do
begin
//----- Connectors -------------------------------------------------------
Connector := TConnectorObject.Create(Shadow.ActualPoints[i].x, Shadow.ActualPoints[i].y, GCadForm.FLineHeight,
LHandle, mydsNormal, aOwner);
TConnectorObject(Connector).ConnectorType := GCurrentConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Connector, false);
SavedConnectorsList.Add(Connector); // Saved
SetConnBringToFront(TConnectorObject(Connector));
// ïðèâÿçêà êîíåêòîðà ê äðóãîé ëèíèè
if PrevFigure <> nil then
TOrthoLine(PrevFigure).SetJConnector2(Connector);
//----- OrthoLine ---------------------------------------------------------
Result := TOrthoLine.Create(Connector.ActualPoints[1].x, Connector.ActualPoints[1].y, GCadForm.FLineHeight,
Shadow.ActualPoints[i + 1].x, Shadow.ActualPoints[i + 1].y, GCadForm.FLineHeight,
1, ord(psSolid), clBlack, 0, LHandle, mydsNormal, aOwner);
TraceCount := TraceCount + 1;
if i = 1 then
Res1 := Result;
if i = (GClickIndex - TypeIndex) then
Res2 := Result;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Result, false);
SavedLinesList.Add(Result); // Saved
TOrtholine(Result).SetJConnector1(Connector);
PrevFigure := Result;
GCadForm.PCad.OrderFigureToFront(TOrtholine(Result).CaptionsGroup);
end;
//-----Connectors ----------------------------------------------------------
Connector := TConnectorObject.Create(Shadow.ActualPoints[i].x, Shadow.ActualPoints[i].y, GCadForm.FLineHeight,
LHandle, mydsNormal, aOwner);
TConnectorObject(Connector).ConnectorType := GCurrentConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Connector, False);
SavedConnectorsList.Add(Connector); // Saved
SetConnBringToFront(TConnectorObject(Connector));
// ïðèâÿçêà êîíåêòîðà ê äðóãîé ëèíèè
TOrtholine(Result).SetJConnector2(Connector);
// ïåðåñòàâèòü âûñîòû ñ ñîîòâåòñòâèåì ñ ðàçìåùåíèåì ìåæäó ÐÌ
if GCadForm.FAutoPosTraceBetweenRM then
AutoPosTracesBetweenRM(SavedConnectorsList, SavedLinesList, GSnapFiguresList);
if GAutoAddCableAfterDragDrop then
begin
if (GDropComponent <> nil) and (GDropComponent.IsLine = 1) then
begin
for i := 0 to SavedLinesList.Count - 1 do
begin
CopyComponentToSCSObject(TOrthoLine(SavedLinesList[i]).ID, GDropComponent.ID, True);
AutoConnectOnAppendCable(GCadForm.FCADListID, TOrthoLine(SavedLinesList[i]).ID);
end;
end;
GAutoAddCableAfterDragDrop := false;
end;
// Tolik -- 06/11/2016-- !!!!
While GSnapFiguresList.Count < SavedConnectorsList.Count do
GSnapFiguresList.Add(Nil);
//
// âîçìîæíîñòü ïîäâÿçêè!
for i := 0 to SavedConnectorsList.Count - 1 do
begin
GMovedByOtherObject := True;
CurrSavedConn := TConnectorObject(SavedConnectorsList[i]);
CurrSnapFigure := TFigure(GSnapFiguresList[i]);
GFigureSnap := CurrSnapFigure;
// ×åðåç Ëèíèþ
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
begin
CheckingSnapConnectorToOrtholine(CurrSavedConn, TOrthoLine(GFigureSnap));
end
// ×åðåç Äîì
else if CheckFigureByClassName(GFigureSnap, cTHouse) then
begin
SnapConnectorToHouse(CurrSavedConn, THouse(GFigureSnap));
end
// ×åðåç ÒÎ
else if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
begin
// ×åðåç ïóñòîé ñîåäèíèòåëü
if TConnectorObject(GFigureSnap).ConnectorType = ct_Clear then
begin
CheckingSnapConnectorToConnector(CurrSavedConn, TConnectorObject(GFigureSnap));
end
else
// ×åðåç Îáúåêò
begin
SavedSnapFigure := GFigureSnap;
if TConnectorObject(CurrSavedConn).ActualZOrder[1] <> TConnectorObject(GFigureSnap).ActualZOrder[1] then
begin
if (TConnectorObject(GFigureSnap).JoinedConnectorsList.Count = 0) and
(TConnectorObject(GFigureSnap).JoinedOrtholinesList.Count = 0) then
TConnectorObject(GFigureSnap).MoveConnector(CurrSavedConn.ActualPoints[1].x - TConnectorObject(GFigureSnap).ActualPoints[1].x,
CurrSavedConn.ActualPoints[1].y - TConnectorObject(GFigureSnap).ActualPoints[1].y
false, false);
end;
GFigureSnap := SavedSnapFigure;
CheckingSnapConnectorToPointObject(CurrSavedConn, TConnectorObject(GFigureSnap), False);
end;
end;
GMovedByOtherObject := False;
end;
/// **********************************************************************
if GCadForm.FAutoPosTraceBetweenRM then
AutoPosTracesBetweenRMAfterSnap(SavedLinesList);
// î÷èñòèòü ïðèâÿçêè
for i := 0 to GSnapFiguresList.Count - 1 do
begin
CurrSnapFigure := TFigure(GSnapFiguresList[i]);
if CheckFigureByClassName(CurrSnapFigure, cTOrthoLine) then
TOrthoLine(CurrSnapFigure).isSnap := False
else if CheckFigureByClassName(CurrSnapFigure, cTConnectorObject) then
TConnectorObject(CurrSnapFigure).isSnap := False;
end;
//31.01.2011 Åñëè îäíèì êóñêîì òðàññû ñîåäèíèëè ïîäúåçäû îäíîãî äîìà, òî òðàññó ðàçáèâàåì íà äâà ó÷àñòêà
if ((GClickIndex-TypeIndex) = 1) then
AutoDivideLine(TOrthoLine(Result)); //31.01.2011 - ðàçäåëÿåì ëèíèþ åñëè íóæíî
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes1 + FormatFloat(ffMask, MetreToUOM(GCadForm.FLineHeight)) + cCadClasses_Mes2);
// *UNDO*
GCadForm.FCanSaveForUndo := True;
end;
for i := 0 to SavedLinesList.Count - 1 do
begin
CurrSnapFigure := TFigure(SavedLinesList[i]);
if CheckFigureByClassName(CurrSnapFigure, cTOrtholine) then
begin
GCadForm.PCad.CheckFigureInsideCabinet(GCadForm.FCheckedFigures ,CurrSnapFigure);
if TOrtholine(CurrSnapFigure).InsideCabinet then
begin
incab := true;
break;
end;
end;
end;
////////////////////////////////////////////////
if SavedConnectorsList <> nil then
FreeAndNil(SavedConnectorsList);
if SavedLinesList <> nil then
FreeAndNil(SavedLinesList);
GCadForm.PCad.DeselectAll(2);
// ïðîâåðêà íà ïðèâÿçêó îáúåêòà
if TraceCount = 1 then
begin
if Result <> nil then
if TOrthoLine(result).CheckTraceNotHaveConnect(False) then
begin
//GCadForm.PCad.Hint := '';
//GCadForm.PCad.ShowHint := True;
//GCadForm.PCad.Hint := 'not connected';
if(GCurrShadowTraceX >0)and(GCurrShadowTraceY > 0)then
ShowHintRzR(cCadClasses_Mes36, 2000);
end;
end
else
begin
if TraceCount > 1 then
begin
if (Res1 <> nil) and (Res2 <> nil) then
begin
if TOrthoLine(Res1).CheckTraceNotHaveConnect(True) and TOrthoLine(Res2).CheckTraceNotHaveConnect(True) then
begin
if(GCurrShadowTraceX >0)and(GCurrShadowTraceY > 0)then
ShowHintRzR(cCadClasses_Mes36, 2000);
end;
end;
end;
end;
Application.ProcessMessages;
Sleep(1000);
if incab then
ShowHintRzR('This is an unroutable area. You cannot place anything here!', 2000);
Result := nil;
GTraceStatus := False;
SetLength(GTempActualPoints, 0);
GClickIndex := 0;
GIsLastShadowCleared := False;
GSnapFiguresList.Clear;
GCurrShadowTraceX := -1;
GCurrShadowTraceY := -1;
GFigureSnap := nil;
GPrevFigureSnap := nil;
GPrevFigureTraceTo := nil;
GReDrawAfterRefresh := False;
RefreshCAD(GCadForm.PCad);
GCadForm.PCad.SetTool(toFigure, 'TOrthoLine');
GCadForm.FContinueTrace := True;
if GOrthoStatus then
begin
GDefaultGap := 1;
GDefaultNum := 1;
GOrthoStatus := True;
GCurrentConnectorType := ct_Clear;
if FSCS_Main.tbCADToolsExpert.Visible then
begin
FSCS_Main.tbSelectExpert.Down := False;
FSCS_Main.tbToolOrtholineExtExpert.Down := True;
end
else
begin
FSCS_Main.tbSelectNoob.Down := False;
FSCS_Main.tbToolOrtholineExtNoob.Down := True;
end;
end
else
begin
GDefaultGap := 1;
GDefaultNum := 1;
GOrthoStatus := False;
GCurrentConnectorType := ct_Clear;
if FSCS_Main.tbCADToolsExpert.Visible then
begin
FSCS_Main.tbSelectExpert.Down := False;
FSCS_Main.tbToolOrtholineExpert.Down := True;
end
else
begin
FSCS_Main.tbSelectNoob.Down := False;
FSCS_Main.tbToolOrtholineNoob.Down := True;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CreateFromShadow', E.Message);
end;
EndProgress;
end;
*)
class function TOrthoLine.CreateShadow(x, y: Double): TFigure;
begin
try
Result := nil;
Result := TOrthoLine.Create(x, y, GCadForm.FConnHeight, x, y, GCadForm.FConnHeight, 1, ord(psSolid), clBlack, 0, 0, dsTrace, nil);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CreateShadow', E.Message);
end;
end;
function TOrthoLine.ShadowClick(ClickIndex: Integer; x, y: Double): Boolean;
var
LCount: Integer;
i: integer;
ListIndex: integer;
PrevSnapFigure: TFigure;
AddSnapFigure: TFigure;
// Tolik -- 07/11/2016--
CanAddToList: Boolean;
SCSCatalog: TSCSCatalog;
SCSCompon: TSCSComponent;
//Tolik 25/07/2021 --
function CheckAdd(aFigure: Tfigure): Boolean;
begin
Result := True;
if GSnapFiguresList.Count > 0 then
if CheckFigurebyClassName(aFigure, cTConnectorObject) then
if GSnapFiguresList[GSnapFiguresList.Count - 1] <> nil then
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).ID = aFigure.ID then
Result := false;
end;
begin
try
// Tolik 03/03/2021
{ if ClickIndex > 0 then
if ClickIndex = GSnapFiguresList.Count then
if GSnapFiguresList[ClickIndex - 1] = nil then
GSnapFiguresList.delete(ClickIndex - 1);}
//
// Tolik 25/07/2021 --
{
if gPrevSnapFigureID = -1 then
begin
if GSnapFiguresList.Count > 0 then
if GSnapFiguresList[GSnapFiguresList.Count - 1] <> nil then
gPrevSnapFigureID := TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).Id;
end;
}
Result := false;
//Tolik 07/11/2016 --
CanAddToList := True;
//
AddSnapFigure := Nil;
PrevSnapFigure := Nil;
// Tolik -- 21/04/2017 --
if ssShift in GGlobalShiftState then
GWasShiftOnTraceCreate := True;
//
if ClickIndex = 1 then
begin
GReDrawAfterRefresh := False;
GPrevSnapFigureID := -1;
end
//Tolik 26/07/2021 --
else
begin
if GSnapFiguresList.Count > 0 then
begin
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) <> nil then
GPrevSnapFigureID := TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).ID;
end;
end;
//
GLastClickOrtho := False;
if ClickIndex > 1 then
begin
if (GOrthoStatus) and (GFigureTraceTo <> nil) and CheckFigureByClassName(GFigureTraceTo, cTConnectorObject) then
begin
if not (DoubleCMP(OriginalPoints[1].x, OriginalPoints[3].x)) and not (DoubleCMP(OriginalPoints[1].y, OriginalPoints[3].y)) then
begin
//Tolik -- 20/04/2017 -- äëÿ îðòîãîíàëüíûõ òðàññ äîáàâëÿòü ëèøíþþ òî÷êó òîëüêî, åñëè
// ííå áûëà çàæàòà êëàâèøà SHIFT -- èíà÷å òðàññà áûòåò ñòðîèòüñÿ òî÷íî îò îáúåêòà ê îáúåêòó è ïðîìåæóòî÷íàÿ
// (îðòîãîíàëüíàÿ) òî÷êà â òàêîì ñëó÷àå íå íóæíà
if not (ssShift in GGlobalShiftState) then
begin
GSnapFiguresList.Add(Nil);
// Tolik -- 07/11/2016 --
// CanAddToList := False;
//
ActualPoints[ClickIndex] := OriginalPoints[2];
// ñîõðàíèòü â òåìïîâûé ìàññèâ
SetLength(GTempActualPoints, ClickIndex + 1);
GTempActualPoints[ClickIndex] := ActualPoints[ClickIndex];
ClickIndex := ClickIndex + 1;
GClickIndex := ClickIndex;
GLastClickOrtho := True;
end;
end;
end;
end;
//Tolik
//if CheckNoFigureinList(GFigureTraceTo, GSnapFiguresList) then
if GFigureTraceTo <> nil then
begin
if (GSnapFiguresList.Count = 0) or ((GSnapFiguresList.Count > 0) and (TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) <> nil) and
(TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).ID <> TFigure(GFigureTraceTo).ID)) or
((GSnapFiguresList.Count > 0) and (TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) = nil)) then
//
begin
LCount := GSnapFiguresList.Count;
if LCount > 0 then
PrevSnapFigure := TFigure(GSnapFiguresList[LCount - 1])
else
PrevSnapFigure := Nil;
// ïåðâûé ñíåï - äîáàâèòü
if PrevSnapFigure = nil then
begin
AddSnapFigure := GFigureTraceTo;
if AddSnapFigure <> nil then
begin
//Tolik--07/11/2016 --
if CanAddToList then
begin
CanAddToList := False;
//
if GPrevSnapFigureID = -1 then
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
gPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end
else
begin
if GPrevSnapFigureID = AddSnapFigure.ID then
GSnapFiguresList.Add(Nil)
else
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
GPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end;
end;
end;
end;
end
else
begin
AddSnapFigure := GFigureTraceTo;
if CheckFigureByClassName(PrevSnapFigure, cTConnectorObject) and CheckFigureByClassName(GFigureTraceTo, cTOrthoLine) then
begin
if (PrevSnapFigure = TOrthoLine(GFigureTraceTo).JoinConnector1) or (PrevSnapFigure = TOrthoLine(GFigureTraceTo).JoinConnector2) then
begin
//commented by Tolik 31/08/2021--
//TOrthoLine(GFigureTraceTo).isSnap := False;
//AddSnapFigure := Nil;
end;
end
else if CheckFigureByClassName(PrevSnapFigure, cTOrthoLine) and CheckFigureByClassName(GFigureTraceTo, cTConnectorObject) then
begin
if (TOrthoLine(PrevSnapFigure).JoinConnector1 = GFigureTraceTo) or (TOrthoLine(PrevSnapFigure).JoinConnector2 = GFigureTraceTo) then
begin
//commented by Tolik 31/08/2021--
//TConnectorObject(GFigureTraceTo).isSnap := False;
//AddSnapFigure := Nil;
end;
end;
if AddSnapFigure <> nil then
begin
//Tolik 07/11/2016 --
if CanAddToList then
begin
CanAddToList := False;
//
//GSnapFiguresList.Add(AddSnapFigure);
if GPrevSnapFigureID = -1 then
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
GPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end
else
begin
if GPrevSnapFigureID = AddSnapFigure.ID then
GSnapFiguresList.Add(Nil)
else
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
GPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
GPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end;
end;
end;
end;
end;
end
//Tolik
else
begin
AddSnapFigure := GFigureTraceTo;
if CanAddToList then
begin
CanAddToList := False;
//GSnapFiguresList.Add(Nil);
if GPrevSnapFigureID = -1 then
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
gPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end
else
begin
if GPrevSnapFigureID = AddSnapFigure.ID then
//Tolik 26/07/2021 --
//GSnapFiguresList.Add(Nil)
begin
GSnapFiguresList.Add(Nil);
//GPrevSnapFigureID := -1;
//GFigureTraceTo := nil;
end
//
else
begin
// Tolik 29/03/2021 --
//GSnapFiguresList.Add(AddSnapFigure);
if AddSnapFigure is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(AddSnapFigure) = -1 then
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
gPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
//
end;
end;
end;
end;
//
//Tolik
end
//
else
begin
if CanAddToList then
begin
CanAddToList := False;
// Tolik 19/03/2021 --
{
GPrevSnapFigureID := -1;
GSnapFiguresList.Add(Nil);
}
if GFigureSnap = nil then
begin
GPrevSnapFigureID := -1;
GSnapFiguresList.Add(Nil);
end
else
begin
if GFigureSnap is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(GFigureSnap) = -1 then
begin
GSnapFiguresList.Add(GFigureSnap);
GPrevSnapFigureID := GFigureSnap.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
GPrevSnapFigureID := -1;}
end;
end
else
begin
GSnapFiguresList.Add(GFigureSnap);
GPrevSnapFigureID := GFigureSnap.ID;
end;
end;
//
end;
end;
// !!!
if ClickIndex = 1 then
if (GFigureTraceTo <> nil) then
//Tolik
begin
//
if CheckFigureByClassName(GFigureTraceTo, cTConnectorObject) then
if TConnectorObject(GFigureTraceTo).ConnectorType <> ct_Clear then
if TConnectorObject(GFigureTraceTo).ActualZOrder[1] <> GCadForm.FLineHeight then
begin
OriginalPoints[3]:= DoublePoint(TConnectorObject(GFigureTraceTo).ActualPoints[1].x,
TConnectorObject(GFigureTraceTo).ActualPoints[1].y);
end;
end
//{ //Tolik
else
begin
if CanAddToList then
begin
// 19/03/2021 --
(*
CanAddToList := False;
//GPrevSnapFigureId :=
GSnapFiguresList.Add(Nil);//}
*)
if GFigureSnap = nil then
begin
GPrevSnapFigureID := -1;
GSnapFiguresList.Add(Nil);
end
else
begin
//GSnapFiguresList.Add(GFigureSnap);
//GPrevSnapFigureID := GFigureSnap.ID;
if GFigureSnap is TOrthoLine then
begin
if GSnapFiguresList.IndexOf(GFigureSnap) = -1 then
begin
GSnapFiguresList.Add(GFigureSnap);
GPrevSnapFigureID := GFigureSnap.ID;
end
else
begin
{GSnapFiguresList.Add(nil);
GPrevSnapFigureID := -1;}
GSnapFiguresList.Add(AddSnapFigure);
gPrevSnapFigureID := AddSnapFigure.ID;
end;
end
else
begin
GSnapFiguresList.Add(GFigureSnap);
GPrevSnapFigureID := GFigureSnap.ID;
end;
end;
//
end;
end;
//
// !!!
OriginalPoints[1] := DoublePoint(x, y);
OriginalPoints[1] := OriginalPoints[3];
ActualPoints[ClickIndex] := OriginalPoints[3];
// ñîõðàíèòü â òåìïîâûé ìàññèâ
SetLength(GTempActualPoints, ClickIndex + 1);
GTempActualPoints[ClickIndex] := ActualPoints[ClickIndex];
GClickIndex := ClickIndex;
GcadForm.PCad.ClickIndex := ClickIndex;
GCadForm.sbView.Panels[2].Text := cCadClasses_Mes3;
// Tolik 22/03/2021 --
if GClickIndex > 1 then
begin
if GCallElectricAutoTraceMaster then
begin
if GAutoAddCableAfterDragDrop then
begin
//if GFigureTraceTo <> nil then
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) <> nil then
begin
//if GFigureTraceTo is TConnectorObject then
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) is TConnectorObject then
begin
//SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(GFigureTraceTo.ID);
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).ID);
if SCSCatalog <> nil then
begin
SCSCompon := SCSCatalog.GetFirstComponent;
if SCScompon <> nil then
begin
if SCSCompon.IDNetType = 3 then
begin
if SCSCompon.ComponentType.SysName = ctsnShield then
//begin
//if GClickIndex > 1 then
//begin
Result := True;
//end;
//end;
end;
end;
end;
end;
end;
end;
end;
end;
//Tolik 07/02/2022 --
if GClickIndex > 1 then
begin
if not Result then
begin
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) <> nil then
begin
//if GFigureTraceTo is TConnectorObject then
if TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]) is TConnectorObject then
begin
//SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(GFigureTraceTo.ID);
SCSCatalog := F_ProjMan.GSCSBase.CurrProject.CurrList.GetCatalogFromReferencesBySCSID(TFigure(GSnapFiguresList[GSnapFiguresList.Count - 1]).ID);
if SCSCatalog <> nil then
begin
SCSCompon := SCSCatalog.GetFirstComponent;
if SCSCompon <> nil then
begin
if SCSCompon.ComponentType.SysName = ctsnCupboard then
Result := True;
end;
end;
end;
end;
end;
end;
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ShadowClick', E.Message);
end;
end;
function TOrthoLine.ShadowTrace(ClickIndex: Integer; x, y: Double): Boolean;
var
i: integer;
cP: TDoublePoint;
Len_X, Len_Y: double;
AngleOut: Double;
LenSize: Double;
FullLenSize: Double;
x1, y1: double;
shiftOn: boolean;
begin
try
Result := false;
// Tolik 04/03/2021 -- MADE BY IGOR -- çäåñü ìåíÿåòñÿ ïîâåäåíèå SHIFT ïðè ðó÷íîé ïðîêëàäêå òðàññû, ÷òîáû ïðîñòî
// ìûøêîé ìîæíî áûëî íàðèñîâàòü òðàññó â ëþáîì íàïðàâëåíèè, à ñ SHIFT -- ÒÎËÜÊÎ ÎÐÒÎÃÎÍÀËÜÍÎ
if (GOrthoStatus) then
shiftOn := Not (ssShift in GGlobalShiftState)
else
shiftOn := ssShift in GGlobalShiftState;
if shiftOn then
//if Not (ssShift in GGlobalShiftState) then
//
begin
angle := 1 / tan(GDefaultAngle * pi / 180 / 2);
Len_X := abs(OriginalPoints[1].X - X);
Len_Y := abs(OriginalPoints[1].Y - Y);
if Len_X > Len_Y then
begin
if Len_X > angle * Len_Y then
Y := OriginalPoints[1].Y
else
if Len_X < angle * Len_Y then
begin
if Y > OriginalPoints[1].Y then
Y := OriginalPoints[1].Y + Len_X
else
if Y < OriginalPoints[1].Y then
Y := OriginalPoints[1].Y - Len_X;
end;
end
else
if Len_X < Len_Y then
begin
if Len_Y > angle * Len_X then
X := OriginalPoints[1].X
else
if Len_Y < angle * Len_X then
begin
if X > OriginalPoints[1].X then
X := OriginalPoints[1].X + Len_Y
else
if X < OriginalPoints[1].X then
X := OriginalPoints[1].X - Len_Y;
end;
end;
// *VISIO*
if (GOrthoStatus) and (GFigureTraceTo <> nil) and CheckFigureByClassName(GFigureTraceTo, cTConnectorObject) then
begin
x1 := TConnectorObject(GFigureTraceTo).ActualPoints[1].x;
y1 := TConnectorObject(GFigureTraceTo).ActualPoints[1].y;
if ssCtrl in GGlobalShiftState then
begin
x := x1;
y := OriginalPoints[1].y;
end
else
begin
x := OriginalPoints[1].x;
y := y1;
end;
end
else
begin
x1 := x;
y1 := y;
end;
// *VISIO*
end
else
begin
x1 := x;
y1 := y;
end;
CP.X := X;
CP.Y := Y;
OriginalPoints[2] := cP;
CP.X := X1;
CP.Y := Y1;
OriginalPoints[3] := cP;
result := true;
//// âûâîäèòü óãîë è ðàçìåðû òåêóùåé ëèíèè
LenSize := SQRT(SQR(OriginalPoints[1].x - OriginalPoints[2].x) +
SQR(OriginalPoints[1].y - OriginalPoints[2].y));
if ClickIndex = 1 then
FullLenSize := LenSize
else
begin
FullLenSize := 0;
for i := ClickIndex downto 2 do
begin
FullLenSize := FullLenSize + SQRT(SQR(ActualPoints[ClickIndex].x - ActualPoints[ClickIndex - 1].x)
+ SQR(ActualPoints[ClickIndex].y - ActualPoints[ClickIndex - 1].y));
end;
FullLenSize := FullLenSize + LenSize;
end;
if GCadForm.PCad.RulerMode = rmPage then
begin
LenSize := LenSize / 10;
FullLenSize := FullLenSize / 10;
GCadForm.sbView.Panels[1].Text := cCadClasses_Mes4 + FormatFloat(ffMask, MetreToUOM(LenSize)) + cCadClasses_Mes6 +
cCadClasses_Mes5 + FormatFloat(ffMask, MetreToUOM(FullLenSize)) + cCadClasses_Mes6;
end;
if GCadForm.PCad.RulerMode = rmWorld then
begin
LenSize := LenSize / 1000 * GCadForm.PCad.MapScale;
FullLenSize := FullLenSize / 1000 * GCadForm.PCad.MapScale;
GCadForm.sbView.Panels[1].Text := cCadClasses_Mes4 + FormatFloat(ffMask, MetreToUOM(LenSize)) + GetUOMString(GCurrProjUnitOfMeasure) +
cCadClasses_Mes5 + FormatFloat(ffMask, MetreToUOM(FullLenSize)) + GetUOMString(GCurrProjUnitOfMeasure);
end;
AngleOut := GetAngle(OriginalPoints[1].x, OriginalPoints[1].y, X, Y);
GCadForm.sbView.Panels[2].Text := '> ' + FormatFloat(ffMask, AngleOut) + cCadClasses_Mes8;
// òåêóùåå ïîëîæåíèå òðåéñà äëÿ ïîèñêà îáúåêòîâ
GCurrShadowTraceX := OriginalPoints[3].x;
GCurrShadowTraceY := OriginalPoints[3].y;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ShadowTrace', E.Message);
end;
end;
procedure TOrthoLine.GetModPoints(ModList: TMyList);
var
cp1, cp2, cp3, cp4, mPt: TDoublePoint;
l, f, Gap2: Extended;
SCSList: TSCSList;
LObject: TSCSCatalog;
begin
try
cp1 := ActualPoints[1];
cp2 := ActualPoints[2];
cp3.x := (cp1.x + cp2.x) / 2;
cp3.y := (cp1.y + cp2.y) / 2;
Gap2 := FGap / 2 + 0.2;
l := sqrt(sqr(cp1.x - cp2.x) + sqr(cp1.y - cp2.y));
if l = 0 then
l := 0.001;
f := arcsin((abs(cp1.y - cp2.y) / l)) * 180 / pi;
if ((cp1.x > cp2.x) and (cp1.y < cp2.y)) or
((cp1.x < cp2.x) and (cp1.y > cp2.y)) then
f := f*(-1);
cp4.x := Gap2 * cos((f + 90) * pi / 180) + cp3.x;
cp4.y := Gap2 * sin((f + 90) * pi / 180) + cp3.y;
cp3.x := Gap2 * cos((f - 90) * pi / 180) + cp3.x;
cp3.y := Gap2 * sin((f - 90) * pi / 180) + cp3.y;
// åñëè ýòî íå ñïóñê-ïîäúåì
if not FIsRaiseUpDown then
begin
if FCount > 1 then
begin
// Tolik -- 11/04/2017 -- íåëüçÿ ÷åðåç GCadForm, òàê êàê ýòî íå âñåãäà -- âëàäåëåö ôèãóðû,
// ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ!!!!! ÁÓÄÓÒ ÒÐÀÁËÛ ÏÐÈ ÇÀÊÐÛÒÈÈ ÏÐÎÅÊÒÀ!!!
(*
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptLineEnd, ptRect,
clBlue, pointdim + dimp_add, cp3.x, cp3.y, 11));
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptLineEnd, ptRect,
clBlue, pointdim + dimp_add, cp4.x, cp4.y, 22));
*)
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptLineEnd, ptRect,
clBlue, pointdim + dimp_add, cp3.x, cp3.y, 11));
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptLineEnd, ptRect,
clBlue, pointdim + dimp_add, cp4.x, cp4.y, 22));
end;
//22.07.2013 - òî÷êà äëÿ ïðåâðàùåíèÿ òðàññû â îðòîãîíàëüíóþ
if (Not tmpDrawShadow) and (Not TPowerCad(Owner).IsDragging) then
//Tolik 11/04/2017 --
//if GCadForm.PCad.Selection.Count <= 1 then
if TPCDrawing(Self.Owner).Selection.Count <=1 then
//
if Not CmpFloatByCP(cp3.x, cp4.x) and Not CmpFloatByCP(cp3.y, cp4.y) then
begin
try
{
SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(Owner).Owner).FCADListID);
if SCSList <> nil then
begin
LObject := SCSList.GetCatalogFromReferencesBySCSID(self.ID); //SCSList.GetCatalogFromSortedRefByID(self.ID);
if LObject <> nil then
begin
if LObject.SCSComponents.Count = 0 then
begin
mPt := MPoint(cp3, cp4);
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptControlPoint, ptRect,
clBlack, pointdim + 1, mPt.x, mPt.y, 15));
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptControlPoint, ptRect,
clYellow, pointdim, mPt.x, mPt.y, 0)); // Ñëóæåáíàÿ äëÿ îòðèñîâêè äðóãèì öâåòîì //FF7F00
end;
end;
end;
}
mPt := MPoint(cp3, cp4);
// Tolik -- 11/04/2017 -- íåëüçÿ ÷åðåç GCadForm, òàê êàê ýòî íå âñåãäà -- âëàäåëåö ôèãóðû,
// ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ!!!!! ÁÓÄÓÒ ÒÐÀÁËÛ ÏÐÈ ÇÀÊÐÛÒÈÈ ÏÐÎÅÊÒÀ!!!
(*
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptControlPoint, ptRect,
clBlack, pointdim + dimp_add, mPt.x, mPt.y, 15));
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptControlPoint, ptRect,
clYellow, pointdim, mPt.x, mPt.y, 0)); // Ñëóæåáíàÿ äëÿ îòðèñîâêè äðóãèì öâåòîì //FF7F00
*)
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptControlPoint, ptRect,
clBlack, pointdim + dimp_add, mPt.x, mPt.y, 15));
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptControlPoint, ptRect,
clYellow, pointdim, mPt.x, mPt.y, 0)); // Ñëóæåáíàÿ äëÿ îòðèñîâêè äðóãèì öâåòîì //FF7F00
except
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetModPoints', E.Message);
end;
end;
procedure TOrthoLine.Move(deltax, deltay: Double);
var
distx, disty: double;
Cabinet: TCabinet;
begin
try
MoveOrthoLine(deltax, deltay);
// Auto ReAlign
if GCadForm.PCad.SnapToGrids then
begin
if DrawStyle = mydsNormal then
begin
if not FIsRaiseUpDown then
begin
distx := abs(ActualPoints[1].x - ActualPoints[2].x);
disty := abs(ActualPoints[1].y - ActualPoints[2].y);
if (distx < GCadForm.PCad.GridStep) or (disty < GCadForm.PCad.GridStep) then
ReAlignLine(Self);
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Move', E.Message);
end;
end;
procedure TOrthoLine.MoveOrthoLine(deltax, deltay: Double);
var
i, j: integer;
CurrPointObject: TConnectorObject;
CurrJoinedToPO: TConnectorObject;
CurrClearConnector: TConnectorObject;
RaiseObject1, RaiseObject2: TConnectorObject;
RaiseConn: TConnectorObject;
ObjFromRaise: TConnectorObject;
MovedConnector1, MovedConnector2: TConnectorObject;
Angle: Double;
fulldeltax, fulldeltay: double;
isMove: Boolean;
GetConn: TConnectorObject;
// Tolik 29/05/2017 --
RefreshFlag: boolean;
//
begin
// Tolik 29/05/2017 --
RefreshFlag := GCanRefreshCad;
GCanRefreshCad := False;
//
try
//Normal Style
if DrawStyle = mydsNormal then
begin
GFigureSnap := Nil;
FNotRecalcLength := True;
GMovedByLine := True;
// ÄÓÁËÈÊÀÒ !!!
if (not FIsRaiseUpDown) and (not FIsVertical) then
begin
if (ssCtrl in GGlobalShiftState) and (not GMoveByArrow) then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
if not FConnectingLine then
begin
if (GLastTracedLinePoints1.x <> -10000) and (GLastTracedLinePoints2.x <> -10000) and
(GLastTracedlinePoints1.y <> -10000) and (GLastTracedLinePoints2.y <> -10000) then
CreateDuplicate;
GLastTracedLinePoints1 := DoublePoint(-10000, -10000);
GLastTracedLinePoints2 := DoublePoint(-10000, -10000);
end;
GCanRefreshCad := RefreshFlag; //Toilk --15/07/2019 --
Exit;
end;
end;
end;
// ìîæíî ëè ïåðåìåùàòü
if GCadForm.FNoMoveConnectedObjects then
if (TConnectorObject(JoinConnector1).JoinedConnectorsList.Count > 0) or
(TConnectorObject(JoinConnector2).JoinedConnectorsList.Count > 0) or
(GetRaiseConn(TConnectorObject(JoinConnector1)) <> nil) or
(GetRaiseConn(TConnectorObject(JoinConnector2)) <> nil) or
(TConnectorObject(JoinConnector1).FConnRaiseType <> crt_None) or
(TConnectorObject(JoinConnector2).FConnRaiseType <> crt_None) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes9);
GCanRefreshCad := RefreshFlag; //Toilk --15/07/2019 --
Exit;
end;
if (GCadForm.PCad.SelectedCount > 1) and (GCadForm.FNoMoveConnectedObjects) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes9);
GCanRefreshCad := RefreshFlag; //Toilk --15/07/2019 --
Exit;
end;
if not FIsRaiseUpDown then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
if ssShift in GGlobalShiftState then
begin
if abs(deltax) >= abs(deltay) then
begin
deltay := 0;
end
else
if abs(deltax) < abs(deltay) then
begin
deltax := 0;
end;
end;
end;
end;
// C-Ï
if FIsRaiseUpDown then
begin
if FObjectFromRaisedLine <> nil then
TConnectorObject(FObjectFromRaisedLine).Move(deltax, deltay);
end
else
if FIsVertical then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
GetConn := TConnectorObject(JoinConnector1)
else
GetConn := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]);
if not GetConn.Selected then
GetConn.Move(deltax, deltay);
end
else
// ÎÁÛ×ÍÛÉ
begin
if (JoinConnector1 <> nil) AND (JoinConnector2 <> nil) then
begin
MovedConnector1 := TConnectorObject(JoinConnector1);
MovedConnector2 := TConnectorObject(JoinConnector2);
// Îïðåäåëåíèå ïåðåìåùàþùèõñÿ êîííåêòîðîâ
// -1-
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count > 0 then
MovedConnector1 := TConnectorObject(JoinConnector1).JoinedConnectorsList[0];
if TConnectorObject(JoinConnector1).FConnRaiseType <> crt_None then
if TConnectorObject(JoinConnector1).FObjectFromRaise <> nil then
MovedConnector1 := TConnectorObject(JoinConnector1).FObjectFromRaise;
// -2-
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count > 0 then
MovedConnector2 := TConnectorObject(JoinConnector2).JoinedConnectorsList[0];
if TConnectorObject(JoinConnector2).FConnRaiseType <> crt_None then
if TConnectorObject(JoinConnector2).FObjectFromRaise <> nil then
MovedConnector2 := TConnectorObject(JoinConnector2).FObjectFromRaise;
// *******************************************************************
isMove := True;
if (MovedConnector1.FIsApproach) and (not MovedConnector1.fHouse.Selected) then
isMove := MovedConnector1.IsApproachInHouse(deltax, deltay);
if (MovedConnector2.FIsApproach) and (not MovedConnector2.fHouse.Selected) then
isMove := MovedConnector1.IsApproachInHouse(deltax, deltay);
if isMove then
begin
// Ïåðåìåùåíèå ÷åðåç êîííåêòîðû
if abs(ActualPoints[1].x - ActualPoints[2].x) < 0.1 then
deltay := 0
else
if abs(ActualPoints[1].y - ActualPoints[2].y) < 0.1 then
deltax := 0;
if (not MovedConnector1.Selected) and (not GDisableMove) then
if not ((MovedConnector1.FIsHouseJoined) and (MovedConnector1.fHouse <> nil) and (MovedConnector1.fHouse.Selected)) then
MovedConnector1.Move(deltax, deltay);
if (not MovedConnector2.Selected) and (not GDisableMove) then
if not ((MovedConnector2.FIsHouseJoined) and (MovedConnector2.fHouse <> nil) and (MovedConnector2.fHouse.Selected)) then
MovedConnector2.Move(deltax, deltay);
end
else
begin
ShowMessage(cHouse_Mes1);
end;
// *******************************************************************
end;
end;
FNotRecalcLength := False;
GMovedByLine := False;
GtmpIsRaise := False;
end
//Trace Style
else
begin
GMovedByLine := True;
// Ñ-Ï
if GtmpIsRaise then
begin
if GtmpObjectFromRaisedLine <> nil then
begin
if GtmpObjectFromRaisedLine.DrawFigure.InFigures.Count = 0 then
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax + GtmpObjectFromRaisedLine.GrpSizeX / 2,
ActualPoints[1].y + deltay - GtmpObjectFromRaisedLine.GrpSizeY / 2);
ActualPoints[2] := DoublePoint(ActualPoints[1].x + 4, ActualPoints[1].y - 4);
end
else
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax + GtmpObjectFromRaisedLine.GrpSizeX / 2,
ActualPoints[1].y + deltay - GtmpObjectFromRaisedLine.GrpSizeY / 2);
ActualPoints[2] := DoublePoint(ActualPoints[1].x + 4, ActualPoints[1].y - 4);
end;
GtmpObjectFromRaisedLine := nil;
end
else
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y + deltay);
end;
end
else
// ÎÁÛ×ÍÛÉ
begin
// If Shift
if GCadForm.PCad.SelectedCount = 1 then
begin
if ssShift in GGlobalShiftState then
begin
fulldeltax := GCurrMousePos.x - GMouseDownPos.x;
fulldeltay := GCurrMousePos.y - GMouseDownPos.y;
if abs(fulldeltax) >= abs(fulldeltay) then
begin
ActualPoints[1] := GBeforeDragOrthoLinesPoints1;
ActualPoints[2] := GBeforeDragOrthoLinesPoints2;
deltax := fulldeltax;
deltay := 0;
end
else
if abs(fulldeltax) < abs(fulldeltay) then
begin
ActualPoints[1] := GBeforeDragOrthoLinesPoints1;
ActualPoints[2] := GBeforeDragOrthoLinesPoints2;
deltay := fulldeltay;
deltax := 0;
end;
end;
end;
// =====
//02/06/2016 - Tolik
//ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
//ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y + deltay);
//
if abs(ActualPoints[1].x - ActualPoints[2].x) < 0.1 then
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y);
ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y);
end
else
if abs(ActualPoints[1].y - ActualPoints[2].y) < 0.1 then
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x, ActualPoints[1].y + deltay);
ActualPoints[2] := DoublePoint(ActualPoints[2].x, ActualPoints[2].y + deltay);
end
else
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y + deltay);
end;
GLastTracedLinePoints1 := ActualPoints[1];
GLastTracedLinePoints2 := ActualPoints[2];
end;
GMovedByLine := False;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.MoveOrthoLine', E.Message);
end;
GCanRefreshCad := RefreshFlag; //Toilk --29/05/2017 --
end;
function TOrthoLine.CreateModification: TFigure;
var
Line: TOrtholine;
begin
try
Result := nil;
//22.07.2013
if assigned(TracePoint) then
begin
// ñäåëàòü òðàññó îðòîãîíàëüíîé
if TracePoint.SeqNbr = 15 then
begin
Result := TFigureGrp.Create(0, nil);
Line := TOrthoLine.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1],
TracePoint.CoordX, TracePoint.CoordY, ActualZOrder[1],
1, ord(psSolid), clBlack, 0, 0, dsTrace, nil);
TFigureGrp(Result).AddToGrp(Line);
Line := TOrthoLine.Create(TracePoint.CoordX, TracePoint.CoordY, ActualZOrder[2],
ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2],
1, ord(psSolid), clBlack, 0, 0, dsTrace, nil);
TFigureGrp(Result).AddToGrp(Line);
end;
end;
if Result = nil then
begin
Result := TOrthoLine.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1],
ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2],
1, ord(psSolid), clBlack, 0, 0, dsTrace, nil);
TOrthoLine(Result).FGap := FGap;
TOrthoLine(Result).FCount := FCount;
TOrthoLine(Result).FDrawFigure := DrawFigure;
TOrthoLine(Result).FOrthoLineType := OrthoLineType;
GBeforeDragOrthoLinesPoints1 := TOrthoLine(Result).ActualPoints[1];
GBeforeDragOrthoLinesPoints2 := TOrthoLine(Result).ActualPoints[2];
GtmpIsRaise := FIsRaiseUpDown;
// íåëüçÿ ñòàâèòü - èíà÷å òðåéñ íå îòðèñóåò, ïîñëå ðèõòîâîê - îòðèñîâûâàåò
TOrthoLine(Result).FIsRaiseUpDown := FIsRaiseUpDown;
TOrthoLine(Result).FDrawFigurePercent := 0;
TOrthoLine(Result).FObjectFromRaisedLine := FObjectFromRaisedLine;
if FIsRaiseUpDown then
TOrthoLine(Result).FDrawFigurePercent := FDrawFigurePercent;
GtmpObjectFromRaisedLine := FObjectFromRaisedLine;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CreateModification', E.Message);
end;
end;
function TOrthoLine.TraceModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): Boolean;
var
Point: TDoublePoint;
x1, y1, x2, y2, x3, y3, x4, y4: Double;
len, f1, f2, f3: Extended;
ModRotate: Boolean;
//22.07.2013
op1, op2, CurrPt: TDoublePoint;
op: PDoublePoint;
begin
try
Result := false;
// Tolik 04/2021
if (ssShift in GGlobalShiftState) then
ModRotate := false
else
ModRotate := true;
{if (ssShift in GGlobalShiftState) then
ModRotate := true
else
ModRotate := false;}
//
Point := DoublePoint(x, y);
// åñëè 1 ìîäïîèíò
if mp.SeqNbr = 1 then
begin
if ActualPoints[1].x = ActualPoints[2].x then
begin
TraceFigure.ActualPoints[1] := DoublePoint(x, ActualPoints[1].y);
TraceFigure.ActualPoints[2] := DoublePoint(x, ActualPoints[2].y);
end
else
if ActualPoints[1].y = ActualPoints[2].y then
begin
TraceFigure.ActualPoints[1] := DoublePoint(ActualPoints[1].x, y);
TraceFigure.ActualPoints[2] := DoublePoint(ActualPoints[2].x, y);
end
else
begin
TraceFigure.ActualPoints[1] := DoublePoint(x - (ActualPoints[2].x - ActualPoints[1].x) / 2,
y - (ActualPoints[2].y - ActualPoints[1].y) / 2);
TraceFigure.ActualPoints[2] := DoublePoint(x + (ActualPoints[2].x - ActualPoints[1].x) / 2,
y + (ActualPoints[2].y - ActualPoints[1].y) / 2);
end;
end;
// ïðè ìóëüòèëèíèè ñ âîçìîæíîñòüþ âðàùåíèÿ
if ((mp.SeqNbr = 11) or (mp.SeqNbr = 22)) then
begin
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
x3 := (x1 + x2) / 2;
y3 := (y1 + y2) / 2;
x4 := x3;
y4 := y3;
len := sqrt(sqr(x1 - x2) + sqr(y1 - y2));
if len = 0 then
len := 0.001;
f1 := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f1 := f1 * (-1);
x1 := x3;
y1 := y3;
x2 := Point.x;
y2 := Point.y;
FGap := sqrt(sqr(x1 - x2) + sqr(y1 - y2));
if FGap = 0 then
FGap := 0.001;
f2 := arcsin((abs(y1 - y2) / FGap)) * 180 / pi;
if ((x1 > x2) and (y1 < y2)) or ((x1 < x2) and (y1 > y2)) then
f2 := f2 * (-1);
f3 := (90 - f1) + f2;
f3 := 90 - f3;
FGap := FGap * 2;
if (ModRotate = false) then
FGap := FGap * sin(f3 * pi / 180)
else
begin
x3 := (len / 2) * cos((f2 + 90) * pi/180) + x1;
y3 := (len / 2) * sin((f2 + 90) * pi/180) + y1;
x4 := (len / 2) * cos((f2 - 90) * pi/180) + x1;
y4 := (len / 2) * sin((f2 - 90) * pi/180) + y1;
end;
TOrthoLine(TraceFigure).FGap := FGap;
GDefaultGap := FGap;
if (ModRotate = true) then
begin
TraceFigure.ActualPoints[1] := DoublePoint(x3, y3);
TraceFigure.ActualPoints[2] := DoublePoint(x4, y4);
ActualPoints[1] := DoublePoint(x3, y3);
ActualPoints[2] := DoublePoint(x4, y4);
end;
end
//22.07.2013 - ïðåîáðàçîâàíèå ëèíèè â îðòî
else if mp.SeqNbr = 15 then
begin
CurrPt := DoublePoint(x,y);
op1 := DoublePoint(ActualPoints[1].x, ActualPoints[2].y);
op2 := DoublePoint(ActualPoints[2].x, ActualPoints[1].y);
op := nil;
if GetLineLenght(op1, CurrPt) < GetLineLenght(op2, CurrPt) then
op := @op1
else
op := @op2;
if op <> nil then
begin
TFigure(TFigureGrp(TraceFigure).InFigures[0]).ActualPoints[2] := op^;
TFigure(TFigureGrp(TraceFigure).InFigures[1]).ActualPoints[1] := op^;
end;
end;
Result := True;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.TraceModification', E.Message);
end;
end;
function TOrthoLine.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): Boolean;
var
RaiseConn: TConnectorObject;
RaiseLine: TOrthoLine;
ConnectedConn: TConnectorObject;
op: TDoublePoint;
begin
try
Result := false;
//22.07.2013
if mp.SeqNbr = 15 then
begin
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
ConnectedConn := DivideLineSimple(Self);
if ConnectedConn <> nil then
begin
op := TFigure(TFigureGrp(TraceFigure).InFigures[0]).ActualPoints[2];
ConnectedConn.Move(op.x-ConnectedConn.ActualPoints[1].x, op.y-ConnectedConn.ActualPoints[1].y);
end;
GCadForm.FCanSaveForUndo := true;
end
else
begin
GCadForm.PCad.DeselectAll(2);
if FCount = 1 then
Move(x - (ActualPoints[1].x + ActualPoints[2].x) / 2, y - (ActualPoints[1].y + ActualPoints[2].y) / 2);
if FCount > 1 then
begin
JoinConnector1.Move(ActualPoints[1].x - JoinConnector1.ActualPoints[1].x,
ActualPoints[1].y - JoinConnector1.ActualPoints[1].y);
JoinConnector2.Move(ActualPoints[2].x - JoinConnector2.ActualPoints[2].x,
ActualPoints[2].y - JoinConnector2.ActualPoints[2].y);
ActualPoints[1] := JoinConnector1.ActualPoints[1];
ActualPoints[2] := JoinConnector2.ActualPoints[1];
end;
FGap := abs(FGap);
Result := true;
Select;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.EndModification', E.Message);
end;
end;
function TOrthoLine.Duplicate: TFigure;
begin
try
Result := nil;
Result := TOrthoLine.create(ActualPoints[1].x + 5, ActualPoints[1].y + 5, ActualZOrder[1],
ActualPoints[2].x + 5, ActualPoints[2].y + 5, ActualZOrder[2],
1, ord(psSolid), clBlack, 0, LayerHandle, DrawStyle, Owner);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Duplicate', E.Message);
end;
end;
procedure TOrthoLine.GetBounds(var figMaxX, figMaxY, figMinX, figMinY: Double);
var
x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6: Double;
len, f, Gap2: Extended;
cp1: TDoublePoint;
cp2: TDoublePoint;
figMaxX1, figMaxY1, figMinX1, figMinY1: Double;
xmax,xmin,ymax,ymin: double;
XGAP: Double;
begin
try
cp1 := ActualPoints[1];
cp2 := ActualPoints[2];
x1 := cp1.x;
y1 := cp1.y;
x2 := cp2.x;
y2 := cp2.y;
if FCount > 0 then
begin
xmax := max(x1, x2);
xmin := min(x1, x2);
ymax := max(y1, y2);
ymin := min(y1, y2);
len := sqrt(sqr(xmax - xmin) + sqr(ymax - ymin));
if len = 0 then
len := 0.001;
Gap2 := 0;
XGap := 0;
if FCount > 1 then
begin
Gap2 := FGap / 2;
XGap := FGap - ((FGap / (FCount - 1)) * 0) - Gap2;
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
x3 := XGap * cos((f - 90) * pi / 180) + x1;
y3 := XGap * sin((f - 90) * pi / 180) + y1;
x4 := XGap * cos((f - 90) * pi / 180) + x2;
y4 := XGap * sin((f - 90) * pi / 180) + y2;
XGap := FGap - ((FGap / (FCount - 1)) * (FCount - 1)) - Gap2;
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
x5 := XGap * cos((f - 90) * pi / 180) + x1;
y5 := XGap * sin((f - 90) * pi / 180) + y1;
x6 := XGap * cos((f - 90) * pi / 180) + x2;
y6 := XGap * sin((f - 90) * pi / 180) + y2;
figMaxX1 := max(x3, x4);
figMaxX := max(x5,x6);
figMaxX := max(figMaxX1, figMaxX);
figMinX1 := min(x3, x4);
figMinX := min(x5,x6);
figMinX := min(figMinX1, figMinX);
figMaxY1 := max(y3, y4);
figMaxY := max(y5,y6);
figMaxY := max(figMaxY1, figMaxY);
figMinY1 := min(y3, y4);
figMinY := min(y5,y6);
figMinY := min(figMinY1, figMinY);
end
else
begin
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
x3 := cos((f - 90) * pi / 180) + x1;
y3 := sin((f - 90) * pi / 180) + y1;
x4 := cos((f - 90) * pi / 180) + x2;
y4 := sin((f - 90) * pi / 180) + y2;
figMaxX := max(x3, x4);
figMinX := min(x3, x4);
figMaxY := max(y3, y4);
figMinY := min(y3, y4);
end;
end
else
inherited GetBounds(figMaxX, figMaxY, figMinX, figMinY);
except
// Tolik 01/07/2019 - -
// on E: Exception do addExceptionToLogEx('TOrthoLine.GetBounds', E.Message);
on E: Exception do
begin
addExceptionToLogEx('TOrthoLine.GetBounds', E.Message);
figMaxX := 0;
figMinX := 0;
figMaxY := 0;
figMinY := 0;
end;
end;
end;
// Tolik 23/12/2019 -- ñòàðàÿ çàêîììåí÷åíà -- ñì íèæå....
function PtInPoly(const poly: TPolyArr; p: Tpoint) : Boolean;
var i,j : integer;
res1, res2, res3: Double;
Begin
result := false;
j := High(poly);
For i := Low(poly) to High(poly) do
begin
res1 := poly[j].x - poly[i].x;
res2 := p.y - poly[i].y;
res3 := res1 * res2;
if (
(((poly[i].y <= p.y) and
(p.y < poly[j].y)) or
((poly[j].y <= p.y) and
(p.y < poly[i].y)) ) and
(p.x < ((res3 / (poly[j].y - poly[i].y)) + poly[i].x)) ) then
result := not result;
j := i;
end;
End;
{
function PtInPoly(const poly: TPolyArr; p: Tpoint) : Boolean;
var i,j : integer;
Begin
result := false;
j := High(poly);
For i := Low(poly) to High(poly) do begin
if (
( ((poly[i].y <= p.y) and (p.y < poly[j].y)) or ((poly[j].y <= p.y) and (p.y < poly[i].y)) ) and
(p.x < ((poly[j].x - poly[i].x) * (p.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x))
) then result := not result;
j := i
end;
End;
}
function TOrthoLine.isPointIn(x, y: Double): boolean;
var
x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6: Double;
len, f, Gap2: Extended;
RegHandle: HRGN;
Points: array[0..4] of TPoint;
BasisPoints: TDoublePoint;
RaizeKoeff: Double;
Res2: boolean;
PArr: TPolyArr;
NeedPoint: TPoint;
aZoomScaleCad: double;
begin
try
Result := false;
FRegionPointsIsActual := False;
if Not FRegionPointsIsActual then
begin
RaizeKoeff := 1;
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
{*******************************************************}
// ÏÎÄÚÅÌ - ÑÏÓÑÊ
if (FIsRaiseUpDown) and (FObjectFromRaisedLine <> nil) and (ConnectorDetect(FObjectFromRaisedLine)) then
begin
RaizeKoeff := Self.FDrawFigurePercent / 100;
if FObjectFromRaisedLine.DrawFigure.InFigures.Count = 0 then
begin
BasisPoints.x := FObjectFromRaisedLine.ActualPoints[1].x + FObjectFromRaisedLine.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaisedLine.ActualPoints[1].y - FObjectFromRaisedLine.GrpSizeY / 2;
end
else
begin
BasisPoints.x := FObjectFromRaisedLine.DrawFigure.CenterPoint.x + FObjectFromRaisedLine.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaisedLine.DrawFigure.CenterPoint.y - FObjectFromRaisedLine.GrpSizeY / 2;
end;
if FLineRaiseType = lrt_Up then
begin
if FObjectFromRaisedLine.DrawFigure.InFigures.Count > 0 then {TODO âûðóëèòü àíàëîãè÷íî äëÿ lrt_Down} {DONE}
begin
if (RaizeKoeff > 0.5) then
begin
x1 := BasisPoints.x - (0.2 * RaizeKoeff); //1.5
y1 := BasisPoints.y + (0.2 * RaizeKoeff); //1.5
x2 := BasisPoints.x + (2.3 * RaizeKoeff); //2.5
y2 := BasisPoints.y - (2.3 * RaizeKoeff); //2.5
end
else
begin
if (RaizeKoeff > 0.2) then
begin
x1 := BasisPoints.x - (1.1 * RaizeKoeff); //1.5
y1 := BasisPoints.y + (1.1 * RaizeKoeff); //1.5
x2 := BasisPoints.x + (1.3 * RaizeKoeff);
y2 := BasisPoints.y - (1.3 * RaizeKoeff);
end
else
begin
x1 := BasisPoints.x - (2.5 * RaizeKoeff); //1.5
y1 := BasisPoints.y + (2.5 * RaizeKoeff); //1.5
x2 := BasisPoints.x + (0 * RaizeKoeff);
y2 := BasisPoints.y - (0 * RaizeKoeff);
end;
end;
end
else
begin
x1 := BasisPoints.x;
y1 := BasisPoints.y;
x2 := BasisPoints.x + (2.5 * RaizeKoeff); //2.5
y2 := BasisPoints.y - (2.5 * RaizeKoeff); //2.5
end;
end
else
if FLineRaiseType = lrt_Down then
begin
if FObjectFromRaisedLine.DrawFigure.InFigures.Count > 0 then {TODO âûðóëèòü àíàëîãè÷íî äëÿ lrt_Down} {DONE}
begin
if (RaizeKoeff > 0.5) then
begin
x1 := BasisPoints.x - (1.7 * RaizeKoeff);
y1 := BasisPoints.y + (1.7 * RaizeKoeff);
x2 := BasisPoints.x + (3.8 * RaizeKoeff);
y2 := BasisPoints.y - (3.8 * RaizeKoeff);
end
else
begin
if (RaizeKoeff > 0.2) then
begin
x1 := BasisPoints.x - (2.6 * RaizeKoeff);
y1 := BasisPoints.y + (2.6 * RaizeKoeff);
x2 := BasisPoints.x + (2.8 * RaizeKoeff);
y2 := BasisPoints.y - (2.8 * RaizeKoeff);
end
else
begin
x1 := BasisPoints.x - (4.0 * RaizeKoeff);
y1 := BasisPoints.y + (4.0 * RaizeKoeff);
x2 := BasisPoints.x + (1.5 * RaizeKoeff);
y2 := BasisPoints.y - (1.5 * RaizeKoeff);
end;
end;
end
else
begin
x1 := BasisPoints.x + (1.5 * RaizeKoeff);
y1 := BasisPoints.y - (1.5 * RaizeKoeff);
x2 := BasisPoints.x + (4 * RaizeKoeff);
y2 := BasisPoints.y - (4 * RaizeKoeff);
end;
end;
end;
// if FIsVertical then
// begin
// x1 := ActualPoints[1].x;
// y1 := ActualPoints[1].y;
// x2 := ActualPoints[1].x + 4;
// y2 := ActualPoints[1].y - 4;
// end;
{*******************************************************}
Gap2 := FGap / 2 + 0.2;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
if (GCadForm.PCad.ZoomScale >= 500) and (GCadForm.PCad.ZoomScale < 1000) then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 2
else
if GCadForm.PCad.ZoomScale >= 1000 then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 3;
end;
//if (aZoomScaleCad > 50) then
// adim1 := adim1 / (aZoomScaleCad / 100);
if aZoomScaleCad > 0 then
begin
Gap2 := Gap2 / (aZoomScaleCad / 100);
end;
len := sqrt(sqr(x1 - x2) + sqr(y1 - y2));
if len = 0 then
len := 0.001;
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
try
x3 := Gap2 * cos((f - 90) * pi / 180) + x1;
y3 := Gap2 * sin((f - 90) * pi / 180) + y1;
x4 := Gap2 * cos((f + 90) * pi / 180) + x1;
y4 := Gap2 * sin((f + 90) * pi / 180) + y1;
x5 := Gap2 * cos((f - 90) * pi / 180) + x2;
y5 := Gap2 * sin((f - 90) * pi / 180) + y2;
x6 := Gap2 * cos((f + 90) * pi / 180) + x2;
y6 := Gap2 * sin((f + 90) * pi / 180) + y2;
except
Result := false;
Exit;
end;
Points[0].x := round(x3 * 100);
Points[0].y := round(y3 * 100);
Points[1].x := round(x5 * 100);
Points[1].y := round(y5 * 100);
Points[2].x := round(x6 * 100);
Points[2].y := round(y6 * 100);
Points[3].x := round(x4 * 100);
Points[3].y := round(y4 * 100);
FRegionPoints[0].X := Points[0].x;
FRegionPoints[0].y := Points[0].y;
FRegionPoints[1].X := Points[1].x;
FRegionPoints[1].y := Points[1].y;
FRegionPoints[2].X := Points[2].x;
FRegionPoints[2].y := Points[2].y;
FRegionPoints[3].X := Points[3].x;
FRegionPoints[3].y := Points[3].y;
FRegionPointsIsActual := True;
end
else
begin
Points[0].x := FRegionPoints[0].X;
Points[0].y := FRegionPoints[0].y;
Points[1].x := FRegionPoints[1].X;
Points[1].y := FRegionPoints[1].y;
Points[2].x := FRegionPoints[2].X;
Points[2].y := FRegionPoints[2].y;
Points[3].x := FRegionPoints[3].X;
Points[3].y := FRegionPoints[3].y;
end;
//RegHandle := CreatePolygonRgn(Points, 4, WINDING);
//result := PtInRegion(RegHandle, round(x * 100), round(y * 100));
//DeleteObject(RegHandle);
Parr[1].X := Points[0].x;
Parr[1].y := Points[0].y;
Parr[2].X := Points[1].x;
Parr[2].y := Points[1].y;
Parr[3].X := Points[2].x;
Parr[3].y := Points[2].y;
Parr[4].X := Points[3].x;
Parr[4].y := Points[3].y;
NeedPoint.X := round(x * 100);
NeedPoint.y := round(y * 100);
//res2 := PtInPoly(PArr, NeedPoint);
//if result <> res2 then
// res2 := result;
result := PtInPoly(PArr, NeedPoint);
// VERTICAL ***
if not Result then
if FIsVertical then
begin
if (x > ActualPoints[1].x - 0.5) and (x < ActualPoints[1].x + 0.5) and
(y > ActualPoints[1].y - 0.5) and (y < ActualPoints[1].y + 0.5) then
Result := True;
end;
//05.04.2011 - Åñëè îáúåêò ñêðûò îò ïðîðèñîâêè, çíà÷èò íå äàåì åãî âûäåëèòü ìûøêîé
if Not FIsDraw and Not Selected and (Not(ssShift in GGlobalShiftState)) then
Result := false;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.isPointIn', E.Message);
end;
end;
destructor TOrthoLine.Destroy;
begin
try
if TDrawStyle(DrawStyle) <> dsTrace then
begin
try
if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
TF_CAD(TPowerCad(Owner ).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Destroy FNeedUpdateCheckedFigures', E.Message);
end;
end;
//Tolik
if Length(FActualZOrder) > 0 then
SetLength(FActualZOrder, 0);
if (Owner <> nil) then // Tolik 04/02/2020 --
begin
//if TPowerCad(Owner).FRemFigure then
if OutTextCaptions <> nil then
begin
// OutTextCaptions.Clear;
OutTextCaptions.Free;
OutTextCaptions := nil; // Tolik 23/03/2017 --
end;
if OutTextNotes <> nil then
begin
//OutTextNotes.Clear;
OutTextNotes.Free;
OutTextNotes := Nil; // Tolik 23/03/2017 --
end;
////////////////////////////////
if FTraceCaptionsList <> nil then
begin
//FTraceCaptionsList.Clear;
FreeAndNil(FTraceCaptionsList);
end;
end;
// 21.09.2105 Tolik GCadForm.PCad.Figures ñþäà óæå ìîæåò êàê nil ïîïàñòü, ïîòîìó ëó÷øå âîîáùå òàê íå äåëàòü,
// ÷òîáû íå íàðâàòüñÿ íà AV íà ïóñòîì ìåñòå
{ if FDrawFigure <> nil then
if GCadForm.PCad.Figures.IndexOf(FDrawFigure) = -1 then
//FreeAndNil(FDrawFigure); ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ
FDrawFigure.Delete; // íóæíî òàê è âåçäå òàê äåëàòü
//}
//Tolik 04/03/2017 --
//CrossList.free;
//
FreeAndDisposeList(CrossList);
inherited;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Destroy', E.Message);
end;
end;
function TOrthoLine.GetActualZOrder(Index: Integer): Double;
var
DynArrLen: integer;
begin
try
result := 0;
DynArrLen := length(FActualZOrder);
if (Index <= DynArrLen) And (Index > 0)then
result := FActualZOrder[Index - 1];
except
// on E: Exception do addExceptionToLogEx('TOrthoLine.GetActualZOrder', E.Message);
end;
end;
procedure TOrthoLine.SetActualZOrder(Index: Integer; const Value: Double);
var
DynArrLen: integer;
begin
try
DynArrLen := length(FActualZOrder);
if Index > DynArrLen then
SetLength(FACtualZOrder, Index);
FActualZOrder[Index - 1] := Value;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetActualZOrder', E.Message);
end;
end;
// Tolik -- 03/04/2017 -- ñòàðàÿ çàêîììåí÷åíà (ñìîòðè íèæå)
procedure TOrthoLine.ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean; OldCaptionList: TStringList = nil; OldH: Double = -1; OldW: Double = -1);
var
i, j, k: integer;
CaptionsLHandle: integer;
CPLine: TDoublePoint;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
PointsPos: TDoublePoint;
CurAngle: Double;
MvAngle: Double;
CapStrings: TStrings;
FRecreate: Boolean;
OutTextStrings: TStringList;
SavedCaptionPos: TDoublePoint;
ObjectFromRaise: TConnectorObject;
BasisPoint: TDoublePoint;
Point1, Point2: TDoublePoint;
Bnd: TDoubleRect;
CapWidth: Double;
PointObject: TConnectorObject;
Captions: TRichTextMod;
Background: TRectangle;
FontStyles: TFontStyles;
// Tolik --> 27/11/2015
Maxx, Maxy, Minx, Miny: double;
CanMoveCaption: Boolean;
NewH, NewW, deltaX, deltaY: double;
LineCount: Integer;
h1: double;
LineAngle: Double;
EmptyLineCount: integer;
OneCaptionsLineHeight: double;
EmptyblockH: double;
DeltaH: Double;
CadRefreshFlag: Boolean;
CanReturnToPos: Boolean;
CanDelEmptyPos: Boolean;
PE_DeltaX, PE_DeltaY: Double;
AngleRad: Double;
//
begin
CadRefreshFlag := GCanRefreshCad;
try
if Self.deleted then
exit;
// Tolik 05/04/2017 -- åñëè íå ïîêàçûâàòü äëèíó òðàññû - ñáðàñûâàòü âûðàâíèâàíèå ïîäïèñè ïîä ëèíèþ
(*{$IF Not Defined(SCS_PE)}*)
if not ShowLength then
begin
FCaptionsViewType := cv_UnderLine;
Self.CaptionsGroupH := 0;
end;
(*{$IFEND}*)
//
//Tolik
CanMoveCaption := False;
if FCaptionsViewType <> cv_Auto then
Self.CaptionsGroupH := 0
else
begin
// Save Font Size Before
if ((CaptionsGroup <> nil) and (CaptionsGroup.InFigures.count = 2)) then
begin
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, OldH, OldW);
end
else
begin
// OldH := -1;
// OldW := -1;
end;
//04/04/2017 --
if ((CaptionsGroup <> nil) and (Self.CaptionsGroupH = 0)) then
Self.CaptionsGroupH := Self.CalcHCaptionsGroup;
end;
//
FontStyles := [];
if FCaptionsFontBold then
FontStyles := [fsBold];
OutTextStrings := TStringList.create;
// Tolik 05/04/2017 --
CanReturnToPos := True;
//11.10.2011
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
for i := 0 to OutTextCaptions.Count - 1 do
begin
if i = 1 then
begin
if ShowLength then
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end
else
//Tolik 05/04/2017 -- åñëè íå ïîêàçûâàòü äëèíó, òî ïóñòûå ñòðîêè íå áåðåì
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
begin
if OutTextCaptions.Strings[i] <> '' then
OutTextStrings.Add(OutTextCaptions.Strings[i])
else
CanReturnToPos := False;
end;
//
end;
end
else
begin
for i := 0 to OutTextCaptions.Count - 1 do
begin
if i = 0 then
begin
if ShowLength then
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end
else
//Tolik 05/04/2017 -- åñëè íå ïîêàçûâàòü äëèíó, òî ïóñòûå ñòðîêè íå áåðåì
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
begin
if ShowLength then
OutTextStrings.Add(OutTextCaptions.Strings[i])
else
begin
if (OutTextCaptions.Strings[i] <> '') then
OutTextStrings.Add(OutTextCaptions.Strings[i])
else
CanReturnToPos := False;
end;
end;
//
end;
end;
if aNeedReCreate then
FRecreate := True
else
begin
if CaptionsGroup <> nil then
begin
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
CapStrings := Captions.re.Lines;
end
else
CapStrings := nil;
//11.10.2011 OutTextStrings := TStringList.Create;
// !!!
// 11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end
// else
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end
// else
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end;
//end;
// !!!
FRecreate := IsStringListsDifferent(OutTextStrings, CapStrings);
//11.10.2011 FreeAndNil(OutTextStrings);
end;
if CaptionsGroup <> nil then
SavedCaptionPos := CaptionsGroup.CenterPoint;
//Tolik
//GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', OldCaptionList, OldH, OldW);
//
if FRecreate then
begin
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(3);
if CaptionsGroup <> nil then
begin
RemoveInFigureGrp(CaptionsGroup);
GCadForm.PCad.Figures.Remove(CaptionsGroup);
FreeAndNil(CaptionsGroup);
end;
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{Captions := TRichTextMod.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Caption, 2);
Captions.RE.Lines.Clear;
Captions.re.Font.Size := FCaptionsFontSize;
Captions.re.Font.Name := FCaptionsFontName;
Captions.re.Font.Color := FCaptionsFontColor;
if FCaptionsFontBold then
Captions.re.Font.Style := [fsBold]
else
Captions.re.Font.Style := [];
if GCadForm.PCad.PageColor = 0 then
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor + 1
else
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor - 1;
// !!!
//11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end;
for i := 0 to OutTextStrings.Count - 1 do
Captions.RE.Lines.Add(OutTextStrings[i]); //11.10.2011
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
xCanvas := TMetafileCanvas.Create(Captions.Metafile, 0);
xCanvas.Font.Name := Captions.re.Font.Name;
xCanvas.Font.Size := Captions.re.Font.Size;
xCanvas.Font.Style := Captions.re.Font.Style;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * Captions.re.Lines.Count + 1;
w := 0;
for i := 0 to Captions.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(Captions.Re.Lines[i]) then
w := xCanvas.TextWidth(Captions.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ÏÅÐÅÑÎÇÄÀÒÜ Ñ ÍÎÂÛÌÈ ÑÂÎÉÑÒÂÀÌÈ
if Captions <> nil then
begin
FreeAndNil(Captions);
end;}
// Tolik -- 25/11/2015
// GetTextSize(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', OutTextStrings, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', OutTextStrings, h, w);
//
Captions := TRichTextMod.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Caption, 2);
Captions.RE.Lines.Clear;
Captions.re.Font.Size := FCaptionsFontSize;
Captions.re.Font.Name := FCaptionsFontName;
Captions.re.Font.Color := FCaptionsFontColor;
//11.10.2011 if FCaptionsFontBold then
//11.10.2011 Captions.re.Font.Style := [fsBold]
//11.10.2011 else
//11.10.2011 Captions.re.Font.Style := [];
Captions.re.Font.Style := FontStyles;
if GCadForm.PCad.PageColor = 0 then
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor + 1
else
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor - 1;
// !!!
//11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end;
for i := 0 to OutTextStrings.Count - 1 do
begin
OutTextStrings[i] := FastReplace(OutTextStrings[i],#13#10,' ');
Captions.RE.Lines.Add(OutTextStrings[i]); //11.10.2011
end;
Captions.Visible := True;
// !!!
// ñ îáû÷íûì ôîíîì
Background := TRectangle.create(-100, -100, -100, -100, 1, ord(psClear), clNone, ord(bsClear), clNone,
CaptionsLHandle, mydsNormal, GCadForm.PCad);
Background.Visible := True;
CaptionsGroup := TFigureGrpNotMod.create(CaptionsLHandle, GCadForm.PCad);
CaptionsGroup.Radius := 2;
CaptionsGroup.AddFigure(Background);
CaptionsGroup.AddFigure(Captions);
CaptionsGroup.LockModify := True;
CaptionsGroup.Visible := True;
GCadForm.PCad.AddCustomFigure(GLN (CaptionsLHandle), CaptionsGroup, False);
end;
if FIsRaiseUpDown then
begin
ObjectFromRaise := nil; // !!!!
// 1
if JoinConnector1 <> nil then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector1).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector1).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
end;
// 2
// Tolik 31/05/2016 --
if JoinConnector2 <> nil then
//
begin
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector2).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector2).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector2).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
end;
if ObjectFromRaise <> nil then
begin
if ObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoint.x := ObjectFromRaise.ActualPoints[1].x + ObjectFromRaise.GrpSizeX / 2;
BasisPoint.y := ObjectFromRaise.ActualPoints[1].y - ObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoint.x := ObjectFromRaise.DrawFigure.CenterPoint.x + ObjectFromRaise.GrpSizeX / 2 - 0.5;
BasisPoint.y := ObjectFromRaise.DrawFigure.CenterPoint.y - ObjectFromRaise.GrpSizeY / 2 + 0.5;
end;
Point1.x := BasisPoint.x;
Point1.y := BasisPoint.y;
Point2.x := BasisPoint.x + 4;
Point2.y := BasisPoint.y - 4;
Bnd := CaptionsGroup.GetBoundRect;
CapWidth := abs(Bnd.Right - Bnd.Left);
CPLine.x := (Point1.x + Point2.x) / 2 + CapWidth / 2 + 2;
CPLine.y := (Point1.y + Point2.y) / 2;
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
end;
end
else
begin
Background := TRectangle(CaptionsGroup.InFigures[0]);
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
CPLine.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
CPLine.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
CurAngle := Captions.AngletoPoint;
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
end
else
begin
// new mark
// åñëè íå îòîáðàæàåòñÿ äëèíà - íå áóäåì âðàùàòü
//CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâèì êàê áûëî
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
// Tolik ** --- òóò íàäêèñü óæå, ïî èäëåå âûñòàâëåíà ïî öåíòðó ëèíèè
// îñòàåòñÿ òîëüêî ñäâèíóòü åå íåìíîæêî â ñòîðîíó
CaptionsGroup.GetBounds(MaxX, MaxY, MinX, MinY);
LineAngle := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
While LineAngle > 360 do
LineAngle := LineAngle - 360;
AngleRad := (LineAngle*PI) / 180;
PE_DeltaX := (MaxX - Minx + GRPSizeY/2 + 0.25)*Sin(AngleRad);
PE_DeltaY := (Maxy - MinY + GrpSizeY/2 + 0.25)*Cos(AngleRad);
{ if (LineAngle >= 0) and (LineAngle < 180) then
begin
PE_DeltaX := -PE_DeltaX;
PE_DeltaY := -PE_DeltaY;
end;}
if (LineAngle >= 90) and (LineAngle <= 180) then
begin
PE_DeltaX := PE_DeltaX;
PE_DeltaY := -PE_DeltaY;
end;
if (LineAngle > 180) and (LineAngle <= 270) then
begin
//dd := dx;
//dx := -dy;
//dy := dx;
PE_DeltaX := PE_DeltaX;
PE_DeltaY := -PE_DeltaY;
end;
if (LineAngle >= 270) and (LineAngle <= 360) then
begin
PE_DeltaX := -PE_DeltaX;
PE_DeltaY := PE_DeltaY;
end;
//if (LineAngle >= 0) and (LineAngle <= 90) then
if (LineAngle >= 0) and (LineAngle < 90) then
begin
PE_DeltaX := -PE_DeltaX;
PE_DeltaY := PE_DeltaY;
end;
// ïîä ëèíèåé
{if FCaptionsViewType = cv_UnderLine then
begin
PE_DeltaX := -PE_DeltaX;
PE_DeltaY := -PE_DeltaY;
end;}
CaptionsGroup.Move(PE_DeltaX/2, PE_DeltaY/2);
//
end;
{$ELSE}
//Tolik
CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
//
{$IFEND}
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{xCanvas := TMetafileCanvas.Create(Captions.Metafile, 0);
xCanvas.Font.Name := Captions.re.Font.Name;
xCanvas.Font.Size := Captions.re.Font.Size;
xCanvas.Font.Style := Captions.re.Font.Style;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * Captions.re.Lines.Count + 1;
FreeAndNil(xCanvas);}
// Tolik -- 17/12/2015 -- åñëè íàäïèñü ïî öåíòðó, òî íóæíåí íå öåíòð íàäïèñè, à öåíòð ïóñòûõ ñòðîê
if FCaptionsViewType = cv_Center then
// Tolik 23/12/2015 -- þçàòü òîëüêî ñâîéñòâà ëèíèè, òàê êàê ïîñëå îòêðûòèÿ ïðîåêòà, íàïðèìåð,
// TRichText íå ïîäíèìåò ñâîéñòâà øðèôòà è áóäåò áÿêà - ðàçíîãëàñèå â ðàçìåðàõ
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, h, w)
//
else
// Tolik 23/12/2015 -- þçàòü òîëüêî ñâîéñòâà ëèíèè, òàê êàê ïîñëå îòêðûòèÿ ïðîåêòà, íàïðèìåð,
// TRichText íå ïîäíèìåò ñâîéñòâà øðèôòà è áóäåò áÿêà - ðàçíîãëàñèå â ðàçìåðàõ
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, h, w);
//
// ïîäâèíóòü ïîäïèñü ââåðõ/âíèç
if Captions.re.Lines.Count > 0 then
begin
if GCadForm.FShowLineCaptionsType = skExternalSCS then
PointsPos := GetCaptionsGroupNewPos(h / 2 / Captions.re.Lines.Count, Captions.re.Lines.Count)
else
begin
// Tolik 22/12/2015 -- ó÷åñòü âûñîòó FDrawFigure (åñëè íàä/ïîä ëèíèåé)
if ((FCaptionsViewType = cv_OverLine) or (FCaptionsViewType = cv_UnderLine)) then
begin
if Captions.re.Lines.Count > 1 then
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2 + GrpSizeY/2, Captions.re.Lines.Count)
// PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
PointsPos := GetCaptionsGroupNewPos(h / 2 + GrpSizeY/2, Captions.re.Lines.Count);
// PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end
else
begin
if Captions.re.Lines.Count > 1 then
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end;
end;
end
else
PointsPos := CPLine;
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
// Tolik 12/04/2017 --
begin
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x, PointsPos.y - CaptionsGroup.CenterPoint.y);
if FCaptionsViewType = cv_Center then
begin
MvAngle := AngleCalcDF(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
if Captions.re.Lines.Count <= 3 then
begin
NewH := 0;
{
if Captions.re.Lines.Count <> 1 then
NewH := 0.25
}
if Captions.re.Lines.Count > 0 then
begin
//NewH := (h - 1)/2;
NewH := 0.7;
//OneCaptionsLineHeight := (h - 1)/Captions.Re.Lines.Count;
end;
end
else
if Captions.re.Lines.Count > 3 then
begin
CanMoveCaption := False; // ýòî íà âñÿêèé, ÷òîáû íå åáíóëîñü, âäðóã ïîëüçîâàòåëü ÷åãî-òî íàêîëäîâàë ñ íàäïèñüþ âðó÷íóþ
// à ÕÇ îòêóäà ïðèäåò
LineCount := 1;
k := 1;
EmptyLineCount := 0;
While Captions.re.Lines[k] = '' do
begin
Inc(EmptyLineCount);
Inc(LineCount);
Inc(k);
if Captions.re.Lines[k] <> '' then
CanMoveCaption := True;
if k = Captions.re.Lines.Count - 1 then
break;
end;
{if CanMoveCaption then
begin
Inc(LineCount);
if LineCount < Captions.re.Lines.Count then
begin
NewH := ((Captions.re.Lines.Count - LineCount) * ((h - 1)/LineCount)) / 2;
end;
end;}
if CanMoveCaption then
begin
OneCaptionsLineHeight := (h - 1)/Captions.Re.Lines.Count;
NewH := (h - 1)/2 - OneCaptionsLineHeight - ((EmptyLineCount/2)*OneCaptionsLineHeight) + 0.25;
//NewH := (h - 1)/2 - ((EmptyLineCount/2)*OneCaptionsLineHeight);
end;
end;
LineAngle := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
While LineAngle > 360 do
LineAngle := LineAngle - 360;
//
mvAngle := LineAngle * pi / 180;
deltaX := NewH * sin(mvAngle);
// mvAngle := mvAngle + pi;
deltaY := NewH*cos(mvAngle);
if (LineAngle >= 90) and (LineAngle <= 180) then
begin
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 180) and (LineAngle <= 270) then
begin
//dd := dx;
//dx := -dy;
//dy := dx;
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 270) and (LineAngle <= 360) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
//if (LineAngle >= 0) and (LineAngle <= 90) then
if (LineAngle >= 0) and (LineAngle < 90) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
// deltaX := NewH*Sin(mvAngle);
// deltaY := NewH*Cos(mvAngle);
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x + deltaX, PointsPos.y - CaptionsGroup.CenterPoint.y + deltaY);
end;
end
//
else
begin
// new mark
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâèì êàê áûëî
// Tolik 1/04/2017 --
//
//if ShowLength then // 12/04/2017 --
{ begin
// Tolik 22/12/2015 -- ó÷åñòü âûñîòó FDrawFigure (åñëè íàä/ïîä ëèíèåé)
if ((FCaptionsViewType = cv_OverLine) or (FCaptionsViewType = cv_UnderLine)) then
begin
if Captions.re.Lines.Count > 1 then
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2 + GrpSizeY/2, Captions.re.Lines.Count)
// PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
PointsPos := GetCaptionsGroupNewPos(h / 2 + GrpSizeY/2, Captions.re.Lines.Count);
// PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end
else
begin
if Captions.re.Lines.Count > 1 then
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end;
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x, PointsPos.y - CaptionsGroup.CenterPoint.y);
end; }
//CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x, PointsPos.y - CaptionsGroup.CenterPoint.y);
end;
{$ELSE}
// Tolik 22/12/2015 -- îïðåäåëèòü ñìåùåíèå öåíòðà íàäïèñè (Åñëè âûðàâíèâàíèå íàäïèñè - ïî öåíòðó)
deltaX := 0;
deltaY := 0;
if FCaptionsViewType = cv_Center then
begin
MvAngle := AngleCalcDF(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
if Captions.re.Lines.Count <= 3 then
begin
NewH := 0;
{
if Captions.re.Lines.Count <> 1 then
NewH := 0.25
}
if Captions.re.Lines.Count > 0 then
begin
//NewH := (h - 1)/2;
NewH := 0.7;
//OneCaptionsLineHeight := (h - 1)/Captions.Re.Lines.Count;
end;
end
else
if Captions.re.Lines.Count > 3 then
begin
CanMoveCaption := False; // ýòî íà âñÿêèé, ÷òîáû íå åáíóëîñü, âäðóã ïîëüçîâàòåëü ÷åãî-òî íàêîëäîâàë ñ íàäïèñüþ âðó÷íóþ
// à ÕÇ îòêóäà ïðèäåò
LineCount := 1;
k := 1;
EmptyLineCount := 0;
While Captions.re.Lines[k] = '' do
begin
Inc(EmptyLineCount);
Inc(LineCount);
Inc(k);
if Captions.re.Lines[k] <> '' then
CanMoveCaption := True;
if k = Captions.re.Lines.Count - 1 then
break;
end;
{if CanMoveCaption then
begin
Inc(LineCount);
if LineCount < Captions.re.Lines.Count then
begin
NewH := ((Captions.re.Lines.Count - LineCount) * ((h - 1)/LineCount)) / 2;
end;
end;}
if CanMoveCaption then
begin
OneCaptionsLineHeight := (h - 1)/Captions.Re.Lines.Count;
NewH := (h - 1)/2 - OneCaptionsLineHeight - ((EmptyLineCount/2)*OneCaptionsLineHeight) + 0.25;
//NewH := (h - 1)/2 - ((EmptyLineCount/2)*OneCaptionsLineHeight);
end;
end;
LineAngle := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
While LineAngle > 360 do
LineAngle := LineAngle - 360;
//
mvAngle := LineAngle * pi / 180;
deltaX := NewH * sin(mvAngle);
// mvAngle := mvAngle + pi;
deltaY := NewH*cos(mvAngle);
if (LineAngle >= 90) and (LineAngle <= 180) then
begin
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 180) and (LineAngle <= 270) then
begin
//dd := dx;
//dx := -dy;
//dy := dx;
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 270) and (LineAngle <= 360) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
//if (LineAngle >= 0) and (LineAngle <= 90) then
if (LineAngle >= 0) and (LineAngle < 90) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
// deltaX := NewH*Sin(mvAngle);
// deltaY := NewH*Cos(mvAngle);
end;
//
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x + deltaX, PointsPos.y - CaptionsGroup.CenterPoint.y + deltaY);
{$IFEND}
// Tolik--25/11/2015 -- â ïåðåðàñ÷åòå óãëà ïîâîðîòà óáðàíû îêðóãëåíèÿ
// MvAngle := AngleCalc(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
MvAngle := AngleCalcDF(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
end
else
begin
// new mark
// åñëè íå îòîáðàæàåòñÿ äëèíà - íå âðàùàåì
//CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
end;
{$ELSE}
CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
{$IFEND}
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà íå ìåíÿåì íè÷åãî
{
if Not ShowLength then // new mark
begin
CaptionsGroup.Move(abs(CaptionsGroup.ap2.x - CaptionsGroup.ap1.x)/2, 0);
end;
}
{$IFEND}
end;
// âåðíóòü ïîçèöèþ ïîäïèñè ïåðåä ìîäèôèêàöèåé
// Tolik
if (aReturnToPos and (FCaptionsViewType <> cv_Center)) then
begin
if CanReturnToPos then // åñëè èç íàäïèñè áûëè óäàëåíû ïóñòûå ñòðî÷êè, òî
// âîçâðàùàòüñÿ íà ñòàðóþ ïîçèöèþ íåëüçÿ
begin
//05/04/2017 -- âîçâðàùàòüñÿ íà ïîçèöèþ òîëüêî, åñëè íå èçìåíèëîñü êîëè÷åñòâî ñòðî÷åê â ïîäïèñè ê òðàññå !!!
if (OldCaptionList = nil) or ((OldCaptionList <> nil) and (OldCaptionList.Count = Captions.re.Lines.Count)) then
begin
//
if CaptionsGroup <> nil then
// if (CaptionsGroup <> nil) and (FCaptionsViewType = cv_Auto) then
begin
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
if OldCaptionList = nil then
begin // Ýòî åñëè, äîïóñòèì, ðàçìåð øðèôòà ïîìåíÿëñÿ
if (OldH <> -1) and (OldW <> -1) then
begin
//if OldCaptionList.Count = Captions.re.Lines.count then
begin
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, NewH, NewW);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, NewH, NewW);
deltaX := (OldW/2 - NewW/2)*sin(CaptionsGroup.AngleToPoint); // øèðèíà
deltaY := (OldH/2 - NewH/2)*cos(CaptionsGroup.AngletoPoint); // âûñîòà
if FCaptionsViewType = cv_underLine then
begin
deltax := -deltax;
deltay := - deltay;
end;
CaptionsGroup.Move(deltaX, deltaY);
end;
end;
end
end
else
begin
// new mark
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâëÿåì êàê åñòü
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Move(abs(CaptionsGroup.ap2.x - CaptionsGroup.ap1.x)/2, 0);
end;
{$ELSE}
// Tolik -- 01/12/2015 --
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
if Self.FCaptionsViewType <> cv_Center then // åñëè ïî öåíòðó, òî ïîõ
begin
// åñëè ðàçìåð íàäïèñè ïî äîðîãå èçìåíèëñÿ, òî íóæíî ó÷åñòü è ñìåùåíèå öåíòðà íîâîé íàäïèñè îòíîñèòåëüíî òîãî, ÷òî áûëî,
// à òî õåðíÿ êàêà-òî ïîëó÷àåòñÿ
if OldCaptionList = nil then
begin // Ýòî åñëè, äîïóñòèì, ðàçìåð øðèôòà ïîìåíÿëñÿ
if (OldH <> -1) and (OldW <> -1) then
begin
//if OldCaptionList.Count = Captions.re.Lines.count then
begin
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, NewH, NewW);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, NewH, NewW);
deltaX := (OldW/2 - NewW/2)*sin(CaptionsGroup.AngleToPoint); // øèðèíà
deltaY := (OldH/2 - NewH/2)*cos(CaptionsGroup.AngletoPoint); // âûñîòà
if FCaptionsViewType = cv_underLine then
begin
deltax := -deltax;
deltay := - deltay;
end;
CaptionsGroup.Move(deltaX, deltaY);
end;
end;
end
else
// ñþäà ïðèäåì, êîãäà ê òðàññå äîáàâèòñÿ êàêîé-íèòü ýëåìåíò òèïà êàá êàíàëà
begin
(*
if OutTextStrings.Count <> OldCaptionList.Count then
begin
CaptionsGroup.Move(CPLine.X - CaptionsGroup.CenterPoint.X, CPLine.Y - CaptionsGroup.CenterPoint.Y);
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, NewH, NewW);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, NewH, NewW);
// NewH := NewH - 1; // ñáðàñûâàåì 1
// 03/04/2017 --
// OldH := NewH/OldCaptionList.Count;
//GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', OutTextStrings, OldH, OldW);
//OldH := oldH - 1;
//OldH := OldH/OldCaptionList.Count;
// Newh := NewH/OutTextStrings.Count;
//Newh := NewH/Captions.re.Lines.Count;
{ if FCaptionsViewType = cv_OverLine then
//h1 := (NewH - OldH)/2 - GrpSizeY/2
h1 := (NewH - 1)/2 + GrpSizeY/2
else
if FCaptionsViewType = cv_UnderLine then
//h1 := (NewH - OldH)/2 + GrpSizeY/2;
h1 := (NewH - 1)/2 + GrpSizeY/2;
}
//h1 := ((NewH - 1)*Captions.re.Lines.Count)/2 + GrpSizeY/2;
//h1 := (NewH - 1)/2 + GrpSizeY/2;
deltaX := (OldW/2 - NewW/2)*sin(CaptionsGroup.AngleToPoint); // øèðèíà
deltaY := (OldH/2 - NewH/2)*cos(CaptionsGroup.AngletoPoint); // âûñîòà
if FCaptionsViewType = cv_underLine then
begin
deltax := -deltax;
deltay := - deltay;
end;
{ h1 := (NewH)/2 + GrpSizeY/2 + 1;
deltaX := h1 * Sin(CaptionsGroup.AngletoPoint);
deltaY := h1 * Cos(CaptionsGroup.AngletoPoint);
if FCaptionsViewType = cv_UnderLine then
begin
deltaX := -deltaX;
deltaY := -deltaY;
end
else
if FCaptionsViewType = cv_OverLine then
begin
deltaX := -deltaX;
deltaY := deltaY;
end; }
// Tolik 04/04/2017 --
//CaptionsGroup.Move(deltaX, deltay);
CaptionsGroup.Move(deltaX,deltay);
//CaptionsGroup.Move(PointsPos.X - CaptionsGroup.CenterPoint.X + deltaX, PointsPos.Y - CaptionsGroup.CenterPoint.Y + deltay);
//
end; *)
end;
end;
//
{$IFEND}
end
end;
end
else
begin // åñëè áûë ñáðîñ ïîçèöèîíèðîâàíèÿ íàäïèñè -- óäàëèòü ïóñòûå ñòðî÷êè (íà âñÿêèé)
CanDelEmptyPos := true;
while CanDelEmptyPos do
begin
CanDelEmptyPos := False;
for i := 0 to OutTextCaptions.Count - 1 do
begin
if OutTextCaptions[i] = '' then
begin
OutTextCaptions.Delete(i);
CanDelEmptyPos := True;
break;
end;
end;
end;
end;
end;
// Tolik -- 22/09/2016 -- ÷òîáû íàäïèñü íå îêàçàëàñü ïîä ëèíèåé - âûäâèíóòü íàâåðõ
if self.Owner <> nil then
begin
TPowerCad(Self.Owner).OrderFigureToFront(CaptionsGroup);
end;
//OutTextStrings.Free;
FreeAndNil(OutTextStrings);
//CadRefreshFlag := GCanRefreshCad;
{GCanRefreshCad := True;
GCadForm.PCad.Refresh;
GCanRefReshCad := CadRefreshFlag;}
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ReCreateCaptionsGroup', E.Message);
end;
GCanRefReshCad := CadRefreshFlag;
GCadForm.PCad.Refresh;
end;
(*
//procedure TOrthoLine.ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean; OldCaptionList: TStringList = nil);
procedure TOrthoLine.ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean; OldCaptionList: TStringList = nil; OldH: Double = -1; OldW: Double = -1);
var
i, j, k: integer;
CaptionsLHandle: integer;
CPLine: TDoublePoint;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
PointsPos: TDoublePoint;
CurAngle: Double;
MvAngle: Double;
CapStrings: TStrings;
FRecreate: Boolean;
OutTextStrings: TStringList;
SavedCaptionPos: TDoublePoint;
ObjectFromRaise: TConnectorObject;
BasisPoint: TDoublePoint;
Point1, Point2: TDoublePoint;
Bnd: TDoubleRect;
CapWidth: Double;
PointObject: TConnectorObject;
Captions: TRichTextMod;
Background: TRectangle;
FontStyles: TFontStyles;
// Tolik --> 27/11/2015
Maxx, Maxy, Minx, Miny: double;
CanMoveCaption: Boolean;
NewH, NewW, deltaX, deltaY: double;
LineCount: Integer;
h1: double;
LineAngle: Double;
//
begin
try
if Self.deleted then
exit;
//Tolik
CanMoveCaption := False;
if FCaptionsViewType <> cv_Auto then
Self.CaptionsGroupH := 0
else
begin
// Save Font Size Before
if ((CaptionsGroup <> nil) and (CaptionsGroup.InFigures.count = 2)) then
begin
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, OldH, OldW);
end
else
begin
// OldH := -1;
// OldW := -1;
end;
end;
//
FontStyles := [];
if FCaptionsFontBold then
FontStyles := [fsBold];
OutTextStrings := TStringList.create;
//11.10.2011
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
for i := 0 to OutTextCaptions.Count - 1 do
begin
if i = 1 then
begin
if ShowLength then
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end
else
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end;
end
else
begin
for i := 0 to OutTextCaptions.Count - 1 do
begin
if i = 0 then
begin
if ShowLength then
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end
else
OutTextStrings.Add(OutTextCaptions.Strings[i]);
end;
end;
if aNeedReCreate then
FRecreate := True
else
begin
if CaptionsGroup <> nil then
begin
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
CapStrings := Captions.re.Lines;
end
else
CapStrings := nil;
//11.10.2011 OutTextStrings := TStringList.Create;
// !!!
// 11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end
// else
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end
// else
// OutTextStrings.Add(OutTextCaptions.Strings[i]);
// end;
//end;
// !!!
FRecreate := IsStringListsDifferent(OutTextStrings, CapStrings);
//11.10.2011 FreeAndNil(OutTextStrings);
end;
if CaptionsGroup <> nil then
SavedCaptionPos := CaptionsGroup.CenterPoint;
//Tolik
//GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', OldCaptionList, OldH, OldW);
//
if FRecreate then
begin
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(3);
if CaptionsGroup <> nil then
begin
RemoveInFigureGrp(CaptionsGroup);
GCadForm.PCad.Figures.Remove(CaptionsGroup);
FreeAndNil(CaptionsGroup);
end;
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{Captions := TRichTextMod.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Caption, 2);
Captions.RE.Lines.Clear;
Captions.re.Font.Size := FCaptionsFontSize;
Captions.re.Font.Name := FCaptionsFontName;
Captions.re.Font.Color := FCaptionsFontColor;
if FCaptionsFontBold then
Captions.re.Font.Style := [fsBold]
else
Captions.re.Font.Style := [];
if GCadForm.PCad.PageColor = 0 then
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor + 1
else
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor - 1;
// !!!
//11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end;
for i := 0 to OutTextStrings.Count - 1 do
Captions.RE.Lines.Add(OutTextStrings[i]); //11.10.2011
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
xCanvas := TMetafileCanvas.Create(Captions.Metafile, 0);
xCanvas.Font.Name := Captions.re.Font.Name;
xCanvas.Font.Size := Captions.re.Font.Size;
xCanvas.Font.Style := Captions.re.Font.Style;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * Captions.re.Lines.Count + 1;
w := 0;
for i := 0 to Captions.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(Captions.Re.Lines[i]) then
w := xCanvas.TextWidth(Captions.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ÏÅÐÅÑÎÇÄÀÒÜ Ñ ÍÎÂÛÌÈ ÑÂÎÉÑÒÂÀÌÈ
if Captions <> nil then
begin
FreeAndNil(Captions);
end;}
// Tolik -- 25/11/2015
// GetTextSize(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', OutTextStrings, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', OutTextStrings, h, w);
//
Captions := TRichTextMod.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Caption, 2);
Captions.RE.Lines.Clear;
Captions.re.Font.Size := FCaptionsFontSize;
Captions.re.Font.Name := FCaptionsFontName;
Captions.re.Font.Color := FCaptionsFontColor;
//11.10.2011 if FCaptionsFontBold then
//11.10.2011 Captions.re.Font.Style := [fsBold]
//11.10.2011 else
//11.10.2011 Captions.re.Font.Style := [];
Captions.re.Font.Style := FontStyles;
if GCadForm.PCad.PageColor = 0 then
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor + 1
else
Captions.re.DefAttributes.BackColor := GCadForm.PCad.PageColor - 1;
// !!!
//11.10.2011
//if GCadForm.FShowLineCaptionsType = skExternalSCS then
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 1 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end
//else
//begin
// for i := 0 to OutTextCaptions.Count - 1 do
// begin
// if i = 0 then
// begin
// if ShowLength then
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end
// else
// Captions.RE.Lines.Add(OutTextCaptions[i]);
// end;
//end;
for i := 0 to OutTextStrings.Count - 1 do
Captions.RE.Lines.Add(OutTextStrings[i]); //11.10.2011
Captions.Visible := True;
// !!!
// ñ îáû÷íûì ôîíîì
Background := TRectangle.create(-100, -100, -100, -100, 1, ord(psClear), clNone, ord(bsClear), clNone,
CaptionsLHandle, mydsNormal, GCadForm.PCad);
Background.Visible := True;
CaptionsGroup := TFigureGrpNotMod.create(CaptionsLHandle, GCadForm.PCad);
CaptionsGroup.Radius := 2;
CaptionsGroup.AddFigure(Background);
CaptionsGroup.AddFigure(Captions);
CaptionsGroup.LockModify := True;
CaptionsGroup.Visible := True;
GCadForm.PCad.AddCustomFigure(GLN (CaptionsLHandle), CaptionsGroup, False);
end;
if FIsRaiseUpDown then
begin
ObjectFromRaise := nil; // !!!!
// 1
if JoinConnector1 <> nil then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector1).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector1).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
end;
// 2
// Tolik 31/05/2016 --
if JoinConnector2 <> nil then
//
begin
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector2).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector2).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector2).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
end;
if ObjectFromRaise <> nil then
begin
if ObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoint.x := ObjectFromRaise.ActualPoints[1].x + ObjectFromRaise.GrpSizeX / 2;
BasisPoint.y := ObjectFromRaise.ActualPoints[1].y - ObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoint.x := ObjectFromRaise.DrawFigure.CenterPoint.x + ObjectFromRaise.GrpSizeX / 2 - 0.5;
BasisPoint.y := ObjectFromRaise.DrawFigure.CenterPoint.y - ObjectFromRaise.GrpSizeY / 2 + 0.5;
end;
Point1.x := BasisPoint.x;
Point1.y := BasisPoint.y;
Point2.x := BasisPoint.x + 4;
Point2.y := BasisPoint.y - 4;
Bnd := CaptionsGroup.GetBoundRect;
CapWidth := abs(Bnd.Right - Bnd.Left);
CPLine.x := (Point1.x + Point2.x) / 2 + CapWidth / 2 + 2;
CPLine.y := (Point1.y + Point2.y) / 2;
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
end;
end
else
begin
Background := TRectangle(CaptionsGroup.InFigures[0]);
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
CPLine.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
CPLine.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
CurAngle := Captions.AngletoPoint;
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
end
else
begin
// new mark
// åñëè íå îòîáðàæàåòñÿ äëèíà - íå áóäåì âðàùàòü
//CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâèì êàê áûëî
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
end;
{$ELSE}
//Tolik
CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Move(CPLine.x - CaptionsGroup.CenterPoint.x, CPLine.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Rotate( - CurAngle, Captions.CenterPoint);
//
{$IFEND}
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{xCanvas := TMetafileCanvas.Create(Captions.Metafile, 0);
xCanvas.Font.Name := Captions.re.Font.Name;
xCanvas.Font.Size := Captions.re.Font.Size;
xCanvas.Font.Style := Captions.re.Font.Style;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * Captions.re.Lines.Count + 1;
FreeAndNil(xCanvas);}
// Tolik -- 17/12/2015 -- åñëè íàäïèñü ïî öåíòðó, òî íóæíåí íå öåíòð íàäïèñè, à öåíòð ïóñòûõ ñòðîê
if FCaptionsViewType = cv_Center then
// Tolik 23/12/2015 -- þçàòü òîëüêî ñâîéñòâà ëèíèè, òàê êàê ïîñëå îòêðûòèÿ ïðîåêòà, íàïðèìåð,
// TRichText íå ïîäíèìåò ñâîéñòâà øðèôòà è áóäåò áÿêà - ðàçíîãëàñèå â ðàçìåðàõ
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, h, w)
//
else
// Tolik 23/12/2015 -- þçàòü òîëüêî ñâîéñòâà ëèíèè, òàê êàê ïîñëå îòêðûòèÿ ïðîåêòà, íàïðèìåð,
// TRichText íå ïîäíèìåò ñâîéñòâà øðèôòà è áóäåò áÿêà - ðàçíîãëàñèå â ðàçìåðàõ
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, h, w);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, h, w);
//
// ïîäâèíóòü ïîäïèñü ââåðõ/âíèç
if Captions.re.Lines.Count > 0 then
begin
if GCadForm.FShowLineCaptionsType = skExternalSCS then
PointsPos := GetCaptionsGroupNewPos(h / 2 / Captions.re.Lines.Count, Captions.re.Lines.Count)
else
begin
// Tolik 22/12/2015 -- ó÷åñòü âûñîòó FDrawFigure (åñëè íàä/ïîä ëèíèåé)
if ((FCaptionsViewType = cv_OverLine) or (FCaptionsViewType = cv_UnderLine)) then
begin
if Captions.re.Lines.Count > 1 then
// PointsPos := GetCaptionsGroupNewPos((h - 1) / 2 + GrpSizeY/2, Captions.re.Lines.Count)
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
// PointsPos := GetCaptionsGroupNewPos(h / 2 + GrpSizeY/2, Captions.re.Lines.Count);
PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end
else
begin
if Captions.re.Lines.Count > 1 then
PointsPos := GetCaptionsGroupNewPos((h - 1) / 2, Captions.re.Lines.Count)
else
if Captions.re.Lines.Count = 1 then
PointsPos := GetCaptionsGroupNewPos(h / 2, Captions.re.Lines.Count);
end;
end;
end
else
PointsPos := CPLine;
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x, PointsPos.y - CaptionsGroup.CenterPoint.y)
else
begin
// new mark
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâèì êàê áûëî
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x, PointsPos.y - CaptionsGroup.CenterPoint.y);
end;
{$ELSE}
// Tolik 22/12/2015 -- îïðåäåëèòü ñìåùåíèå öåíòðà íàäïèñè (Åñëè âûðàâíèâàíèå íàäïèñè - ïî öåíòðó)
deltaX := 0;
deltaY := 0;
if FCaptionsViewType = cv_Center then
begin
MvAngle := AngleCalcDF(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
if Captions.re.Lines.Count <= 4 then
begin
NewH := 0;
if Captions.re.Lines.Count <> 1 then
NewH := 0.25
end
else
if Captions.re.Lines.Count > 4 then
begin
CanMoveCaption := False; // ýòî íà âñÿêèé, ÷òîáû íå åáíóëîñü, âäðóã ïîëüçîâàòåëü ÷åãî-òî íàêîëäîâàë ñ íàäïèñüþ âðó÷íóþ
// à ÕÇ îòêóäà ïðèäåò
LineCount := 1;
k := 1;
While Captions.re.Lines[k] = '' do
begin
Inc(LineCount);
Inc(k);
if Captions.re.Lines[k] <> '' then
CanMoveCaption := True;
if k = Captions.re.Lines.Count - 1 then
break;
end;
if CanMoveCaption then
begin
Inc(LineCount);
if LineCount < Captions.re.Lines.Count then
begin
NewH := ((Captions.re.Lines.Count - LineCount) * ((h - 1)/LineCount)) / 2;
end;
end;
end;
LineAngle := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
While LineAngle > 360 do
LineAngle := LineAngle - 360;
//
mvAngle := LineAngle * pi / 180;
deltaX := NewH * sin(mvAngle);
// mvAngle := mvAngle + pi;
deltaY := NewH*cos(mvAngle);
if (LineAngle >= 90) and (LineAngle <= 180) then
begin
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 180) and (LineAngle <= 270) then
begin
//dd := dx;
//dx := -dy;
//dy := dx;
deltaX := deltaX;
deltaY := -deltaY;
end;
if (LineAngle >= 270) and (LineAngle <= 360) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
//if (LineAngle >= 0) and (LineAngle <= 90) then
if (LineAngle >= 0) and (LineAngle < 90) then
begin
deltaX := -deltaX;
deltaY := deltaY;
end;
// deltaX := NewH*Sin(mvAngle);
// deltaY := NewH*Cos(mvAngle);
end;
//
CaptionsGroup.Move(PointsPos.x - CaptionsGroup.CenterPoint.x + deltaX, PointsPos.y - CaptionsGroup.CenterPoint.y + deltaY);
{$IFEND}
// Tolik--25/11/2015 -- â ïåðåðàñ÷åòå óãëà ïîâîðîòà óáðàíû îêðóãëåíèÿ
// MvAngle := AngleCalc(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
MvAngle := AngleCalcDF(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2]);
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
end
else
begin
// new mark
// åñëè íå îòîáðàæàåòñÿ äëèíà - íå âðàùàåì
//CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
end;
{$ELSE}
CaptionsGroup.Rotate(MvAngle, CaptionsGroup.CenterPoint);
{$IFEND}
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà íå ìåíÿåì íè÷åãî
{
if Not ShowLength then // new mark
begin
CaptionsGroup.Move(abs(CaptionsGroup.ap2.x - CaptionsGroup.ap1.x)/2, 0);
end;
}
{$IFEND}
end;
// âåðíóòü ïîçèöèþ ïîäïèñè ïåðåä ìîäèôèêàöèåé
// Tolik
if (aReturnToPos and (FCaptionsViewType <> cv_Center)) then
begin
if CaptionsGroup <> nil then
// if (CaptionsGroup <> nil) and (FCaptionsViewType = cv_Auto) then
begin
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
if ShowLength then
begin
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
end
else
begin
// new mark
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâëÿåì êàê åñòü
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
//CaptionsGroup.Move(abs(CaptionsGroup.ap2.x - CaptionsGroup.ap1.x)/2, 0);
end;
{$ELSE}
// Tolik -- 01/12/2015 --
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
if Self.FCaptionsViewType <> cv_Center then // åñëè ïî öåíòðó, òî ïîõ
begin
// åñëè ðàçìåð íàäïèñè ïî äîðîãå èçìåíèëñÿ, òî íóæíî ó÷åñòü è ñìåùåíèå öåíòðà íîâîé íàäïèñè îòíîñèòåëüíî òîãî, ÷òî áûëî,
// à òî õåðíÿ êàêà-òî ïîëó÷àåòñÿ
if OldCaptionList = nil then
begin // Ýòî åñëè, äîïóñòèì, ðàçìåð øðèôòà ïîìåíÿëñÿ
if (OldH <> -1) and (OldW <> -1) then
begin
//if OldCaptionList.Count = Captions.re.Lines.count then
begin
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, NewH, NewW);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, NewH, NewW);
deltaX := (OldW/2 - NewW/2)*sin(CaptionsGroup.AngleToPoint); // øèðèíà
deltaY := (OldH/2 - NewH/2)*cos(CaptionsGroup.AngletoPoint); // âûñîòà
if FCaptionsViewType = cv_underLine then
begin
deltax := -deltax;
deltay := - deltay;
end;
CaptionsGroup.Move(deltaX, deltaY);
end;
end;
end
else
// ñþäà ïðèäåì, êîãäà ê òðàññå äîáàâèòñÿ êàêîé-íèòü ýëåìåíò òèïà êàá êàíàëà
begin
if OutTextStrings.Count <> OldCaptionList.Count then
begin
// GetTextSizeCapt(Captions.re.Font.Size, Captions.re.Font.Style, Captions.re.Font.Name, '', Captions.re.Lines, NewH, NewW);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', Captions.re.Lines, NewH, NewW);
NewH := NewH - 1; // ñáðàñûâàåì 1
OldH := NewH/OldCaptionList.Count;
Newh := NewH/OutTextStrings.Count;
if FCaptionsViewType = cv_OverLine then
h1 := (NewH - OldH)/2 - GrpSizeY/2
else
if FCaptionsViewType = cv_UnderLine then
h1 := (NewH - OldH)/2 + GrpSizeY/2;
deltaX := h1 * Sin(CaptionsGroup.AngletoPoint);
deltaY := h1 * Cos(CaptionsGroup.AngletoPoint);
if FCaptionsViewType = cv_UnderLine then
begin
deltaX := -deltaX;
deltaY := -deltaY;
end;
CaptionsGroup.Move(deltaX, deltay);
end;
end;
end;
//
{$IFEND}
end
end;
// Tolik -- 22/09/2016 -- ÷òîáû íàäïèñü íå îêàçàëàñü ïîä ëèíèåé - âûäâèíóòü íàâåðõ
if self.Owner <> nil then
begin
TPowerCad(Self.Owner).OrderFigureToFront(CaptionsGroup);
end;
//OutTextStrings.Free;
FreeAndNil(OutTextStrings);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ReCreateCaptionsGroup', E.Message);
end;
end;
*)
procedure TOrthoLine.ReCreateNotesGroup(aNeedReCreate: Boolean = False);
var
i: integer;
NotesLHandle: integer;
NotesRows: TFigureGrpNotMod;
NotesCaptions: TRichTextMod;
NotesRowsPoints: TDoublePoint;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
NotesStrings: TStrings;
FRecreate: Boolean;
GetResLine: TLine;
GetDeltaLineX, GetDeltaLineY: Double;
// Tolik 09/11/2016 --
aOwner: TComponent;
CurrCad: TF_CAD;
//
begin
try
if Self.deleted then
exit;
// Tolik -- 09/11/2016--
if NotesGroup <> Nil then
begin
if NotesGroup.InFigures.Count <> 2 then
NotesGroup := nil
else
begin
if not CheckFigureByClassName(TFigure(NotesGroup.InFigures[1]), 'TRichTextMod') then
NotesGroup := nil;
end;
{ if NotesGroup = Nil then
begin
NotesLHandle := GCadForm.PCad.GetLayerHandle(5);
NotesRows := CreateNotesRowGroup(nr_AutoSide);
NotesRows.Visible := True;
NotesCaptions := TRichTextMod.create(0, 0, 0, 0, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Note);
NotesCaptions.RE.Lines.Clear;
NotesCaptions.RE.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
NotesCaptions.Visible := True;
// ñîçäàòü NotesGroup è ïåðåáðîñèòü â íåãî îáüåêòû
NotesGroup := TFigureGrpNotMod.create(NotesLHandle, TComponent(GCadForm.PCad));
NotesGroup.AddFigure(NotesRows);
NotesGroup.AddFigure(NotesCaptions);
NotesGroup.LockModify := True;
NotesGroup.Radius := -1;
GCadForm.PCad.AddCustomFigure (GLN(NotesLHandle), NotesGroup, False);
ReCreateNotesGroup;
end;}
end;
//
if aNeedReCreate then
FRecreate := true
else
begin
if NotesGroup <> nil then
begin
NotesCaptions := TRichTextMod(NotesGroup.InFigures[1]);
NotesStrings := NotesCaptions.re.Lines;
end
else
NotesStrings := nil;
FRecreate := IsStringListsDifferent(OutTextNotes, NotesStrings);
end;
if FRecreate then
begin
NotesLHandle := GCadForm.PCad.GetLayerHandle(5);
// óäàëèòü TextBoxesGroup
if NotesGroup <> nil then
begin
NotesRows := TFigureGrpNotMod(TFigureGrp(NotesGroup.InFigures[0]));
GetResLine := TLine(NotesRows.InFigures[1]);
GetDeltaLineX := abs(GetResLine.ActualPoints[1].x - GetResLine.ActualPoints[2].x);
GetDeltaLineY := abs(GetResLine.ActualPoints[1].y - GetResLine.ActualPoints[2].y);
end
else
begin
GetDeltaLineX := -1;
GetDeltaLineY := -1;
end;
if NotesGroup <> nil then
begin
RemoveInFigureGrp(NotesGroup);
GCadForm.PCad.Figures.Remove(NotesGroup);
FreeAndNil(NotesGroup);
end;
{!!!} //11.10.2011 RefreshCAD(GCadForm.PCad);
NotesRows := CreateNotesRowGroup(FNotesRowsType, GetDeltaLineX, GetDeltaLineY);
// Tolik 09/11/ 2016 --
if Self.deleted then
exit;
//
NotesRows.Visible := True;
NotesRowsPoints.x := (TLine(NotesRows.InFigures[2]).ActualPoints[1].x + TLine(NotesRows.InFigures[2]).ActualPoints[2].x) / 2;
NotesRowsPoints.y := (TLine(NotesRows.InFigures[2]).ActualPoints[1].y + TLine(NotesRows.InFigures[2]).ActualPoints[2].y) / 2;
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{NotesCaptions := TRichTextMod.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Note, 0, false);
//11.10.2011 NotesCaptions.RE.Lines.Clear;
NotesCaptions.re.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
//NotesCaptions.RE.Lines.BeginUpdate; //11.10.2011
for i := 0 to OutTextNotes.Count - 1 do
begin
NotesCaptions.RE.Lines.Add(OutTextNotes[i]);
end;
//NotesCaptions.RE.Lines.EndUpdate; //11.10.2011
//NotesCaptions.RE.Lines.AddStrings(OutTextNotes);//11.10.2011
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
xCanvas := TMetafileCanvas.Create(NotesCaptions.Metafile, 0);
xCanvas.Font.Name := NotesCaptions.re.Font.Name;
xCanvas.Font.Size := NotesCaptions.re.Font.Size;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * NotesCaptions.re.Lines.Count + 1;
w := 0;
for i := 0 to NotesCaptions.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(NotesCaptions.Re.Lines[i]) then
w := xCanvas.TextWidth(NotesCaptions.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ÏÅÐÅÑÎÇÄÀÒÜ Ñ ÍÎÂÛÌÈ ÑÂÎÉÑÒÂÀÌÈ
if NotesCaptions <> nil then
begin
FreeAndNil(NotesCaptions);
end;}
GetTextSize(FNotesFontSize, [], FNotesFontName, '', OutTextNotes, h, w);
NotesCaptions := TRichTextMod.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Line, rnt_Note, 0, false);
//11.10.2011 NotesCaptions.RE.Lines.Clear;
NotesCaptions.re.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
//NotesCaptions.RE.Lines.BeginUpdate; //11.10.2011
for i := 0 to OutTextNotes.Count - 1 do
begin
OutTextNotes[i] := FastReplace(OutTextNotes[i],#13#10,' ');
NotesCaptions.RE.Lines.Add(OutTextNotes[i]);
end;
//NotesCaptions.RE.Lines.EndUpdate; //11.10.2011
//NotesCaptions.RE.Lines.AddStrings(OutTextNotes); //11.10.2011
NotesCaptions.Move(NotesRowsPoints.x - NotesCaptions.CenterPoint.x,
NotesRowsPoints.y - NotesCaptions.CenterPoint.y - (h - 1) / 2);
NotesCaptions.Visible := True;
// ñîçäàòü NotesGroup è ïåðåáðîñèòü â íåãî îáüåêòû
NotesGroup := TFigureGrpNotMod.create(NotesLHandle, Owner);
NotesGroup.AddFigure(NotesRows);
NotesGroup.AddFigure(NotesCaptions);
NotesGroup.LockModify := True;
GCadForm.PCad.AddCustomFigure (GLN(NotesLHandle), NotesGroup, False);
// 15.07.2016 Tolik and Igor
NotesGroup.Radius := -10;
///// ReCreateNotesGroup;
end
else
// ÍÅ ÏÅÐÅÑÎÇÄÀÂÀÒÜ NOTESGROUP
begin
NotesLHandle := GCadForm.PCad.GetLayerHandle(5);
NotesRows := TFigureGrpNotMod(NotesGroup.InFigures[0]);
NotesCaptions := TRichTextMod(NotesGroup.InFigures[1]);
// óäàëèòü TextBoxesGroup
GetResLine := TLine(NotesRows.InFigures[1]);
GetDeltaLineX := abs(GetResLine.ActualPoints[1].x - GetResLine.ActualPoints[2].x);
GetDeltaLineY := abs(GetResLine.ActualPoints[1].y - GetResLine.ActualPoints[2].y);
if NotesRows <> nil then
begin
RemoveInFigureGrp(NotesRows);
NotesGroup.RemoveFromGrp(NotesRows); //28.04.2011 NotesGroup.InFigures.Remove(NotesRows);
FreeAndNil(NotesRows);
end;
NotesRows := CreateNotesRowGroup(FNotesRowsType, GetDeltaLineX, GetDeltaLineY);
NotesRows.Visible := True;
NotesRowsPoints.x := (TLine(NotesRows.InFigures[2]).ActualPoints[1].x + TLine(NotesRows.InFigures[2]).ActualPoints[2].x) / 2;
NotesRowsPoints.y := (TLine(NotesRows.InFigures[2]).ActualPoints[1].y + TLine(NotesRows.InFigures[2]).ActualPoints[2].y) / 2;
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
{//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
xCanvas := TMetafileCanvas.Create(NotesCaptions.Metafile, 0);
xCanvas.Font.Name := NotesCaptions.re.Font.Name;
xCanvas.Font.Size := NotesCaptions.re.Font.Size;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * NotesCaptions.re.Lines.Count + 1;
FreeAndNil(xCanvas);}
GetTextSize(NotesCaptions.re.Font.Size, [], NotesCaptions.re.Font.Name, '', NotesCaptions.re.Lines, h, w);
// ñîçäàòü NotesGroup è ïåðåáðîñèòü â íåãî îáüåêòû
NotesGroup.AddFigure(NotesRows);
NotesCaptions.Move(NotesRowsPoints.x - NotesCaptions.CenterPoint.x,
NotesRowsPoints.y - NotesCaptions.CenterPoint.y - (h - 1) / 2);
NotesGroup.InFigures.Exchange(0, 1);
NotesGroup.Radius := -2;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ReCreateNotesGroup', E.Message);
end;
if NotesGroup <> Nil then
begin
// ÒÀÊ ÎÍÎ áóäåò ïðàâèëüíåå, à òî îò âûíîñîê îñòàþòñÿ ïóñòûå ëèíèè
if IsNoteExist(NotesGroup) then
NotesGroup.Visible := ShowNotes
else
NotesGroup.Visible := False;
end;
end;
procedure TOrthoLine.UpdateLengthTextBox(aNeedReCreate: Boolean; aReturnToPos: Boolean);
var
Str: string;
Background: TRectangle;
Captions: TRichTextMod;
h1,h2,w1,w2: Double;
FontStyles: TFontStyles;
LengthStrings: TStringList;
// Tolik
ResPoints: TDoublePoint;
OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint;
SelfCrossInfo: POrthoLineCrossInfo;
CrossLinesList: TList;
LineFigure: TFigure;
CadOwner: TF_Cad;
i, j: Integer;
CrossLine: TOrthoLine;
RefreshFlag: Boolean;
PointDeleted: Boolean;
begin
CrossLinesList := Nil;
CrossLine := Nil;
RefreshFlag := GCanRefreshCad;
GCanRefreshCad := False;
try
// Tolik 13/09/2017 --
// åñëè âêëþ÷åíà îïöèÿ òèïà ïîêàçûâàòü ïåðåñå÷åíèÿ òðàññ, òî ñáðîñèòü è ïåðåñ÷èòàòü âîçìîæíûå ïåðåñå÷åíèÿ
// ñ äðóãèìè òðàññàìè
if GCadForm.FListSettings.ShowTracesCrossPoints > 0 then
begin
// Åñëè åñòü ïåðåñå÷åíèÿ -- ñáðîñèòü âñå
if CrossList.Count > 0 then
begin
CrossLinesList := TList.Create;
CadOwner := Nil;
if Self.Owner <> nil then
if Self.Owner.Owner <> nil then
begin
CadOwner := TF_Cad(TPowerCad(Self.Owner).Owner);
While CrossList.Count > 0 do // ñáðîñ ïåðåñå÷åíèé
begin
SelfCrossInfo := POrthoLineCrossInfo(CrossList[0]);
CrossLine := TOrthoLine(GetFigureByID(CadOwner, SelfCrossInfo.CrossLineID));
if CrossLine <> nil then
if not CrossLine.Deleted then
if CrossLinesList.IndexOf(CrossLine) = -1 then
CrossLinesList.Add(CrossLine); // ëèíèè ïåðåñå÷åíèÿ
CrossList.Remove(SelfCrossInfo);
//FreeMem(SelfCrossInfo); // îñâîáîäèòü ïàìÿòü
Dispose(SelfCrossInfo); // îñâîáîäèòü ïàìÿòü
end;
if CrossLinesList.Count > 0 then
begin
for i := 0 to CrossLinesList.Count - 1 do
begin
CrossLine := TOrthoLine(CrossLinesList[i]);
PointDeleted := False;
for j := CrossLine.CrossList.Count - 1 downto 0 do
begin
if POrthoLineCrossInfo(CrossLine.CrossList[j]).CrossLineID = Self.ID then
begin
SelfCrossInfo := POrthoLineCrossInfo(CrossLine.CrossList[j]);
CrossLine.CrossList.Delete(j);
//FreeMem(SelfCrossInfo);
Dispose(SelfCrossInfo);
PointDeleted := True;
end;
end;
if PointDeleted then
CrossLine.ReCreateDrawFigureBlock;
end;
end;
DropCalcCrosses(Self, False);
end;
CrossLinesList.free;
end
else
// Ïåðåñ÷èòàòü âîçìîæíûå ïåðåñå÷åíèÿ ñ äðóãèìè òðàññàìè
DropCalcCrosses(Self, False);
end;
//Tolik 05/02/2021 --
{
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
if OutTextCaptions.Count = 1 then
begin
Str := GetLineCaptionFormat(Self, GCadForm.FShowLineCaptionsType);
OutTextCaptions.Add(Str);
end;
if OutTextCaptions.Count >= 2 then
begin
Str := GetLineCaptionFormat(Self, GCadForm.FShowLineCaptionsType);
OutTextCaptions[1] := Str;
if CaptionsGroup <> nil then
begin
Background := TRectangle(CaptionsGroup.InFigures[0]);
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
if ShowLength = True then
if Captions.Re.Lines.Count >= 2 then
Captions.re.Lines[1] := OutTextCaptions[1];
ReCreateCaptionsGroup(aNeedReCreate, aReturnToPos);
end
end;
end
else
}
begin
if OutTextCaptions.Count = 0 then
begin
Str := GetLineCaptionFormat(Self, GCadForm.FShowLineCaptionsType);
OutTextCaptions.Add(Str);
end;
if OutTextCaptions.Count > 0 then
begin
Str := GetLineCaptionFormat(Self, GCadForm.FShowLineCaptionsType);
if StrLen(PChar(OutTextCaptions[0])) <> StrLen(PChar(Str)) then
aNeedReCreate := True
else
aNeedReCreate := False;
// Tolik -- 11/12/2015
FontStyles := [];
if FCaptionsFontBold then
FontStyles := [fsBold];
LengthStrings := TStringList.Create;
LengthStrings.Add(Str);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', LengthStrings, h2, w2);
LengthStrings.Clear;
LengthStrings.Add(OutTextCaptions[0]);
GetTextSizeCapt(FCaptionsFontSize, FontStyles, FCaptionsFontName, '', LengthStrings, h1, w1);
LengthStrings.Clear;
FreeAndNil(LengthStrings);
if w1 <> w2 then
aNeedReCreate := True
else
aNeedReCreate := False;
//
OutTextCaptions[0] := Str;
if CaptionsGroup <> nil then
begin
if (CaptionsGroup.InFigures <> nil) and (CaptionsGroup.InFigures.Count >= 2) and (CaptionsGroup.InFigures.Count <= 1000) then
begin
Background := TRectangle(CaptionsGroup.InFigures[0]);
Captions := TRichTextMod(CaptionsGroup.InFigures[1]);
if ShowLength = True then
if Captions.Re.Lines.Count > 0 then
Captions.re.Lines[0] := OutTextCaptions[0];
ReCreateCaptionsGroup(aNeedReCreate, aReturnToPos);
end
else
begin
ReCreateCaptionsGroup(True, False);
end;
// Tolik
{ if (CaptionsGroup.InFigures <> nil) and (CaptionsGroup.InFigures.Count >= 2) and (CaptionsGroup.InFigures.Count <= 1000) then
begin
OldAP1 := ActualPoints[1];
OldAP2 := ActualPoints[2];
NewAP1 := ActualPoints[1];
NewAP2 := ActualPoints[2];
Captions := TRichTextMod(CaptionsGroup.Infigures[1]);
ResPoints := CaptionsGroupRemoveCalc(CaptionsGroup.CenterPoint, OldAP1, OldAP2, NewAP1, NewAP2, CaptionsGroupH, Captions.re.Lines.Count);
//if (AJoinedLine.FCaptionsViewType = cv_Auto) or (AJoinedLine.FCaptionsViewType = cv_Center) then
CaptionsGroup.Move(ResPoints.x - CaptionsGroup.CenterPoint.x,
ResPoints.y - CaptionsGroup.CenterPoint.y);
end;}
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.UpdateLengthTextBox', E.Message);
end;
GCanRefreshCad := RefreshFlag;
end;
Procedure TOrthoLine.Deselect;
begin
try
inherited;
DeSelectSCSFigureInPM(ID);
except
on E: Exception do AddExceptionToLogEx('TOrthoLine.DeSelect', E.Message);
end;
end;
procedure TOrthoLine.WriteToStream(Stream: TStream);
var
xParam: byte;
xInt: integer;
xStr: string;
xDbl: double;
i: integer;
GetGroupObject: TSCSFigureGrp;
FiguresList: TList;
begin
try
inherited;
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
if JoinConnector1 <> nil then
begin
GetGroupObject := TConnectorObject(JoinConnector1).FGroupObject;
if GetGroupObject = nil then
begin
xInt := FiguresList.IndexOf(JoinConnector1);
WriteField(20, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(87, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := GetGroupObject.InFigures.IndexOf(JoinConnector1);
WriteField(20, Stream, xInt, sizeof(xInt));
xInt := FiguresList.IndexOf(GetGroupObject);
WriteField(87, Stream, xInt, sizeof(xInt));
end;
end
else
begin
xInt := -1;
WriteField(20, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(87, Stream, xInt, sizeof(xInt));
end;
if JoinConnector2 <> nil then
begin
GetGroupObject := TConnectorObject(JoinConnector2).FGroupObject;
if GetGroupObject = nil then
begin
xInt := FiguresList.IndexOf(JoinConnector2);
WriteField(21, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(88, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := GetGroupObject.InFigures.IndexOf(JoinConnector2);
WriteField(21, Stream, xInt, sizeof(xInt));
xInt := FiguresList.IndexOf(GetGroupObject);
WriteField(88, Stream, xInt, sizeof(xInt));
end;
end
else
begin
xInt := -1;
WriteField(21, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(88, Stream, xInt, sizeof(xInt));
end;
if MultilineCaptionBox <> nil then
begin
xInt := FiguresList.IndexOf(MultilineCaptionBox);
WriteField(22, Stream, xInt, sizeof(xInt));
end;
// Count
xInt := FCount;
WriteField(23, Stream, xInt, sizeof(xInt));
// ñîõðàíèòü CaptionsGroup
xInt := FiguresList.IndexOf(CaptionsGroup);
WriteField(24, Stream, xInt, sizeof(xInt));
// FRaiseType
xInt := Ord(FLineRaiseType);
WriteField(26, Stream, xInt, sizeof(xInt));
// ñîõðàíèòü FObjectFromRaise
if FObjectFromRaisedLine <> nil then
begin
GetGroupObject := TConnectorObject(FObjectFromRaisedLine).FGroupObject;
if GetGroupObject = nil then
begin
xInt := FiguresList.IndexOf(FObjectFromRaisedLine);
WriteField(27, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(89, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := GetGroupObject.InFigures.IndexOf(FObjectFromRaisedLine);
WriteField(27, Stream, xInt, sizeof(xInt));
xInt := FiguresList.IndexOf(GetGroupObject);
WriteField(89, Stream, xInt, sizeof(xInt));
end;
end
else
begin
xInt := -1;
WriteField(27, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(89, Stream, xInt, sizeof(xInt));
end;
// FCableFullnessSide1
xInt := Ord(FCableFullnessSide1);
WriteField(28, Stream, xInt, sizeof(xInt));
// FCableFullnessSide2
xInt := Ord(FCableFullnessSide2);
WriteField(29, Stream, xInt, sizeof(xInt));
// FCableChannelFullness
xInt := Ord(FCableChannelFullness);
WriteField(30, Stream, xInt, sizeof(xInt));
// FCableChannelFullness
xInt := Ord(FCableChannelClosedSide1);
WriteField(31, Stream, xInt, sizeof(xInt));
// FCableChannelFullness
xInt := Ord(FCableChannelClosedSide2);
WriteField(32, Stream, xInt, sizeof(xInt));
// FTraceStyle
xInt := Ord(FLineType);
WriteField(33, Stream, xInt, sizeof(xInt));
// DrawFigure
if DrawFigure <> nil then
begin
xInt := FiguresList.IndexOf(DrawFigure);
WriteField(34, Stream, xInt, sizeof(xInt));
end;
// ConnectorType
xInt := Ord(OrthoLineType);
WriteField(35, Stream, xInt, sizeof(xInt));
// SingleBlock
if FSingleBlock <> nil then
begin
// Tolik
xInt := -10000; // òèïà, ñèäèò â äðàâôèãóðå
// xInt := FiguresList.IndexOf(FSingleBlock);
WriteField(36, Stream, xInt, sizeof(xInt));
//
end;
// FBlockID
xInt := FBlockID;
WriteField(37, Stream, xInt, sizeof(xInt));
// FObjectType
xInt := FObjectType;
WriteField(38, Stream, xInt, sizeof(xInt));
// NotesGroup
xInt := FiguresList.IndexOf(NotesGroup);
WriteField(39, Stream, xInt, sizeof(xInt));
// FNotesRowType
xInt := Ord(FNotesRowsType);
WriteField(40, Stream, xInt, sizeof(xInt));
// FNetworkType
xInt := $0;
if nt_Computer in FNetworkTypes then
xInt := xInt + cComputer_nt;
if nt_Telephon in FNetworkTypes then
xInt := xInt + cTelephon_nt;
if nt_Television in FNetworkTypes then
xInt := xInt + cTelevision_nt;
if nt_Gas in FNetworkTypes then
xInt := xInt + cGas_nt;
if nt_Electric in FNetworkTypes then
xInt := xInt + cElectric_nt;
WriteField(41, Stream, xInt, sizeof(xInt));
xInt := ord(FTraceStyle);
WriteField(42, Stream, xInt, sizeof(xInt));
xInt := FTraceWidth;
WriteField(43, Stream, xInt, sizeof(xInt));
// FCaptionsViewType
xInt := Ord(FCaptionsViewType);
WriteField(44, Stream, xInt, sizeof(xInt));
// FIndex
xInt := FIndex;
WriteField(45, Stream, xInt, sizeof(xInt));
// FCabinetID
xInt := FCabinetID;
WriteField(46, Stream, xInt, sizeof(xInt));
// FConnectingPos
xInt := FConnectingPos;
WriteField(47, Stream, xInt, sizeof(xInt));
// FCaptionsFontSize
xInt := FCaptionsFontSize;
WriteField(48, Stream, xInt, sizeof(xInt));
// FNotesFontSize
xInt := FNotesFontSize;
WriteField(49, Stream, xInt, sizeof(xInt));
// FGroupObject
if FGroupObject <> nil then
begin
xInt := FiguresList.IndexOf(FGroupObject);
WriteField(50, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(50, Stream, xInt, sizeof(xInt));
end;
// FCaptionsFontColor
xInt := FCaptionsFontColor;
WriteField(51, Stream, xInt, sizeof(xInt));
// FNotesFontColor
xInt := FNotesFontColor;
WriteField(52, Stream, xInt, sizeof(xInt));
// FCableFullnessSide2
xInt := Ord(FDefectDegree);
WriteField(53, Stream, xInt, sizeof(xInt));
// Save MarkingList
for i := 0 to FTraceCaptionsList.Count - 1 do
begin
xStr := FTraceCaptionsList[i];
if ((180 + i) <= 210) then
begin
WriteStrField(180 + i, Stream, xStr);
xStr := ReadStringFromStream(Stream);
end
end;
// BLOCK GUID
xStr := FBlockGUID;
WriteStrField(211, Stream, xStr);
// FTrunkNumber
xStr := FTrunkNumber;
WriteStrField(212, Stream, xStr);
// FCaptionsNotesFontName
xStr := FCaptionsFontName;
WriteStrField(213, Stream, xStr);
xStr := FNotesFontName;
WriteStrField(214, Stream, xStr);
xStr := FloatToStr(CaptionsGroupH);
WriteStrField(215, Stream, xStr);
// ActualPoints
xDbl := ActualPoints[1].x;
WriteField(220, Stream, xDbl, sizeof(xDbl));
xDbl := ActualPoints[1].y;
WriteField(221, Stream, xDbl, sizeof(xDbl));
xDbl := ActualPoints[2].x;
WriteField(222, Stream, xDbl, sizeof(xDbl));
xDbl := ActualPoints[2].y;
WriteField(223, Stream, xDbl, sizeof(xDbl));
// Length
xDbl := LineLength;
WriteField(224, Stream, xDbl, sizeof(xDbl));
xDbl := UserLength;
WriteField(225, Stream, xDbl, sizeof(xDbl));
xDbl := CalculLength;
WriteField(226, Stream, xDbl, sizeof(xDbl));
// Gap
xDbl := FGap;
WriteField(227, Stream, xDbl, sizeof(xDbl));
// ActualZOrder
xDbl := ActualZOrder[1];
WriteField(228, Stream, xDbl, sizeof(xDbl));
xDbl := ActualZOrder[2];
WriteField(229, Stream, xDbl, sizeof(xDbl));
// GrpSize
xDbl := GrpSizeX;
WriteField(230, Stream, xDbl, sizeof(xDbl));
xDbl := GrpSizeY;
WriteField(231, Stream, xDbl, sizeof(xDbl));
xDbl := BlockStep;
WriteField(232, Stream, xDbl, sizeof(xDbl));
xDbl := FDrawFigureAngle;
WriteField(233, Stream, xDbl, sizeof(xDbl));
xDbl := FTraceColor;
WriteField(234, Stream, xDbl, sizeof(xDbl));
// FSingleBlockDelta
xDbl := FSingleBlockDelta;
WriteField(235, Stream, xDbl, sizeof(xDbl));
// FDrawFigurePercent
xDbl := FOriginalSizeX;
WriteField(236, Stream, xDbl, sizeof(xDbl));
xDbl := FOriginalSizeY;
WriteField(237, Stream, xDbl, sizeof(xDbl));
xDbl := FDrawFigurePercent;
WriteField(238, Stream, xDbl, sizeof(xDbl));
xDbl := DrawFigureH;
WriteField(239, Stream, xDbl, sizeof(xDbl));
// ôëàã îòîáðàæåíèÿ äëèííû
if ShowLength = true then
xParam := 0
else
xParam := 1;
WriteField(99, Stream, xParam, sizeof(xParam));
// ôëàã îòîáðàæåíèÿ óñë.îáîçíà÷åíèÿ
if isShowBlock then
xParam := 0
else
xParam := 1;
WriteField(100, Stream, xParam, sizeof(xParam));
// ôëàã îòîáðàæåíèÿ ïîäïèñåé
if ShowCaptions then
xParam := 0
else
xParam := 1;
WriteField(101, Stream, xParam, sizeof(xParam));
// ôëàã îòîáðàæåíèÿ âûíîñîê
if ShowNotes then
xParam := 0
else
xParam := 1;
WriteField(102, Stream, xParam, sizeof(xParam));
// ñâ-âà èçìåíåíííûõ ïîëåé
if FIsNameChanged then
xParam := 0
else
xParam := 1;
WriteField(103, Stream, xParam, sizeof(xParam));
if FIsCaptionsChanged then
xParam := 0
else
xParam := 1;
WriteField(104, Stream, xParam, sizeof(xParam));
if FIsNoteschanged then
xParam := 0
else
xParam := 1;
WriteField(105, Stream, xParam, sizeof(xParam));
if FIsBlockChanged then
xParam := 0
else
xParam := 1;
WriteField(106, Stream, xParam, sizeof(xParam));
if IsLengthAboveLimit then
xParam := 0
else
xParam := 1;
WriteField(107, Stream, xParam, sizeof(xParam));
if FConnectingLine then
xParam := 0
else
xParam := 1;
WriteField(108, Stream, xParam, sizeof(xParam));
if FCaptionsFontBold then
xParam := 0
else
xParam := 1;
WriteField(109, Stream, xParam, sizeof(xParam));
if FExistOtherObjectType then
xParam := 0
else
xParam := 1;
WriteField(110, Stream, xParam, sizeof(xParam));
if FIsRotated then
xParam := 0
else
xParam := 1;
WriteField(111, Stream, xParam, sizeof(xParam));
// ôëàã òðàññèðîâêè
if FMarkTracing then
xParam := 0
else
xParam := 1;
WriteField(112, Stream, xParam, sizeof(xParam));
// ôëàã - íàëè÷èå êàáåëüíîãî êàíàëà
if FIsCableChannel then
xParam := 0
else
xParam := 1;
WriteField(113, Stream, xParam, sizeof(xParam));
// ôëàã - ñòàòóñ îðòîãîíàëüíîñòè
if FOrthoStatus then
xParam := 0
else
xParam := 1;
WriteField(114, Stream, xParam, sizeof(xParam));
// ôëàã òðàññèðîâêè
if FDisableTracing then
xParam := 0
else
xParam := 1;
WriteField(115, Stream, xParam, sizeof(xParam));
// ôëàã âåðòèêàëüíîñòè
if FIsVertical then
xParam := 0
else
xParam := 1;
WriteField(116, Stream, xParam, sizeof(xParam));
except
on E: Exception do addExceptionToLogEx('TOrthoLine.WriteToStream', E.Message);
end;
end;
procedure TOrthoLine.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
var
xParam: byte;
xInt: integer;
xStr: string;
i: integer;
FindCode: integer;
DataP: PChar;
begin
try
F_ProjMan.GSCSBase.CurrProject.Setting.FirstTraceCreated := False;
inherited;
case xCode of
220: GOrthoLinePoints1.x := pDouble(data)^;
221: GOrthoLinePoints1.y := pDouble(data)^;
222: GOrthoLinePoints2.x := pDouble(data)^;
223: GOrthoLinePoints2.y := pDouble(data)^;
224: FLength := pDouble(data)^;
225: UserLength := pDouble(data)^;
226: CalculLength := pDouble(data)^;
227: FGap := pDouble(data)^;
228: ActualZOrder[1] := pDouble(data)^;
229: ActualZOrder[2] := pDouble(data)^;
230: GrpSizeX := pDouble(data)^;
231: GrpSizeY := pDouble(data)^;
232: BlockStep := pDouble(data)^;
233: FDrawFigureAngle := pDouble(data)^;
234: FTraceColor := round(pDouble(data)^);
235: FSingleBlockDelta := pDouble(data)^;
236: FOriginalSizeX := pDouble(data)^;
237: FOriginalSizeY := pDouble(data)^;
238: FDrawFigurePercent := pDouble(data)^;
239: DrawFigureH := pDouble(data)^;
20: begin
xInt := pInt(data)^;
FJoinFigure1Index := xInt;
FCabinetID := -1;
tmpParentDupID := -1;
FCaptionsFontSize := -1;
FNotesFontSize := -1;
FCaptionsFontBold := false;
FCaptionsFontColor := -1;
FNotesFontColor := -1;
FGroupObjectIndex := -1;
FSingleBlockDelta := 0;
FIsRotated := false;
//
FOriginalSizeX := -1;
FOriginalSizeY := -1;
FDrawFigurePercent := 100;
FCaptionsFontName := GCadForm.FFontName;
FNotesFontName := GCadForm.FFontName;
FMarkTracing := False;
FDisableTracing := False;
FIsCableChannel := False;
//
DrawFigureH := -999999;
CaptionsGroupH := -999999;
//
FJoinFigure1IndexForGrp := -1;
FJoinFigure2IndexForGrp := -1;
FObjectFromRaisedLineIndexForGrp := -1;
FOrthoStatus := False;
FDefectDegree := dodNormal;
end;
21: begin
xInt := pInt(data)^;
FJoinFigure2Index := xInt;
end;
22: begin
xInt := pInt(data)^;
FMultilineCaptionBoxIndex := xInt;
end;
23: begin
xInt := pInt(data)^;
FCount := xInt;
end;
24: begin
xInt := pInt(data)^;
FCaptionsGroupIndex := xInt;
end;
26: begin
xInt := pInt(data)^;
FLineRaiseType := TLineRaiseType(xInt);
end;
27: begin
xInt := pInt(data)^;
FObjectFromRaisedLineIndex := xInt;
end;
28: begin
xInt := pInt(data)^;
FCableFullnessSide1 := TComponInterfacesFullness(xInt);
end;
29: begin
xInt := pInt(data)^;
FCableFullnessSide2 := TComponInterfacesFullness(xInt);
end;
30: begin
xInt := pInt(data)^;
FCableChannelFullness := TComponInterfacesFullness(xInt);
end;
31: begin
xInt := pInt(data)^;
FCableChannelClosedSide1 := TComponInterfacesFullness(xInt);
end;
32: begin
xInt := pInt(data)^;
FCableChannelClosedSide2 := TComponInterfacesFullness(xInt);
end;
33: begin
xInt := pInt(data)^;
FLineType := TTraceStyle(xInt);
end;
34: begin
xInt := pInt(data)^;
FDrawFigureIndex := xInt;
end;
35: begin
xInt := pInt(data)^;
FOrthoLineType := TOrthoLineType(xInt);
end;
36: begin
xInt := pInt(data)^;
FSingleBlockIndex := xInt;
end;
37: begin
xInt := pInt(data)^;
FBlockID := xInt;
end;
38: begin
xInt := pInt(data)^;
FObjectType := xInt;
end;
39: begin
xInt := pInt(data)^;
FNotesGroupIndex := xInt;
end;
40: begin
xInt := pInt(data)^;
FNotesRowsType := TNotesRowsType(xInt);
end;
41: begin
// FNetworkType
xInt := pInt(data)^;
FNetworkTypes := [];
if xInt and cComputer_nt = cComputer_nt then
FNetworkTypes := FNetworkTypes + [nt_Computer];
if xInt and cTelephon_nt = cTelephon_nt then
FNetworkTypes := FNetworkTypes + [nt_Telephon];
if xInt and cTelevision_nt = cTelevision_nt then
FNetworkTypes := FNetworkTypes + [nt_Television];
if xInt and cGas_nt = cGas_nt then
FNetworkTypes := FNetworkTypes + [nt_Gas];
if xInt and cElectric_nt = cElectric_nt then
FNetworkTypes := FNetworkTypes + [nt_Electric];
end;
42: begin
xInt := pInt(data)^;
FTraceStyle := TPenStyle(xInt);
end;
43: begin
xInt := pInt(data)^;
FTraceWidth := xInt;
end;
44: begin
xInt := pInt(data)^;
FCaptionsViewType := TLineCaptionsViewType(xInt);
end;
45: begin
xInt := pInt(data)^;
FIndex := xInt;
end;
46: begin
xInt := pInt(data)^;
FCabinetID := xInt;
end;
47: begin
xInt := pInt(data)^;
FConnectingPos := xInt;
end;
48: begin
xInt := pInt(data)^;
FCaptionsFontSize := xInt;
end;
49: begin
xInt := pInt(data)^;
FNotesFontSize := xInt;
end;
50: begin
xInt := pInt(data)^;
FGroupObjectIndex := xInt;
end;
51: begin
xInt := pInt(data)^;
FCaptionsFontColor := xInt;
end;
52: begin
xInt := pInt(data)^;
FNotesFontColor := xInt;
end;
53: begin
xInt := pInt(data)^;
FDefectDegree := TDefectDegree(xInt);
end;
87: begin
xInt := pInt(data)^;
FJoinFigure1IndexForGrp := xInt;
end;
88: begin
xInt := pInt(data)^;
FJoinFigure2IndexForGrp := xInt;
end;
89: begin
xInt := pInt(data)^;
FObjectFromRaisedLineIndexForGrp := xInt;
end;
99: begin
xParam := pByte(data)^;
if xParam = 0 then
ShowLength := true
else
ShowLength := false;
end;
100: begin
xParam := pByte(data)^;
if xParam = 0 then
IsShowBlock := true
else
IsShowBlock := false;
end;
101: begin
xParam := pByte(data)^;
if xParam = 0 then
ShowCaptions := true
else
ShowCaptions := false;
end;
102: begin
xParam := pByte(data)^;
if xParam = 0 then
ShowNotes := true
else
ShowNotes := false;
end;
103: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsNameChanged := true
else
FIsNameChanged := false;
end;
104: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsCaptionsChanged := true
else
FIsCaptionsChanged := false;
end;
105: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsNotesChanged := true
else
FIsNotesChanged := false;
end;
106: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsBlockChanged := true
else
FIsBlockChanged := false;
end;
107: begin
xParam := pByte(data)^;
if xParam = 0 then
IsLengthAboveLimit := true
else
IsLengthAboveLimit := false;
end;
108: begin
xParam := pByte(data)^;
if xParam = 0 then
FConnectingLine := true
else
FConnectingLine := false;
end;
109: begin
xParam := pByte(data)^;
if xParam = 0 then
FCaptionsFontBold := true
else
FCaptionsFontBold := false;
end;
110: begin
xParam := pByte(data)^;
if xParam = 0 then
FExistOtherObjectType := true
else
FExistOtherObjectType := false;
end;
111: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsRotated := true
else
FIsRotated := false;
end;
112: begin
xParam := pByte(data)^;
if xParam = 0 then
FMarkTracing := true
else
FMarkTracing := false;
end;
113: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsCableChannel := true
else
FIsCableChannel := false;
end;
114: begin
xParam := pByte(data)^;
if xParam = 0 then
FOrthoStatus := true
else
FOrthoStatus := false;
end;
115: begin
xParam := pByte(data)^;
if xParam = 0 then
FDisableTracing := true
else
FDisableTracing := false;
end;
116: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsVertical := true
else
FIsVertical := false;
end;
211: begin
DataP := data;
xStr := DataP;
FBlockGUID := xStr;
end;
212: begin
DataP := data;
xStr := DataP;
FTrunkNumber := xStr;
end;
213: begin
DataP := data;
xStr := DataP;
FCaptionsFontName := xStr;
end;
214: begin
DataP := data;
xStr := DataP;
FNotesFontName := xStr;
end;
215: begin
DataP := data;
xStr := DataP;
CaptionsGroupH := StrToFloatDef_My(xStr, CaptionsGroupH);
end;
end;
FDrawFigure := Nil;
if FTraceCaptionsList = nil then
FTraceCaptionsList := TStringList.Create;
if (xCode >= 180) AND (xCode <= 210) then
begin
DataP := data;
xStr := DataP;
FTraceCaptionsList.Add(xStr);
end;
ActualPoints[1] := GOrthoLinePoints1;
ActualPoints[2] := GOrthoLinePoints2;
// ïîäíÿòü OutText
if OutTextCaptions = nil then
OutTextCaptions := TStringList.Create;
if OutTextNotes = nil then
begin
OutTextNotes := TStringList.Create;
if ID <> 0 then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).AddSCSFigure(Self);
end;
CaptionsGroup := nil;
NotesGroup := nil;
TF_CAD(TPowerCad(Owner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetPropertyFromStream', E.Message);
end;
end;
function TOrthoLine.GetAngle(AP1x, AP1y, AP2x, AP2y: Double): Double;
var
Len_X, Len_Y: Double;
AngleRad: Double;
AddAngle: Double;
begin
try
Result := 0;
Len_X := Abs(AP1x - AP2x);
Len_Y := Abs(AP1y - AP2y);
// ïðîâåðêè è âû÷èëåíèå óãëà â ãðàäóñàõ
AddAngle := 0;
AngleRad := 0;
// äëÿ íåîðòîãîíàëüíûõ ëèíèé
if (AP1x < AP2x) and (AP1y < AP2y) then // 1
begin
AngleRad := ArcTan2(Len_Y, Len_X); // óãîë â ðàäèàíàõ
AddAngle := 0;
end;
if (AP1x > Ap2x) and (AP1y < AP2y) then //2
begin
AngleRad := ArcTan2(Len_X, Len_Y); // óãîë â ðàäèàíàõ
AddAngle := 90;
end;
if (AP1x > AP2x) and (AP1y > AP2y) then //3
begin
AngleRad := ArcTan2(Len_Y, Len_X); // óãîë â ðàäèàíàõ
AddAngle := 180;
end;
if (AP1x < AP2x) and (AP1y > AP2y) then //4
begin
AngleRad := ArcTan2(Len_X, Len_Y); // óãîë â ðàäèàíàõ
AddAngle := 270;
end;
// Tolik 25/11/2015 --
// Result := Round(AngleRad * 180 / pi) + AddAngle;
Result := AngleRad * 180 / pi + AddAngle;
// äëÿ îðòîãîíàëüíûõ ëèíèé
if (AP1y = AP2y) and (AP1x < AP2x) then
Result := 0;
if (AP1y = AP2y) and (AP1x > AP2x) then
Result := 180;
if (AP1x = AP2x) and (AP1y < AP2y) then
Result := 90;
if (AP1x = AP2x) and (AP1y > AP2y) then
Result := 270;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetAngle', E.Message);
end;
end;
// Tolik 20/10/2015 -- äëÿ ôèãóðû îòðèñîâêè áåç îêðóãëåíèÿ çíà÷åíèÿ óãëà, ÷òîáû íå ñäâèíóëàñü â ñòîðîíó
function TOrthoLine.GetAngleDF(AP1x, AP1y, AP2x, AP2y: Double): Double;
var
Len_X, Len_Y: Double;
AngleRad: Double;
AddAngle: Double;
begin
try
Result := 0;
Len_X := Abs(AP1x - AP2x);
Len_Y := Abs(AP1y - AP2y);
// ïðîâåðêè è âû÷èñëåíèå óãëà â ãðàäóñàõ
AddAngle := 0;
AngleRad := 0;
// äëÿ íåîðòîãîíàëüíûõ ëèíèé
if (AP1x < AP2x) and (AP1y < AP2y) then // 1
begin
AngleRad := ArcTan2(Len_Y, Len_X); // óãîë â ðàäèàíàõ
AddAngle := 0;
end;
if (AP1x > Ap2x) and (AP1y < AP2y) then //2
begin
AngleRad := ArcTan2(Len_X, Len_Y); // óãîë â ðàäèàíàõ
AddAngle := 90;
end;
if (AP1x > AP2x) and (AP1y > AP2y) then //3
begin
AngleRad := ArcTan2(Len_Y, Len_X); // óãîë â ðàäèàíàõ
AddAngle := 180;
end;
if (AP1x < AP2x) and (AP1y > AP2y) then //4
begin
AngleRad := ArcTan2(Len_X, Len_Y); // óãîë â ðàäèàíàõ
AddAngle := 270;
end;
Result := (AngleRad * 180 / pi) + AddAngle;
// äëÿ îðòîãîíàëüíûõ ëèíèé
if (AP1y = AP2y) and (AP1x < AP2x) then
Result := 0;
if (AP1y = AP2y) and (AP1x > AP2x) then
Result := 180;
if (AP1x = AP2x) and (AP1y < AP2y) then
Result := 90;
if (AP1x = AP2x) and (AP1y > AP2y) then
Result := 270;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetAngle', E.Message);
end;
end;
procedure TOrthoLine.Select;
begin
inherited;
end;
//==============================================================================
//============ TConnectorObject ================================================
//==============================================================================
// Êîíñòðóêòîð äëÿ ñîçäàíèÿ îáüåêòà TConnectorObject
constructor TConnectorObject.Create(aX, aY, aZ: Double; LHandle: Integer;
aDrawStyle: TDrawStyle; aOwner: TComponent);
var
CaptionsLHandle: integer;
NotesLHandle: integer;
NotesRows: TFigureGrpNotMod;
NotesCaptions: TRichTextMod;
NotesRowsPoints: TDoublePoint;
ProgramRegisterPro_2: boolean;
addcod: integer;
begin
try
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
{$IF Defined(FINAL_SCS) or Defined(TRIAL_SCS)}
ProgramRegisterPro_2 := ProgProtection.CheckIsVer2(PRO, addcod);
{$ELSE}
ProgramRegisterPro_2 := True;
{$IFEND}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IF Defined(TRIAL_SCS)}
addcod := 0;
{$IFEND}
{$IF Not Defined(FINAL_SCS)}
addcod := 0;
{$IFEND}
{$IF Defined(FINAL_SCS) and Not Defined(TRIAL_SCS)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
if Not ProgramRegisterPro_2 then
exit;
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IFEND}
{$ELSE}
addcod := 0;
{$IFEND}
inherited create(LHandle, aDrawStyle, aOwner);
initialize; // Tolik 29/07/2021 --
ByDrawF := -1; // Tolik 09/03/2021 --
FModConnsOtherSides := nil;
//Tolik -- 02/04/2018 --
FJoinedOrthoLinesByVerticals := nil; // ñïèñîê ïðèñîåäèíåííûõ òðàññ ÷åðåç äðóãèå êîííåêòîðû âåðòèêàëåé â ýòîé òî÷êå
// íóæíî ïðè ïîñòîðîåíèè òðåéñèíãà âñåõ ïðèñîåäèíåííûõ ëèíèé ê âåðòèêàëüíîé êîíñòðóêöèè
//
//Initialize; // Tolik 29/07/2021 --
//Tolik
// FModConnsOtherSides := nil;
FDrawFigure := nil;
//
AsEndPoint := False;
FConnRaiseType := crt_None;
FObjectFromRaise := Nil;
FConnFullness := cif_Empty;
FDefectDegree := dodNormal;
FIndex := -1;
RemJoined := TList.Create;
JoinedOrtholinesList := TList.Create;
JoinedConnectorslist := TList.Create;
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcBegin.inc}
{$IFEND}
{$IFEND}
ActualPoints[1] := DoublePoint(aX + addcod, aY + addcod);
{$IF Not Defined(ES_GRAPH_SC)}
{$IF Not Defined(TRIAL_SCS)}
{$I Inc\DelphiCrcEnd.inc}
{$IFEND}
{$IFEND}
ActualZOrder[1] := aZ;
FLHandle := LHandle;
//FDrawStyle := aDrawStyle;
if DrawFigure <> nil then
FDrawFigureAngle := 0;
FID_ListToPassage := -1;
FID_ConnToPassage := -1;
ShowCaptions := GCadForm.FShowConnectorsCaptions;
ShowNotes := GCadForm.FShowConnectorsNotes;
FObjectType := 1;
FJoinedListIDForBox := -1;
FCabinetID := -1;
FComponID := -1;
FDrawFigureMoved := false;
// House
FIsApproach := False;
FIsHouseJoined := False;
FHouse := nil;
// Tolik 07/03/2020 --
FHouseIndex := -1;
//
if DrawStyle = mydsNormal then
begin
FNotesRowsType := nr_AutoSide;
FCaptionsViewType := cv_Right;
ConnectorType := ct_clear;
FCornerType := GCadForm.FDefaultCornerType;
FCornerTypeChangedByUser := False;
FDisableTracing := False;
FMirrored := False;
tmpParentDupID := -1;
FOriginalSizeX := 0;
FOriginalSizeY := 0;
FDrawFigurePercent := 100;
FCaptionsFontSize := GCadForm.FConnectorsCaptionsFontSize;
FNotesFontSize := GCadForm.FConnectorsNotesFontSize;
FCaptionsFontName := GCadForm.FFontName;
FNotesFontName := GCadForm.FFontName;
FCaptionsFontColor := GCadForm.FConnectorsCaptionsColor;
FNotesFontColor := GCadForm.FConnectorsNotesColor;
FRaiseShiftX := 1;
FRaiseShiftY := 1;
FTagPM := 0;
// ñîçäàíèå ïîäïèñåé
OutTextCaptions := TStringList.Create;
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(4);
CaptionsGroup := TRichTextMod.create(0, 0, 0, 0, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Caption);
CaptionsGroup.RE.Lines.Clear;
CaptionsGroup.RE.Font.Size := FCaptionsFontSize;
CaptionsGroup.re.Font.Name := FCaptionsFontName;
CaptionsGroup.re.Font.Color := FCaptionsFontColor;
GCadForm.PCad.AddCustomFigure (GLN(CaptionsLHandle), CaptionsGroup, False);
ReCreateCaptionsGroup(True, false);
// ñîçäàíèå âûíîñîê
OutTextNotes := TStringList.Create;
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
NotesRows := CreateNotesRowGroup(nr_AutoSide);
NotesRows.Visible := True;
NotesRowsPoints.x := (TLine(NotesRows.InFigures[1]).ActualPoints[1].x + TLine(NotesRows.InFigures[1]).ActualPoints[2].x) / 2;
NotesRowsPoints.y := (TLine(NotesRows.InFigures[1]).ActualPoints[1].y + TLine(NotesRows.InFigures[1]).ActualPoints[2].y) / 2;
NotesCaptions := TRichTextMod.create(NotesRowsPoints.x, NotesRowsPoints.y, NotesRowsPoints.x, NotesRowsPoints.y,
1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Note);
NotesCaptions.RE.Lines.Clear;
NotesCaptions.re.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
NotesCaptions.Visible := True;
NotesGroup := TFigureGrpNotMod.create(NotesLHandle, aOwner);
NotesGroup.AddFigure(NotesRows);
NotesGroup.AddFigure(NotesCaptions);
NotesGroup.LockModify := True;
GCadForm.PCad.AddCustomFigure (GLN(NotesLHandle), NotesGroup, False);
FGroupObject := nil;
F3DObject := nil;
FIsDraw := false; //05.04.2011
end;
FIsRotating := false; //11.03.2012
FindSnapTimer := nil;
//CreateSnapTimer; //ther test
if aDrawStyle <> dsTrace then
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Create', E.Message);
end;
end;
//Ñîçäàåò îáüåêò â ðåæèìå òðåéñà â óêàçàííîì ìåñòå
class function TConnectorObject.CreateShadow(x, y: Double): TFigure;
begin
try
Result := nil;
Result := TConnectorObject.Create(x, y, GCadForm.FConnHeight, 0, dsTrace, nil);
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateShadow', E.Message);
end;
end;
(*
Procedure TConnectorObject.DrawRaise; // Tolik 16/04/2020 --
var RaiseLine: TOrthoLine;
// Tolik 16/04/2020 -- ÷òîáû êîä íå ìíîæèòü....
function CheckCandrawRaise: Boolean;
var i: integer;
RRaiseLine: TFigure;
begin
Result := False;
RRaiseLine := Nil;
for i := 0 to JoinedOrthoLinesList.Count - 1 do
begin
if TOrthoLine(JoinedOrthoLinesList).FisRaiseUPDown then
begin
RRaiseLine := TFigure(JoinedOrthoLinesList);
break;
end;
end;
if RRaiseLine <> nil then
Result := IsViewObjectInCurrentNetwork(RRaiseLine);
end;
begin
if deleted then
exit;
if ConnectorType = ct_NB then
exit;
if checkCanDrawRaise then
begin
if FConnRaiseType = crt_OnFloor then
begin
{$IF (Defined(Final_SCS) or Defined(Trial_SCS))}
CheckRaiseType := GetRaiseType(FObjectFromRaise, Self);
if CheckRaiseType = lrt_Up then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if CheckRaiseType = lrt_Down then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
{$ELSE}
RaiseLine := GetRaiseLine(Self);
if RaiseLine <> nil then
begin
if RaiseLine.FLineRaiseType = lrt_Up then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise)
else
if RaiseLine.FLineRaiseType = lrt_Down then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
end;
{$IFEND}
end
else
begin
if FConnRaiseType = crt_BetweenFloorUp then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_BetweenFloorDown then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkUp then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkDown then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
end;
end;
end; *)
//Íåïîñðåäñòâåííàÿ îòðèñîâêà îáüåêòà íà Êàíâå
procedure TConnectorObject.Draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
var
//Tolik
// Points: array of TDoublePoint;
FillConn: TFillConnectConObj;
ObjectFromRaise: TConnectorObject;
IsDraw: Boolean;
BasisPoints: TDoublePoint;
CheckRaiseType: TLineRaiseType;
RaiseLine: TOrthoLine;
//Tolik
// BndPoints: TDoublePointArr;
Points, BndPoints: TDoublePointArr;
ptTest: TDoublePoint;
DrawWidth: integer;
aZoomScale: Double;
adim2: double;
adim02: double;
adim1: double;
adim4: double;
aZoomScaleCad: double;
function CheckCandrawRaise: Boolean;
var i, j: integer;
RRaiseLine: TOrthoLine;
begin
Result := False;
RRaiseLine := Nil;
if ConnectorType = ct_Clear then
begin
for i := 0 to JoinedOrthoLinesList.Count - 1 do
begin
if TOrthoLine(JoinedOrthoLinesList[i]).FisRaiseUPDown then
begin
RRaiseLine := TOrthoLine(JoinedOrthoLinesList[i]);
break;
end;
end;
end
else
if ConnectorType = ct_NB then
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
for j := 0 to TConnectorObject(JoinedConnectorsList[i]).JoinedOrthoLinesList.Count - 1 do
begin
if not TOrthoLine(TConnectorObject(JoinedConnectorsList[i]).JoinedOrthoLinesList[j]).deleted then
if TOrthoLine(TConnectorObject(JoinedConnectorsList[i]).JoinedOrthoLinesList[j]).FisRaiseUpDown then
begin
RRaiseLine := TOrthoLine(TConnectorObject(JoinedConnectorsList[i]).JoinedOrthoLinesList[j]);
break;
end;
end;
if RRaiseLine <> nil then
break;
end;
end;
if RRaiseLine <> nil then
Result := IsViewObjectInCurrentNetwork(TFigure(RRaiseLine));
end;
Procedure DrawRaise;
var RType: TConnRaiseType;
begin
if deleted then
exit;
//commented By Tolik 05/04/2021-
//if ConnectorType = ct_NB then
// exit;
{ RType := FConnRaiseType;
if JoinedconnectorsList.Count > 0 then
if not TConnectorObject(JoinedconnectorsList[0]).deleted then
if TConnectorObject(JoinedconnectorsList[0]).FConnRaiseType <> crt_None then
RType := TConnectorObject(JoinedconnectorsList[0]).FConnRaiseType;}
//
if checkCanDrawRaise then
begin
if FConnRaiseType = crt_OnFloor then
//if RType = crt_OnFloor then
begin
{$IF (Defined(Final_SCS) or Defined(Trial_SCS))}
CheckRaiseType := GetRaiseType(FObjectFromRaise, Self);
if CheckRaiseType = lrt_Up then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if CheckRaiseType = lrt_Down then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
{$ELSE}
RaiseLine := GetRaiseLine(Self);
if RaiseLine <> nil then
begin
// Tolik 17/12/2020 --
if not RaiseLine.Deleted then
begin
//
if RaiseLine.FLineRaiseType = lrt_Up then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise)
else
if RaiseLine.FLineRaiseType = lrt_Down then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
end;
end;
{$IFEND}
end
else
begin
if FConnRaiseType = crt_BetweenFloorUp then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_BetweenFloorDown then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkUp then
DrawRaiseUp(TPowerCad(Owner).DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkDown then
DrawRaiseDown(TPowerCad(Owner).DEngine, FObjectFromRaise);
end;
end;
end;
//
begin
try
DrawWidth := 1;
If Deleted then
Exit;
if FIsRotating then //11.03.2012
begin
DrawFigure.draw(DEngine, isGrayed);
Exit; ///// EXIT /////
end;
// Tolik 01/04/2017 --
SetLength(Points, 2);
SetLength(BndPoints, 4);
//òî÷êè èçíà÷àëüíî ïðîèíèöèàëèçèðóåì, ÷òîáû ïîòîì íå áûëî áÿêè
Points[0].x := ActualPoints[1].x;
Points[0].y := ActualPoints[1].y;
Points[1].x := ActualPoints[1].x;
Points[1].y := ActualPoints[1].y;
//
//Åñëè â ðåæèìå òðåéñà
if (DrawStyle = dsTrace) then //11.03.2012 if DrawStyle = dsTrace then
begin
DEngine.Canvas.Pen.Color := clBlue xor clWhite;
DEngine.canvas.pen.mode := pmXor;
DEngine.canvas.pen.Style := psSolid;
DEngine.canvas.Brush.Color := clNone;
DEngine.canvas.Brush.Style := bsClear;
//Îòðèñîâàòü ïðÿìîóãîëüíèê
//Tolik -- 10/04/2017 -- âûíåñåíî íàâåðõ
{SetLength(Points, 2);
SetLength(BndPoints, 4);}
if ConnectorType = ct_Clear then
begin
// Tolik -- 10/04/2017 --
{Points[0].x := ActualPoints[1].x - GrpSizeX / 2;
Points[0].y := ActualPoints[1].y - GrpSizeY / 2;
Points[1].x := ActualPoints[1].x + GrpSizeX / 2;
Points[1].y := ActualPoints[1].y + GrpSizeY / 2;
}
if ((DrawFigure <> nil) and (DrawFigure.InFigures.Count > 0)) then
begin
Points[0].x := ActualPoints[1].x - GrpSizeX / 2;
Points[0].y := ActualPoints[1].y - GrpSizeY / 2;
Points[1].x := ActualPoints[1].x + GrpSizeX / 2;
Points[1].y := ActualPoints[1].y + GrpSizeY / 2;
end
else
begin
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
end;
//
DEngine.DrawRect(Points[0].x, Points[0].y, Points[1].x, Points[1].y,
DEngine.canvas.pen.Color, 1, integer(DEngine.canvas.pen.Style),
DEngine.canvas.Brush.Color, integer(DEngine.canvas.Brush.Style));
end
else
begin
if DrawFigure.InFigures.Count = 0 then
begin
// Tolik
{Points[0].x := ActualPoints[1].x - GrpSizeX / 2;
Points[0].y := ActualPoints[1].y - GrpSizeY / 2;
Points[1].x := ActualPoints[1].x + GrpSizeX / 2;
Points[1].y := ActualPoints[1].y + GrpSizeY / 2;
}
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
//
DEngine.DrawRect(Points[0].x, Points[0].y, Points[1].x, Points[1].y,
DEngine.canvas.pen.Color, 1, integer(DEngine.canvas.pen.Style),
DEngine.canvas.Brush.Color, integer(DEngine.canvas.Brush.Style));
end
else
begin
begin
{BUG_2015_04_14_1}
adim02 := -dim02;
aZoomScale := 0;
adim2 := dim2;
// åñëè ñäâèíóòî ÓÃÎ èëè â ÓÃÎ ìíîãî ðàçíûõ åëåìåíòîâ - ðèñóåì ÷èñòî êâàäðàòèê
if (DrawFigure.InFigures.Count > 1) or (self.FDrawFigureMoved) then
begin
// ðèñóåì òóïî êâàäðàò íåçàâèñèìî îò ôîðìû ÓÃÎ.
{ ïðîáà - òàê íå ïîäõîäèò - íóæíî ÷òîáû ÷èñòî êâàäðàò çàâèñåë íå îò ñêåéëà êàäà à îò ïðîöåíòà ÓÃÎ
//if (GCadForm.PCad <> nil) then
// aZoomScale := GCadForm.PCad.ZoomScale;
//if (aZoomScale <> 0) then
//begin
// Points[0].x := ActualPoints[1].x - dim2 / (aZoomScale / 100);
// Points[0].y := ActualPoints[1].y - dim2 / (aZoomScale / 100);
// Points[1].x := ActualPoints[1].x + dim2 / (aZoomScale / 100);
// Points[1].y := ActualPoints[1].y + dim2 / (aZoomScale / 100);
//end
//else
}
aZoomScale := self.FDrawFigurePercent;
if (aZoomScale <> 0) then
begin
if aZoomScale < 20 then
adim2 := 4
else
if aZoomScale < 70 then
adim2 := 3;
Points[0].x := ActualPoints[1].x - adim2 * (aZoomScale / 100);
Points[0].y := ActualPoints[1].y - adim2 * (aZoomScale / 100);
Points[1].x := ActualPoints[1].x + adim2 * (aZoomScale / 100);
Points[1].y := ActualPoints[1].y + adim2 * (aZoomScale / 100);
end
else
{ ÷èñòî òàê âîîáùå áûëî ðàíåå ïåðåä ðèõòîâêîé BUG_2015_04_14_1}
begin
Points[0].x := ActualPoints[1].x - adim2 {GrpSizeX / 2};
Points[0].y := ActualPoints[1].y - adim2 {GrpSizeY / 2};
Points[1].x := ActualPoints[1].x + adim2 {GrpSizeX / 2};
Points[1].y := ActualPoints[1].y + adim2 {GrpSizeY / 2};
end;
end
else
begin
Points[0].x := ActualPoints[1].x - (GrpSizeX / 2 + adim02);
Points[0].y := ActualPoints[1].y - (GrpSizeY / 2 + adim02);
Points[1].x := ActualPoints[1].x + (GrpSizeX / 2 + adim02);
Points[1].y := ActualPoints[1].y + (GrpSizeY / 2 + adim02);
end;
end;
DEngine.DrawRect(Points[0].x, Points[0].y, Points[1].x, Points[1].y,
DEngine.canvas.pen.Color, 1, integer(DEngine.canvas.pen.Style),
DEngine.canvas.Brush.Color, integer(DEngine.canvas.Brush.Style));
end;
end;
end
else
// Åñëè â íîðìàëüíîì ðåæèìå (Îáüåêò óæå ñîçäàí)
begin
if DrawFigure <> nil then
begin
if AsEndPoint then
begin
//{$IF Not Defined(SCS_PE) and not Defined(SCS_PANDUIT)}
// DrawFigure.Visible := False;
// SetAllInFiguresVisible(DrawFigure, False);
//{$ELSE}
if Not DrawFigure.Deleted then
if Not DrawFigure.Visible then
begin
DrawFigure.Visible := True;
SetAllInFiguresVisible(DrawFigure, True);
end;
//{$IFEND}
end
else
begin
if Not DrawFigure.Deleted then
begin
DrawFigure.Visible := True;
SetAllInFiguresVisible(DrawFigure, True);
end;
end;
end;
// òèïû ñåòåé
IsDraw := IsViewObjectInCurrentNetwork(Self);
FIsDraw := IsDraw; //05.04.2011
if IsDraw then
begin
if CaptionsGroup <> nil then
CaptionsGroup.Visible := ShowCaptions;
if NotesGroup <> nil then
begin
if IsNoteExist(NotesGroup) then
NotesGroup.Visible := ShowNotes
else
NotesGroup.Visible := False;
end;
if DrawFigure <> nil then
begin
if AsEndPoint then
begin
//{$IF Not Defined(SCS_PE) and not Defined(SCS_PANDUIT)}
// DrawFigure.Visible := False;
// SetAllInFiguresVisible(DrawFigure, False);
//{$ELSE}
if Not DrawFigure.Deleted then
if Not DrawFigure.Visible then
begin
DrawFigure.Visible := True;
SetAllInFiguresVisible(DrawFigure, True);
end;
//{$IFEND}
end
else
begin
if Not DrawFigure.Deleted then
begin
DrawFigure.Visible := True;
SetAllInFiguresVisible(DrawFigure, True);
end;
end;
end;
end
else
begin
if CaptionsGroup <> nil then
CaptionsGroup.Visible := False;
if NotesGroup <> nil then
NotesGroup.Visible := False;
if DrawFigure <> nil then
begin
DrawFigure.Visible := False;
SetAllInFiguresVisible(DrawFigure, False);
end;
end;
if ConnectorType = ct_clear then
begin
if CaptionsGroup <> nil then
CaptionsGroup.Visible := False;
if NotesGroup <> nil then
NotesGroup.Visible := False;
//05.04.2011
//if not IsDraw then
end;
//if not IsDraw then
// Toilk -- 10/04/2017 --
// Exit;
if FConnRaiseType <> crt_None then
begin
SetLength(Points, 0);
SetLength(BndPoints, 0);
if FConnRaiseType <> crt_None then // Tolik 16/04/2020 --
DrawRaise; // Tolik 16/04/2020 --
Exit;
end;
//
if GCadForm.FShowCableChannelsOnly then
begin
DrawFigure.Visible := False;
SetAllInFiguresVisible(DrawFigure, False);
// Tolik 10/04/2017 --
SetLength(Points, 0);
SetLength(BndPoints, 0);
//
Exit;
end;
// îáëîæêà
if isGrayed then
begin
if ConnectorType = ct_Clear then
begin
DEngine.Canvas.Pen.Color := clGray;
DEngine.Canvas.Pen.Style := psSolid;
end;
if ConnectorType <> ct_Clear then
begin
DEngine.Canvas.Pen.Color := clGray;
DEngine.Canvas.Pen.Style := psSolid;
end;
end
else
{*****************************************************************}
// íîðìàëüíûé
begin
DEngine.Canvas.Pen.Color := clBlack;
DEngine.Canvas.brush.Style := bsClear;
// Ïóñòîé
if ConnectorType = ct_Clear then
begin
if AsEndPoint then
begin
DEngine.Canvas.Pen.Color := clGreen;
DEngine.canvas.Brush.Color := clGreen;
DEngine.canvas.Brush.Style := bsClear;
DEngine.Canvas.Pen.Style := psSolid;
end
else
begin
if (GCadForm <> nil) and (GCadForm.PCad <> nil) then
DEngine.Canvas.Pen.Color := GCadForm.PCad.PageColor;
// IGOR - óæå íå íóæíî çàðèñîâûâàòü ðàíåå îòîáðàæåííûå ðàìêè ñíåïà D0000006113
//if (Self = GPrevFigureSnap) or (Self = GPrevFigureTraceTo) then
// DEngine.Canvas.Pen.Style := psSolid
//else
DEngine.Canvas.Pen.Style := psClear;
end;
end
else
// ÐÒ
begin
if (AsEndPoint)or(InsideCabinet) then
begin
DEngine.canvas.Brush.Color := clRed;
DEngine.canvas.Brush.Style := bsSolid;
// IGOR - óæå íå íóæíî çàðèñîâûâàòü ðàíåå îòîáðàæåííûå ðàìêè ñíåïà D0000006113
//if (Self = GPrevFigureSnap) or (Self = GPrevFigureTraceTo) then
// DEngine.Canvas.Pen.Style := psSolid
//else
// DEngine.Canvas.Pen.Style := psClear;
//{$IF Defined (SCS_PE)}
DEngine.Canvas.Pen.Style := psSolid;
if InsideCabinet then
begin
DrawWidth := 3;
DEngine.Canvas.Pen.Color := $1f7ffa;
DEngine.canvas.Brush.Color := $1f7ffa;
end
else
begin
DrawWidth := 1;
DEngine.Canvas.Brush.Color := $EE82EE;
end;
DEngine.Canvas.Brush.Style := bsDiagCross;
//{$IFEND}
end
else
begin
if (GCadForm <> nil) and (GCadForm.PCad <> nil) then
DEngine.Canvas.Pen.Color := GCadForm.PCad.PageColor;
DEngine.canvas.Brush.Color := clNone;
DEngine.canvas.Brush.Style := bsClear;
// IGOR - óæå íå íóæíî çàðèñîâûâàòü ðàíåå îòîáðàæåííûå ðàìêè ñíåïà D0000006113
//if (Self = GPrevFigureSnap) or (Self = GPrevFigureTraceTo) then
// DEngine.Canvas.Pen.Style := psSolid
//else
DEngine.Canvas.Pen.Style := psClear;
end;
if Drawstyle = mydsNormal then
if FConnRaiseType <> crt_None then // Tolik 16/04/2020 --
DRAWRAISE; // Tolik 16/04/2020 --
end;
end;
DEngine.canvas.pen.mode := pmCopy;
//Îòðèñîâàòü ïðÿìîóãîëüíèê
// Tolik -- 10/04/2017 -- ýòî âûíåñåíî íàâåðõ
// SetLength(Points, 2);
if ConnectorType = ct_clear then
begin
adim1 := dim1;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
if GCadForm.PCad.ZoomScale > 700 then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 3
else
aZoomScaleCad := GCadForm.PCad.ZoomScale / 2;
end;
if (aZoomScaleCad > 50) then
adim1 := adim1 / (aZoomScaleCad / 100);
Points[0].x := ActualPoints[1].x - (GrpSizeX / 2 + adim1);
Points[0].y := ActualPoints[1].y - (GrpSizeY / 2 + adim1);
Points[1].x := ActualPoints[1].x + (GrpSizeX / 2 + adim1);
Points[1].y := ActualPoints[1].y + (GrpSizeY / 2 + adim1);
end
else
begin
adim02 := dim02;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
end;
if (aZoomScaleCad > 100) then
adim02 := adim02 / (aZoomScaleCad / 100);
if (AsEndPoint)or(InsideCabinet) then
begin
if DrawFigure <> nil then
begin
// Tolik -- 10/04/2017 --
{Points[0].x := DrawFigure.CenterPoint.x - (GrpSizeX / 2 + adim02);
Points[0].y := DrawFigure.CenterPoint.y - (GrpSizeY / 2 + adim02);
Points[1].x := DrawFigure.CenterPoint.x + (GrpSizeX / 2 + adim02);
Points[1].y := DrawFigure.CenterPoint.y + (GrpSizeY / 2 + adim02);}
//if ((GrpSizeX <> 0) and (GrpSizeY <> 0)) then
if DrawFigure.InFigures.Count > 0 then
begin
Points[0].x := DrawFigure.CenterPoint.x - (GrpSizeX / 2 + adim02);
Points[0].y := DrawFigure.CenterPoint.y - (GrpSizeY / 2 + adim02);
Points[1].x := DrawFigure.CenterPoint.x + (GrpSizeX / 2 + adim02);
Points[1].y := DrawFigure.CenterPoint.y + (GrpSizeY / 2 + adim02);
end
else
begin
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
end;
//
end
else
begin
// Tolik -- 10/04/2017 -- åñëè íåò ôèíóðû îòðèñîâêè, êàêîé íàõåð GRPSize?
{
Points[0].x := ActualPoints[1].x - (GrpSizeX / 2 + adim02);
Points[0].y := ActualPoints[1].y - (GrpSizeY / 2 + adim02);
Points[1].x := ActualPoints[1].x + (GrpSizeX / 2 + adim02);
Points[1].y := ActualPoints[1].y + (GrpSizeY / 2 + adim02);
}
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
end;
end
else
begin
if DrawFigure <> nil then
begin
// Tolik -- 10/04/2017 --
{
Points[0].x := DrawFigure.ActualPoints[1].x;
Points[0].y := DrawFigure.ActualPoints[1].y;
Points[1].x := DrawFigure.ActualPoints[1].x + (GrpSizeX + adim02);
Points[1].y := DrawFigure.ActualPoints[1].y + (GrpSizeY + adim02);
}
if DrawFigure.InFigures.Count > 0 then
begin
Points[0].x := DrawFigure.ActualPoints[1].x;
Points[0].y := DrawFigure.ActualPoints[1].y;
Points[1].x := DrawFigure.ActualPoints[1].x + (GrpSizeX + adim02);
Points[1].y := DrawFigure.ActualPoints[1].y + (GrpSizeY + adim02);
end
else
begin
{Points[0].x := DrawFigure.ActualPoints[1].x - 0.4;
Points[0].y := DrawFigure.ActualPoints[1].y - 0.4;
Points[1].x := DrawFigure.ActualPoints[1].x + 0.4;
Points[1].y := DrawFigure.ActualPoints[1].y + 0.4;}
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
end;
//
end
else
begin
// Tolik -- 10/04/2017 --
{
Points[0].x := ActualPoints[1].x - (GrpSizeX / 2 + adim02);
Points[0].y := ActualPoints[1].y - (GrpSizeY / 2 + adim02);
Points[1].x := ActualPoints[1].x + (GrpSizeX / 2 + adim02);
Points[1].y := ActualPoints[1].y + (GrpSizeY / 2 + adim02);
}
// IGOR
// íèçÿ òàê èáî DrawFigure NIL
//Points[0].x := DrawFigure.ActualPoints[1].x - 0.4;
//Points[0].y := DrawFigure.ActualPoints[1].y - 0.4;
//Points[1].x := DrawFigure.ActualPoints[1].x + 0.4;
//Points[1].y := DrawFigure.ActualPoints[1].y + 0.4;
//
// íóæíî òàê:
Points[0].x := ActualPoints[1].x - 0.4;
Points[0].y := ActualPoints[1].y - 0.4;
Points[1].x := ActualPoints[1].x + 0.4;
Points[1].y := ActualPoints[1].y + 0.4;
end;
end;
end;
{***********************************************}
// îòîáðàçèòü çàïîëíåííîñòü îáúåêòîâ
if GCadForm.FShowConnFullness then
begin
if ConnectorType <> ct_Clear then
begin
DEngine.Canvas.Pen.Style := psSolid;
if FConnFullness = cif_Empty then
DEngine.Canvas.Brush.Color := clRed;
if FConnFullness = cif_Full then
DEngine.Canvas.Brush.Color := clGreen;
if FConnFullness = cif_HalfEmpty then
DEngine.Canvas.Brush.Color := clYellow;
DEngine.Canvas.Brush.Style := bsDiagCross;
end;
end;
// îòîáðàçèòü ñòåïåíü äåôåêòà
if GCadForm.FShowDefectObjects then
begin
if ConnectorType <> ct_Clear then
begin
DEngine.Canvas.Pen.Style := psSolid;
if FDefectDegree = dodDefect then
DEngine.Canvas.Brush.Color := clRed;
if FDefectDegree = dodPartDefect then
DEngine.Canvas.Brush.Color := clYellow;
DEngine.Canvas.Brush.Style := bsCross;
end;
end;
// îòîáðàçèòü îáúåêòû, êîòîðûå íè ê ÷åìó íå ïðèñîåäèíåíû
if GCadForm.FShowDisconnectedObjects then
begin
if ConnectorType <> ct_Clear then
begin
if JoinedConnectorsList.Count = 0 then
begin
DEngine.Canvas.Pen.Style := psSolid;
//DEngine.Canvas.Brush.Color := clPurple;
DEngine.Canvas.Brush.Color := RGB($80, 0, $FF);
DEngine.Canvas.Brush.Style := bsDiagCross;
end;
end;
end;
{***********************************************}
// â ðåæèìå ïîäâÿçêè
if isSnap then
begin
DEngine.Canvas.Pen.Color := clRed;
DEngine.Canvas.Pen.Style := psSolid;
adim1 := dim1;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
end;
if (aZoomScaleCad > 100) then
adim1 := adim1 / (aZoomScaleCad / 100);
DrawWidth := 3;
{
//if Not AsEndPoint then
begin
Points[0].x := Points[0].x - adim1;
Points[0].y := Points[0].y - adim1;
Points[1].x := Points[1].x + adim1;
Points[1].y := Points[1].y + adim1;
end;
}
if (DrawFigure <> nil) and (DrawFigure.InFigures.Count > 0) then
begin
if ByDrawF = -1 then
ByDrawF := CheckConnectorUseUGOBounds(Self);
if (ByDrawF = biFalse) and ((DrawFigure.InFigures.Count > 1) or (Not EQDP(Self.CenterPoint, DrawFigure.CenterPoint))) then
//if (ByDrawF = biTrue) and ((DrawFigure.InFigures.Count > 1) or (Not EQDP(Self.CenterPoint, DrawFigure.CenterPoint))) then
begin
// Çäåñü æåëàòåëüíî îòðèñîâàòü ïðîñòî êâàäðàòèê (êàê íà òðåéñå)
{ ýòî ïî ôîðìå ÓÃÎ îòðèñîâêà
Points[0].x := Points[0].x - adim1;
Points[0].y := Points[0].y - adim1;
Points[1].x := Points[1].x + adim1;
Points[1].y := Points[1].y + adim1;
}
// ðèñóåì òóïî êâàäðàò íåçàâèñèìî îò ôîðìû ÓÃÎ.
aZoomScale := self.FDrawFigurePercent;
adim2 := dim2;
if (aZoomScale <> 0) then
begin
if aZoomScale < 20 then
adim2 := 4
else
if aZoomScale < 70 then
adim2 := 3;
Points[0].x := ActualPoints[1].x - adim2 * (aZoomScale / 100);
Points[0].y := ActualPoints[1].y - adim2 * (aZoomScale / 100);
Points[1].x := ActualPoints[1].x + adim2 * (aZoomScale / 100);
Points[1].y := ActualPoints[1].y + adim2 * (aZoomScale / 100);
end
else
{ ÷èñòî òàê âîîáùå áûëî ðàíåå ïåðåä ðèõòîâêîé }
begin
Points[0].x := Points[0].x - adim1;
Points[0].y := Points[0].y - adim1;
Points[1].x := Points[1].x + adim1;
Points[1].y := Points[1].y + adim1;
end;
end
else
begin
// çäåñü îòðèñóåì ïîëíîå î÷åðòàíèå
Points[0].x := Points[0].x - adim1;
Points[0].y := Points[0].y - adim1;
Points[1].x := Points[1].x + adim1;
Points[1].y := Points[1].y + adim1;
end;
end
else
begin
// çäåñü äëÿ ïóñòûõ êîííåêòîðîâ
adim1 := 0.7;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
end;
if (aZoomScaleCad > 100) then
adim1 := adim1 / (aZoomScaleCad / 100);
Points[0].x := Points[0].x - adim1;
Points[0].y := Points[0].y - adim1;
Points[1].x := Points[1].x + adim1;
Points[1].y := Points[1].y + adim1;
end;
end
else
begin
// IGOR - óæå íå íóæíî çàðèñîâûâàòü ðàíåå îòîáðàæåííûå ðàìêè ñíåïà D0000006113
//if (Self = GPrevFigureSnap) or (Self = GPrevFigureTraceTo) then
//begin
// DrawWidth := 3;
// if Not AsEndPoint then
// begin
// Points[0].x := Points[0].x - 1;
// Points[0].y := Points[0].y - 1;
// Points[1].x := Points[1].x + 1;
// Points[1].y := Points[1].y + 1;
// end;
//end;
end;
if DEngine.Canvas.Brush.Style = bsClear then
begin
if DrawFigure <> nil then
begin
end
else
begin
adim1 := 1.2;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
end;
if (aZoomScaleCad > 100) then
adim1 := adim1 / (aZoomScaleCad / 100);
Points[0].x := ActualPoints[1].x - (GrpSizeX / 2 + adim1);
Points[0].y := ActualPoints[1].y - (GrpSizeY / 2 + adim1);
Points[1].x := ActualPoints[1].x + (GrpSizeX / 2 + adim1);
Points[1].y := ActualPoints[1].y + (GrpSizeY / 2 + adim1);
end;
end;
if FConnRaiseType <> crt_None then
begin
if (FObjectFromRaise <> nil) and (ConnectorDetect(FObjectFromRaise)) then
begin
if FObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoints.x := FObjectFromRaise.ActualPoints[1].x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.ActualPoints[1].y - FObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoints.x := FObjectFromRaise.DrawFigure.CenterPoint.x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.DrawFigure.CenterPoint.y - FObjectFromRaise.GrpSizeY / 2;
end;
RaiseLine := GetRaiseLine(Self);
//òàê íåëüçÿ èíà÷å âîîáùå íà ñ/ï õðåí ÷òî îòðèñóåòñÿ åñëè âäðóã èçìåíÿòñÿ dim2 è dim4
//adim2 := dim2;
//adim4 := dim4;
// îòðèñîâêà êâàäðàòèêîâ íà ñ/ï (ñíåï, ÊÎ)
adim2 := 2;
adim4 := 4;
if FObjectFromRaise.DrawFigure.InFigures.Count > 0 then
begin
adim2 := 1.5; //1.5
adim4 := 3.5; //3.5
end;
if (RaiseLine <> nil) and (OrtholineDetect(RaiseLine)) then
begin
aZoomScale := RaiseLine.FDrawFigurePercent;
if (aZoomScale <> 0) then
begin
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 30) then
begin
adim2 := 0.5; //1.5
adim4 := 2.5; //3.5
end;
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 20) then
begin
adim2 := 0; //1.5
adim4 := 2; //3.5
end;
adim2 := adim2 * (aZoomScale / 100);
adim4 := adim4 * (aZoomScale / 100);
end;
if RaiseLine.FLineRaiseType = lrt_Up then
begin
Points[0].x := BasisPoints.x + adim2;
Points[0].y := BasisPoints.y - adim4;
Points[1].x := BasisPoints.x + adim4;
Points[1].y := BasisPoints.y - adim2;
end;
// ñïóñê
if RaiseLine.FLineRaiseType = lrt_Down then
begin
Points[0].x := BasisPoints.x + adim2;
Points[0].y := BasisPoints.y - adim4;
Points[1].x := BasisPoints.x + adim4;
Points[1].y := BasisPoints.y - adim2;
end;
end;
end;
end;
// ÎÒÐÈÑÎÂÀÒÜ Î×ÅÐÒÀÍÈß ÅÑËÈ ÑÒÈËÜ ÍÅ "ÏÓÑÒÎÉ"
// ÈËÈ ÎÁÚÅÊÒ - ÊÎÍÅ×ÍÛÉ ÎÁÚÅÊÒ
if (DEngine.canvas.pen.Style <> psClear) or (AsEndPoint)or(InsideCabinet) then
begin
// D0000006113
// IGOR - íå íóæíà çäåñü ýòà ïðîâåðêà
//if (isSnap) then //01.11.2013 ñàìûêîâ
//SetConnBringToFront(self);
// Tolik 24/05/2017 --
if asEndPoint then
begin
DEngine.canvas.Brush.Color := clRed;
DEngine.canvas.Brush.Style := bsSolid;
DEngine.Canvas.Pen.Style := psSolid;
if InsideCabinet then
begin
DrawWidth := 3;
DEngine.Canvas.Pen.Color := $1f7ffa;
DEngine.canvas.Brush.Color := $1f7ffa;
end
else
begin
DrawWidth := 1;
DEngine.Canvas.Brush.Color := $EE82EE;
end;
DEngine.Canvas.Brush.Style := bsDiagCross;
end;
// Tolik -- 30/05/2017 -- òóò òàêîå äåëàòü íèççÿ, ïîòîìó ÷òî, åñëè ïåðåä ðåôðåøåì ÊÀÄà
// êàêîé-íèáóäü îáúåêò (îñîáåííî çàêðàøåííûé) âûíåñåòñÿ íà ïåðåäíèé ïëàí, òî îí íå îòðèñóåòñÿ
// âûíåñåíî â ðåôðåø ÊÀÄà -- òàì ïîðÿäîê ôèãóð âûñòàâèòñÿ äî îòðèñîâêè è âñå áóäåò îê
{if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
TPowerCad(Owner).OrderFigureToFront(self);}
//
DEngine.DrawRect(Points[0].x, Points[0].y, Points[1].x, Points[1].y,
DEngine.canvas.pen.Color, DrawWidth, integer(DEngine.canvas.pen.Style),
DEngine.canvas.Brush.Color, integer(DEngine.canvas.Brush.Style));
//Tolik 08/11/2017 -*-
RedRect[1].x := Points[0].x;
RedRect[1].y := Points[0].y;
RedRect[1].z := 0;
RedRect[2].x := Points[1].x;
RedRect[2].y := Points[1].y;
RedRect[2].z := 0;
//
end;
// Äîðèñîâàòü óñë. îáîçíà÷åíèå ïîäíÿòèÿ íà âûñîòó
if (FObjectFromRaise <> nil) and (ConnectorDetect(FObjectFromRaise)) then
begin
if FConnRaiseType = crt_OnFloor then
begin
DEngine.Canvas.Pen.Width := 1;
DEngine.Canvas.Brush.Color := clBlack;
DEngine.Canvas.Brush.Style := bsSolid;
end;
if (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_BetweenFloorDown) then
begin
DEngine.Canvas.Pen.Width := 2;
DEngine.Canvas.Brush.Color := clBlue;
DEngine.Canvas.Brush.Style := bsSolid;
end;
if (FConnRaiseType = crt_TrunkUp) or (FConnRaiseType = crt_TrunkDown) then
begin
DEngine.Canvas.Pen.Width := 2;
DEngine.Canvas.Brush.Color := clGreen;
DEngine.Canvas.Brush.Style := bsSolid;
end;
if FConnRaiseType <> crt_None then // Tolik 16/04/2020 --
DRAWRAISE; // Tolik 16/04/2020 --
// DRAW RAISE
(*
if FConnRaiseType = crt_OnFloor then
begin
{$IF (Defined(Final_SCS) or Defined(Trial_SCS))}
CheckRaiseType := GetRaiseType(FObjectFromRaise, Self);
if CheckRaiseType = lrt_Up then
DrawRaiseUp(DEngine, FObjectFromRaise);
if CheckRaiseType = lrt_Down then
DrawRaiseDown(DEngine, FObjectFromRaise);
{$ELSE}
RaiseLine := GetRaiseLine(Self);
if RaiseLine <> nil then
begin
if RaiseLine.FLineRaiseType = lrt_Up then
DrawRaiseUp(DEngine, FObjectFromRaise)
else
if RaiseLine.FLineRaiseType = lrt_Down then
DrawRaiseDown(DEngine, FObjectFromRaise);
end;
{$IFEND}
end
else
begin
if FConnRaiseType = crt_BetweenFloorUp then
DrawRaiseUp(DEngine, FObjectFromRaise);
if FConnRaiseType = crt_BetweenFloorDown then
DrawRaiseDown(DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkUp then
DrawRaiseUp(DEngine, FObjectFromRaise);
if FConnRaiseType = crt_TrunkDown then
DrawRaiseDown(DEngine, FObjectFromRaise);
end;
*)
end;
end;
//Tolik
SetLength(Points, 0);
SetLength(BndPoints, 0);
//
except
// on E: Exception do addExceptionToLogEx('TConnectorObject.Draw', E.Message);
on E: Exception do addExceptionToLogEx('TConnectorObject.Draw ' + 'ID = '+ inttostr(Self.ID), E.Message);
end;
end;
//Ñîçäàíèå ÐÅÀËÜÍÎÃÎ îáüåêòà
class function TConnectorObject.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
begin
try
// Âûçâàòü êîíñòðóêòîð, êîòîðûé ñîçäàñò îáüåêò
Result := nil;
Result := TConnectorObject.Create(Shadow.ActualPoints[1].x, Shadow.ActualPoints[1].y, TConnectorObject(Shadow).ActualZOrder[1],
LHandle, mydsNormal, aOwner);
TConnectorObject(Result).ConnectorType := GCurrentConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Result, False);
Result := nil;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateFromShadow', E.Message);
end;
end;
procedure TConnectorObject.Initialize;
begin
inherited;
FClassIndex := ciConnectorObject; //04.11.2011
RedRect[1].x := ActualPoints[1].x;
RedRect[1].y := ActualPoints[1].y;
RedRect[1].z := 0;
RedRect[2].x := ActualPoints[1].x;
RedRect[2].y := ActualPoints[1].y;
RedRect[2].z := 0;
ByDrawF := -1; // Tolik 09/03/2021 --
end;
function TConnectorObject.ShadowTrace(ClickIndex: Integer; x, y: Double): Boolean;
begin
try
Result := True;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.ShadowTrace', E.Message);
end;
end;
//Îòðàáàòûâàåò ïðè íàæàòèå ìûøêè, ïîñëå ñâîéñòâà CreateShadow
function TConnectorObject.ShadowClick(ClickIndex: Integer; x, y: Double): Boolean;
begin
try
Result := false;
//Ñîçäàåì îáüåêò ïîñëå ïåðâîãî êëèêà
//íå îòðàáàòûâàÿ CreateFromShadow
if ClickIndex = 1 then
Result := True
else
Result := False;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.ShadowClick', E.Message);
end;
end;
//Çàäàåò êðàéíèå òî÷êè ôèãóðû, íóæåí äëÿ äàëüíåéøåé ïðîâåðêè íà âõîæäåíèå
//òî÷åê â îáëàñòü îáüåêòà
procedure TConnectorObject.GetBoundsDef(var figMaxX, figMaxY, figMinX, figMinY: Double); // Tolik 09/03/2021 --
begin
try
figMinX := ActualPoints[1].x - GrpSizeX / 2;
figMinY := ActualPoints[1].y - GrpSizeY / 2;
figMaxX := ActualPoints[1].x + GrpSizeX / 2;
figMaxY := ActualPoints[1].y + GrpSizeY / 2;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBoundsDef', E.Message);
end;
end;
// Tolik 09/03/2021 -- ñòàðàÿ çàêîììåí÷åíà - ñì. íèæå
procedure TConnectorObject.GetBounds(var figMaxX, figMaxY, figMinX, figMinY: Double);
var
Cp: TDoublePoint;
figMaxX1,figMaxY1,figMinX1,figMinY1: Double;
begin
try
figMinX := ActualPoints[1].x - GrpSizeX / 2;
figMinY := ActualPoints[1].y - GrpSizeY / 2;
figMaxX := ActualPoints[1].x + GrpSizeX / 2;
figMaxY := ActualPoints[1].y + GrpSizeY / 2;
//Cp := DoublePoint((figMaxX1 + figMinX1)/2, (figMaxY1 + figMinY1)/2);
//Cp := DoublePoint((figMaxX + figMinX)/2, (figMaxY + figMinY)/2);
Cp := DoublePoint(ActualPoints[1].x + GrpSizeX/2, ActualPoints[1].y + GrpSizeY/2);
figMinX := ActualPoints[1].x - 1;
figMinY := ActualPoints[1].y - 1;
figMaxX := ActualPoints[1].x + 1;
figMaxY := ActualPoints[1].y + 1;
if (DrawFigure = nil) or (DrawFigure.InFigures.Count = 0) then
begin
figMinX := ActualPoints[1].x - GrpSizeX / 2;
figMinY := ActualPoints[1].y - GrpSizeY / 2;
figMaxX := ActualPoints[1].x + GrpSizeX / 2;
figMaxY := ActualPoints[1].y + GrpSizeY / 2;
end
else
// åñòü èçîáðàæåíèå
begin
if ByDrawF = -1 then
ByDrawF := CheckConnectorUseUGOBounds(Self);
{TODO} // check for - ByCenterConnectPoint if ByCenterConnectPoint - then ByDrawF := False;
// prop ByCenterConnectPoint in TConnectorObject - def = -1
// if ConnectorObject.ByCenterConnectPoint = -1 - get prop from top component
// prop in component ByCenterConnectPoint - Íå ó÷èòûâàòü ÓÃÎ äëÿ ãðàíèö îáúåêòà
// ÷åêáîêñ ïîä óãî â ñâîéñòâàõ êîìï.
// èçìåíÿòü ñàìî ñâîéñòâî / èëè ñîñòîÿíèå ÷åêáîêñà ïîñëå èçìåíåíèÿ ÷åêáîêñà / ñâîéñòâà ñîîòâ.
// íà DefineObjectParams èëè äàæå âíóòðè DefineOjectIcon - ïðîïèñûâòü â ConnectorObject.ByCenterConnectPoint from top component
if (ByDrawF = biTrue) and ((DrawFigure.InFigures.Count > 1) or (Not EQDP(Cp, DrawFigure.CenterPoint))) then
begin
try
figMinX := DrawFigure.CenterPoint.x - GrpSizeX / 2;
figMinY := DrawFigure.CenterPoint.y - GrpSizeY / 2;
figMaxX := DrawFigure.CenterPoint.x + GrpSizeX / 2;
figMaxY := DrawFigure.CenterPoint.y + GrpSizeY / 2;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBounds', E.Message);
end;
end
else
begin
try
figMinX := ActualPoints[1].x - GrpSizeX / 2;
figMinY := ActualPoints[1].y - GrpSizeY / 2;
figMaxX := ActualPoints[1].x + GrpSizeX / 2;
figMaxY := ActualPoints[1].y + GrpSizeY / 2;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBounds', E.Message);
end;
end;
end;
///
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBounds', E.Message);
end;
end;
{
procedure TConnectorObject.GetBounds(var figMaxX, figMaxY, figMinX, figMinY: Double);
begin
try
figMinX := ActualPoints[1].x - GrpSizeX / 2;
figMinY := ActualPoints[1].y - GrpSizeY / 2;
figMaxX := ActualPoints[1].x + GrpSizeX / 2;
figMaxY := ActualPoints[1].y + GrpSizeY / 2;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBounds', E.Message);
end;
end;
}
procedure TConnectorObject.getboundsWithoutGrpSize(var figMaxX, figMaxY, figMinX, figMinY: Double);
begin
try
figMinX := ActualPoints[1].x;
figMinY := ActualPoints[1].y;
figMaxX := ActualPoints[1].x;
figMaxY := ActualPoints[1].y;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetBounds', E.Message);
end;
end;
//Tolik 30/10/2018 -- ñòàðàÿ çàêîììåí÷åíà -- ñì íèæå
(*
//Ïðîâåðêà íà âõîæäåíèå òî÷åê â îáëàñòü îáüåêòà
function TConnectorObject.IsPointIn(x, y: Double): Boolean;
var
RaiseMinX, RaiseMinY, RaiseMaxX, RaiseMaxY: Double;
ObjectFromRaise: TConnectorObject;
BasisPoints: TDoublePoint;
RaiseLine: TOrthoLine;
adim25: double;
adim4: double;
aZoomScale: double;
adim2: double;
adim1: double;
aZoomScaleCad: double;
begin
try
Result := False;
{************************************************************************}
// ÏÎÄÚÅÌ - ÑÏÓÑÊ
if ((FObjectFromRaise <> nil) and (ConnectorDetect(FObjectFromRaise)) and (ConnectorType = ct_Clear)) then
begin
if FObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoints.x := FObjectFromRaise.ActualPoints[1].x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.ActualPoints[1].y - FObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoints.x := FObjectFromRaise.DrawFigure.CenterPoint.x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.DrawFigure.CenterPoint.y - FObjectFromRaise.GrpSizeY / 2;
end;
// ïîäúåì
RaiseLine := GetRaiseLine(Self);
if (RaiseLine <> nil) and (OrtholineDetect(RaiseLine)) then
begin
adim25 := 2.5;
adim4 := 4;
aZoomScale := RaiseLine.FDrawFigurePercent;
if FObjectFromRaise <> nil then
begin
if FObjectFromRaise.DrawFigure.InFigures.Count > 0 then
begin
adim25 := 2.0;
adim4 := 3.5;
end;
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 30) then
begin
adim25 := 1.5;
adim4 := 2.5;
end;
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 20) then
begin
adim25 := 0.5;
adim4 := 2.5;
end;
end;
if (aZoomScale <> 0) then
begin
adim25 := adim25 * (aZoomScale / 100);
adim4 := adim4 * (aZoomScale / 100);
end;
if RaiseLine.FLineRaiseType = lrt_Up then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
// ñïóñê
if RaiseLine.FLineRaiseType = lrt_Down then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
if ActualZOrder[1] = FObjectFromRaise.ActualZOrder[1] then
begin
if (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_TrunkUp) then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_TrunkDown) then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
end;
if (x >= RaiseMinX) AND (x <= RaiseMaxX) AND (y >= RaiseMinY) AND (y <= RaiseMaxY) then
Result := True;
end;
end
else
// ÎÁÛ×ÍÛÉ
begin
// ÏÓÑÒÎÉ
if ConnectorType = ct_Clear then
begin
adim1 := 2; //1;
adim4 := 4;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
if (GCadForm.PCad.ZoomScale >= 500) and (GCadForm.PCad.ZoomScale < 1000) then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 2
else
if GCadForm.PCad.ZoomScale >= 1000 then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 3;
end;
if aZoomScaleCad > 0 then
begin
adim1 := adim1 / (aZoomScaleCad / 100);
adim4 := adim4 / (aZoomScaleCad / 100);
end;
if FIsHouseJoined then
begin
if (x >= ActualPoints[1].x - (GrpSizeX + adim4) / 2) AND (x <= ActualPoints[1].x + (GrpSizeX + adim4) / 2) AND
(y >= ActualPoints[1].y - (GrpSizeY + adim4) / 2) AND (y <= ActualPoints[1].y + (GrpSizeY + adim4) / 2) then
Result := True;
end
else
begin
if (x >= ActualPoints[1].x - (GrpSizeX + adim1) / 2) AND (x <= ActualPoints[1].x + (GrpSizeX + adim1) / 2) AND
(y >= ActualPoints[1].y - (GrpSizeY + adim1) / 2) AND (y <= ActualPoints[1].y + (GrpSizeY + adim1) / 2) then
Result := True;
end;
end
else
// ÒÎ×Å×ÍÛÉ ÎÁÚÅÊÒ
begin
// íåò èçîáðàæåíèÿ
// Tolik -- 11/01/2017 --
// Ôèãóðû îòðèñîâêè ìîæåò è íå áûòü, åñëè ïîëüçîâàòåëü ñîçäàë êîìïîíåíò, à ÓÃÎ íå çàäàë ...
//if DrawFigure.InFigures.Count = 0 then
if (DrawFigure = nil) or (DrawFigure.InFigures.Count = 0) then
begin
// òóïî ïî êâàäðàòó íåçàâèñèìî îò ôîðìû ÓÃÎ.
aZoomScale := self.FDrawFigurePercent;
adim2 := dim2;
if (aZoomScale <> 0) then
begin
if aZoomScale < 20 then
adim2 := 4
else
if aZoomScale < 70 then
adim2 := 3;
adim2 := adim2 * (aZoomScale / 100);
if (x >= ActualPoints[1].x - adim2) AND (x <= ActualPoints[1].x + adim2) AND
(y >= ActualPoints[1].y - adim2) AND (y <= ActualPoints[1].y + adim2) then
Result := True;
end
else
begin
{ ýòî ïî ôîðìå ÓÃÎ ïðîâåðêà âõîæäåíèÿ}
if (x >= DrawFigure.CenterPoint.x - GrpSizeX / 2) AND (x <= DrawFigure.CenterPoint.x + GrpSizeX / 2) AND
(y >= DrawFigure.CenterPoint.y - GrpSizeY / 2) AND (y <= DrawFigure.CenterPoint.y + GrpSizeY / 2) then
Result := True;
end;
end
else
// åñòü èçîáðàæåíèå
begin
{ ýòî ïî ôîðìå ÓÃÎ ïðîâåðêà âõîæäåíèÿ}
if ( x >= DrawFigure.CenterPoint.x - GrpSizeX / 2) AND (x <= DrawFigure.CenterPoint.x + GrpSizeX / 2) AND
(y >= DrawFigure.CenterPoint.y - GrpSizeY / 2) AND (y <= DrawFigure.CenterPoint.y + GrpSizeY / 2) then
// if IsPointInDrawFigure(x, y) then
Result := True;
end;
end;
end;
//05.04.2011 - Åñëè îáúåêò ñêðûò îò ïðîðèñîâêè, çíà÷èò íå äàåì åãî âûäåëèòü ìûøêîé
if Not FIsDraw and (ConnectorType = ct_Clear) and Not Selected and (Not(ssShift in GGlobalShiftState)) then
Result := false;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.IsPointIn', E.Message);
end;
end;
*)
//
//Ïðîâåðêà íà âõîæäåíèå òî÷åê â îáëàñòü îáüåêòà
function TConnectorObject.IsPointIn(x, y: Double): Boolean;
var
RaiseMinX, RaiseMinY, RaiseMaxX, RaiseMaxY: Double;
ObjectFromRaise: TConnectorObject;
BasisPoints: TDoublePoint;
RaiseLine: TOrthoLine;
adim25: double;
adim4: double;
aZoomScale: double;
adim2: double;
adim1: double;
aZoomScaleCad: double;
begin
try
Result := False;
{************************************************************************}
// ÏÎÄÚÅÌ - ÑÏÓÑÊ
if (FObjectFromRaise <> nil) and (ConnectorDetect(FObjectFromRaise)) then
begin
if FObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoints.x := FObjectFromRaise.ActualPoints[1].x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.ActualPoints[1].y - FObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoints.x := FObjectFromRaise.DrawFigure.CenterPoint.x + FObjectFromRaise.GrpSizeX / 2;
BasisPoints.y := FObjectFromRaise.DrawFigure.CenterPoint.y - FObjectFromRaise.GrpSizeY / 2;
end;
// ïîäúåì
RaiseLine := GetRaiseLine(Self);
if (RaiseLine <> nil) and (OrtholineDetect(RaiseLine)) then
begin
adim25 := 2.5;
adim4 := 4;
aZoomScale := RaiseLine.FDrawFigurePercent;
if FObjectFromRaise <> nil then
begin
if FObjectFromRaise.DrawFigure.InFigures.Count > 0 then
begin
adim25 := 2.0;
adim4 := 3.5;
end;
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 30) then
begin
adim25 := 1.5;
adim4 := 2.5;
end;
if (FObjectFromRaise.DrawFigure.InFigures.Count > 0) and (aZoomScale <= 20) then
begin
adim25 := 0.5;
adim4 := 2.5;
end;
end;
if (aZoomScale <> 0) then
begin
adim25 := adim25 * (aZoomScale / 100);
adim4 := adim4 * (aZoomScale / 100);
end;
if RaiseLine.FLineRaiseType = lrt_Up then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
// ñïóñê
if RaiseLine.FLineRaiseType = lrt_Down then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
if ActualZOrder[1] = FObjectFromRaise.ActualZOrder[1] then
begin
if (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_TrunkUp) then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_TrunkDown) then
begin
RaiseMinX := BasisPoints.x + adim25;
RaiseMinY := BasisPoints.y - adim4;
RaiseMaxX := BasisPoints.x + adim4;
RaiseMaxY := BasisPoints.y - adim25;
end;
end;
if (x >= RaiseMinX) AND (x <= RaiseMaxX) AND (y >= RaiseMinY) AND (y <= RaiseMaxY) then
Result := True;
end;
end
else
// ÎÁÛ×ÍÛÉ
begin
// ÏÓÑÒÎÉ
if ConnectorType = ct_Clear then
begin
adim1 := 2; //1;
adim4 := 4;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
begin
aZoomScaleCad := GCadForm.PCad.ZoomScale;
if (GCadForm.PCad.ZoomScale >= 500) and (GCadForm.PCad.ZoomScale < 1000) then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 2
else
if GCadForm.PCad.ZoomScale >= 1000 then
aZoomScaleCad := GCadForm.PCad.ZoomScale / 3;
end;
if aZoomScaleCad > 0 then
begin
adim1 := adim1 / (aZoomScaleCad / 100);
adim4 := adim4 / (aZoomScaleCad / 100);
end;
if FIsHouseJoined then
begin
if (x >= ActualPoints[1].x - (GrpSizeX + adim4) / 2) AND (x <= ActualPoints[1].x + (GrpSizeX + adim4) / 2) AND
(y >= ActualPoints[1].y - (GrpSizeY + adim4) / 2) AND (y <= ActualPoints[1].y + (GrpSizeY + adim4) / 2) then
Result := True;
end
else
begin
if (x >= ActualPoints[1].x - (GrpSizeX + adim1) / 2) AND (x <= ActualPoints[1].x + (GrpSizeX + adim1) / 2) AND
(y >= ActualPoints[1].y - (GrpSizeY + adim1) / 2) AND (y <= ActualPoints[1].y + (GrpSizeY + adim1) / 2) then
Result := True;
end;
end
else
// ÒÎ×Å×ÍÛÉ ÎÁÚÅÊÒ
begin
// íåò èçîáðàæåíèÿ
// Tolik -- 11/01/2017 --
// Ôèãóðû îòðèñîâêè ìîæåò è íå áûòü, åñëè ïîëüçîâàòåëü ñîçäàë êîìïîíåíò, à ÓÃÎ íå çàäàë ...
//if DrawFigure.InFigures.Count = 0 then
if (DrawFigure = nil) or (DrawFigure.InFigures.Count = 0) then
begin
if (x >= ActualPoints[1].x - (GrpSizeX + 1) / 2) AND (x <= ActualPoints[1].x + (GrpSizeX + 1) / 2) AND
(y >= ActualPoints[1].y - (GrpSizeY + 1) / 2) AND (y <= ActualPoints[1].y + (GrpSizeY + 1) / 2) then
Result := True;
end
else
// åñòü èçîáðàæåíèå
begin
//Tolik 09/03/2021
if ByDrawF = -1 then
ByDrawF := CheckConnectorUseUGOBounds(Self);
if (ByDrawF = biFalse) and ((DrawFigure.InFigures.Count > 1) or (Not EQDP(Self.CenterPoint, DrawFigure.CenterPoint))) then
begin
// òóïî ïî êâàäðàòó íåçàâèñèìî îò ôîðìû ÓÃÎ.
aZoomScale := self.FDrawFigurePercent;
adim2 := dim2;
if (aZoomScale <> 0) then
begin
if aZoomScale < 20 then
adim2 := 4
else
if aZoomScale < 70 then
adim2 := 3;
adim2 := adim2 * (aZoomScale / 100);
if (x >= ActualPoints[1].x - adim2) AND (x <= ActualPoints[1].x + adim2) AND
(y >= ActualPoints[1].y - adim2) AND (y <= ActualPoints[1].y + adim2) then
Result := True;
end
else
begin
{ ýòî ïî ôîðìå ÓÃÎ ïðîâåðêà âõîæäåíèÿ}
if (x >= DrawFigure.CenterPoint.x - GrpSizeX / 2) AND (x <= DrawFigure.CenterPoint.x + GrpSizeX / 2) AND
(y >= DrawFigure.CenterPoint.y - GrpSizeY / 2) AND (y <= DrawFigure.CenterPoint.y + GrpSizeY / 2) then
Result := True;
end;
end
else
begin
{ ýòî ïî ôîðìå ÓÃÎ ïðîâåðêà âõîæäåíèÿ}
if (x >= DrawFigure.CenterPoint.x - GrpSizeX / 2) AND (x <= DrawFigure.CenterPoint.x + GrpSizeX / 2) AND
(y >= DrawFigure.CenterPoint.y - GrpSizeY / 2) AND (y <= DrawFigure.CenterPoint.y + GrpSizeY / 2) then
// if IsPointInDrawFigure(x, y) then
Result := True;
end;
end;
end;
end;
//05.04.2011 - Åñëè îáúåêò ñêðûò îò ïðîðèñîâêè, çíà÷èò íå äàåì åãî âûäåëèòü ìûøêîé
if Not FIsDraw and (ConnectorType = ct_Clear) and Not Selected and (Not(ssShift in GGlobalShiftState)) then
Result := false;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.IsPointIn', E.Message);
end;
end;
function TConnectorObject.IsPointInDrawFigure(x, y: Double): Boolean;
var
i: Integer;
InFigure: TFigure;
Points: TDoublePointArr;
ptTest: TDoublePoint;
MinX, MinY, MaxX, MaxY: double;
begin
try
Result := False;
SetLength(Points, 4);
ptTest := DoublePoint(x, y);
if DrawFigure <> nil then
begin
for i := 0 to DrawFigure.InFigures.Count - 1 do
begin
InFigure := TFigure(DrawFigure.InFigures[i]);
Points[0].x := round(InFigure.ap1.x);
Points[0].y := round(InFigure.ap1.y);
Points[1].x := round(InFigure.ap2.x);
Points[1].y := round(InFigure.ap2.y);
Points[2].x := round(InFigure.ap3.x);
Points[2].y := round(InFigure.ap3.y);
Points[3].x := round(InFigure.ap4.x);
Points[3].y := round(InFigure.ap4.y);
Result := PtInPolygon(Points, ptTest);
end;
if (x >= MinX) and (x <= MaxX) and (y >= MinY) and (y <= MaxY) then
Result := True;
end;
//Tolik
SetLength(Points, 0);
//
except
on E: Exception do addExceptionToLogEx('TConnectorObject.IsPointInDrawFigure', E.Message);
end;
end;
Function TConnectorObject.isToRaise: Boolean;
var i: Integer;
begin
Result := False;
if FConnRaiseType = crt_None then
begin
for i := 0 to JoinedOrtholinesList.Count - 1 do
if TOrthoLine(JoinedOrtholinesList[i]).FIsRaiseUpDown then
if JoinedConnectorsList.Count > 0 then
Result := True;
end;
end;
//Function TConnectorObject.GetSelPoints: TList;
Function TConnectorObject.GetSelPoints: TMyList; // Tolik 24/12/2019 --
begin
result := selPoints;
end;
//Ïîëó÷èòü ìîäèôèêàöèîííûå òî÷êè
//procedure TConnectorObject.GetModPoints(ModList: TList);
procedure TConnectorObject.GetModPoints(ModList: TMyList);
var
cp: TDoublePoint;
i: integer;
// isToRaise: Boolean;
MT,MR,MB,ML: TDoublePoint;
p1, p2, p3, p4: TDoublePoint;
aScaleCad: double;
adim1: double;
begin
try
{
if FIsApproach then
begin
if DrawFigure <> nil then
begin
p1 := DoublePoint(DrawFigure.ap1.x, DrawFigure.ap1.y);
p2 := DoublePoint(DrawFigure.ap2.x, DrawFigure.ap2.y);
p3 := DoublePoint(DrawFigure.ap3.x, DrawFigure.ap3.y);
p4 := DoublePoint(DrawFigure.ap4.x, DrawFigure.ap4.y);
end
else
begin
p1 := ActualPoints[1];
p2 := ActualPoints[1];
p3 := ActualPoints[1];
p4 := ActualPoints[1];
end;
MT := MPoint(p1, p2);
MR := MPoint(p2, p3);
MB := MPoint(p3, p4);
ML := MPoint(p4, p1);
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,p1.x,p1.y,1));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,p2.x,p2.y,3));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,p3.x,p3.y,5));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,p4.x,p4.y,7));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,MT.x,MT.y,2));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,MR.x,MR.y,4));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,MB.x,MB.y,6));
ModList.Add(GCadForm.PCad.RegisterModPoint(self,ptRectPoint,ptRect,clBlue,PointDim,ML.x,ML.y,8));
exit;
end;
}
// Tolik 06/08/2018 -- âûíåñåíî îòäåëüíîé ôóíêöèåé
cp := ActualPoints[1];
{
isToRaise := false;
cp := ActualPoints[1];
if FConnRaiseType = crt_None then
begin
for i := 0 to JoinedOrtholinesList.Count - 1 do
if TOrthoLine(JoinedOrtholinesList[i]).FIsRaiseUpDown then
if JoinedConnectorsList.Count > 0 then
isToRaise := True;
end;
}
//Çàíåñåíèå ìîä.òî÷êè îáüåêòà â ìîä.ëèñò
if not isToRaise then
begin
if ConnectorType <> ct_Clear then
begin
// Tolik -- 11/04/2017 -- íåëüçÿ ÷åðåç GCadForm, òàê êàê ýòî íå âñåãäà -- âëàäåëåö ôèãóðû,
// ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ!!!!! ÁÓÄÓÒ ÒÐÀÁËÛ ÏÐÈ ÇÀÊÐÛÒÈÈ ÏÐÎÅÊÒÀ!!!
(*
if GCadForm.PCad.Focused then
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptRect, clGreen, pointdim + dimp_add, cp.x, cp.y, 0))
else
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptRect, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0))
*)
if TPCDrawing(Self.Owner).Focused then
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptRect, clGreen, pointdim + dimp_add, cp.x, cp.y, 0))
else
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptRect, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0))
end
else
begin
if JoinedConnectorslist.Count = 0 then
begin
// Tolik -- 11/04/2017 -- íåëüçÿ ÷åðåç GCadForm, òàê êàê ýòî íå âñåãäà -- âëàäåëåö ôèãóðû,
// ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ!!!!! ÁÓÄÓÒ ÒÐÀÁËÛ ÏÐÈ ÇÀÊÐÛÒÈÈ ÏÐÎÅÊÒÀ!!!
(*
if GCadForm.PCad.Focused then
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptRect, clGreen, pointdim + dimp_add, cp.x, cp.y, 0))
else
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptRect, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0));
*)
if TPCDrawing(Self.Owner).Focused then
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptRect, clGreen, pointdim + dimp_add, cp.x, cp.y, 0))
else
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptRect, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0));
end
else
begin
// Tolik -- 11/04/2017 -- íåëüçÿ ÷åðåç GCadForm, òàê êàê ýòî íå âñåãäà -- âëàäåëåö ôèãóðû,
// ÍÅËÜÇß ÒÀÊ ÄÅËÀÒÜ!!!!! ÁÓÄÓÒ ÒÐÀÁËÛ ÏÐÈ ÇÀÊÐÛÒÈÈ ÏÐÎÅÊÒÀ!!!
(*
if GCadForm.PCad.Focused then
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptCircle, clRed, pointdim + dimp_add, cp.x, cp.y, 0))
else
ModList.Add(GCadForm.PCad.RegisterModPoint(self, ptRectPoint, ptCircle, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0));
*)
if TPCDrawing(Self.Owner).Focused then
begin
// pointdim âñåãäà 3
// dimp_add 1
//ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptCircle, clRed, pointdim + dimp_add, cp.x, cp.y, 0));
//ñäåëàåì ÷óòü áîëüøèì êðàñíûé êðóæî÷åê
//ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptCircle, clRed, pointdim + 3, cp.x, cp.y, 0));
//aScaleCad := 1;
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptCircle, clRed, pointdim + 2, cp.x, cp.y, 0));
end
else
ModList.Add(TPCDrawing(Self.Owner).RegisterModPoint(self, ptRectPoint, ptCircle, $008040 {clGray}, pointdim + dimp_add, cp.x, cp.y, 0));
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetModPoints', E.Message);
end;
end;
// Tolik -- 13/04/2018 -- ïåðåïèñàíà...íåìíîæêî...ñîâñåì...ñòàðàÿ --íèæå çàêîììåí÷åíà ...
// ïðîáëåìà áûëà â òîì, ÷òî íåïðàâèëüíî îïðåäåëåí ñïèñîê ïðèñîåäèíåííûõ òðàññ äëÿ ïåðåìåùåíèÿ êîííåêòîðà - íå ó÷òåíû ïîäêëþ÷åííûå ÷åðåç âåðòèêàëüíûþ êîíñòðóêöèþ
function TConnectorObject.CreateModification: TFigure;
var
i, j: integer;
JoinedCon: TConnectorObject;
ClickedX, ClickedY: Double;
MovedP: TPoint;
MovedZ, MovedX, MovedY: Double;
SetCur: TPoint;
InFigure: TFigure;
vLine1, vLine2: TOrthoLine;
PassedList: TList;
NextVConn, LineConn: TConnectorObject;
JoinedLine : TOrthoLine;
Procedure CheckAddJoinedLinesByVerticals(aConn: TConnectorObject);
var JoinedLine: TOrthoLine;
i, j: Integer;
JoinedConn, jConn, NextConn: TConnectorObject;
begin
NextConn := Nil;
if aConn.ConnectorType = ct_Clear then
begin
for i := 0 to aConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(aConn.JoinedOrthoLinesList[i]);
if not JoinedLine.FisRaiseUpDown then
if not JoinedLine.FisVertical then
begin
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
FJoinedOrthoLinesByVerticals.Add(JoinedLine);
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
if JoinedConn.ID = aConn.ID then
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
if FModConnsOtherSides.IndexOf(JoinedConn) = -1 then
FModConnsOtherSides.Add(JoinedConn);
if JoinedConn.JoinedConnectorsList.Count > 0 then
JoinedConn := TConnectorObject(JoinedConn.JoinedConnectorsList[0]);
end;
end;
for i := 0 to AConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(aConn.JoinedOrthoLinesList[i]);
if JoinedLine.FisVertical then
if PassedList.IndexOf(JoinedLine) = -1 then
begin
PassedList.Add(JoinedLine);
if JoinedLine.JoinConnector1.ID = aConn.ID then
NextConn := TConnectorObject(JoinedLine.JoinConnector2)
else
if JoinedLine.JoinConnector2.ID = aConn.ID then
NextConn := TConnectorObject(JoinedLine.JoinConnector1);
break;
end
end;
end
else
if aConn.ConnectorType = ct_NB then
begin
for i := 0 to aConn.JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(aConn.JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrthoLinesList[j]);
if not JoinedLine.FisRaiseUpDown then
if not JoinedLine.FisVertical then
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
FJoinedOrthoLinesByVerticals.Add(JoinedLine);
JConn := TConnectorObject(JoinedLine.JoinConnector1);
if JConn.ID = JoinedConn.ID then
JConn := TConnectorObject(JoinedLine.JoinConnector2);
if FModConnsOtherSides.IndexOf(JConn) = -1 then
FModConnsOtherSides.Add(jConn);
if JConn.JoinedConnectorsList.Count > 0 then
JConn := TConnectorObject(JConn.JoinedConnectorsList[0]);
end;
end;
end;
for i := 0 to aConn.JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(aConn.JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrthoLinesList[j]);
if JoinedLine.FIsVertical then
if PassedList.IndexOf(JoinedLine) = -1 then
begin
PassedList.Add(JoinedLine);
if TConnectorObject(JoinedLine.JoinConnector1).ID = JoinedConn.ID then
NextConn := TConnectorObject(JoinedLine.JoinConnector2)
else
if TConnectorObject(JoinedLine.JoinConnector2).ID = JoinedConn.ID then
NextConn := TConnectorObject(JoinedLine.JoinConnector1);
break;
end;
end;
if NextConn <> nil then
break;
end;
end;
if NextConn <> nil then
begin
if NextConn.JoinedConnectorsList.Count > 0 then
NextConn := TConnectorObject(NextConn.JoinedConnectorsList[0]);
CheckAddJoinedLinesByVerticals(NextConn);
end;
end;
begin
try
if assigned(owner) and assigned(owner.Owner) then
begin
if TPowerCad(Owner).Selection.Count > 1 then
begin
for i := 0 to TF_Cad(TPowerCad(Owner).Owner).FSCSFigures.Count - 1 do
if TFigure(TF_Cad(TPowerCad(Owner).Owner).FSCSFigures[i]).Selected and
(TFigure(TF_Cad(TPowerCad(Owner).Owner).FSCSFigures[i]) <> self ) then
TFigure(TF_Cad(TPowerCad(Owner).Owner).FSCSFigures[i]).Deselect;
end;
end;
Result := nil;
FModPosOffset.x := 0;
FModPosOffset.y := 0;
if FModConnsOtherSides <> nil then
FreeAndNil(FModConnsOtherSides);
// FModConnsOtherSides := GetConnectorsOtherSides(Self);
FModConnsOtherSides := TList.Create;
MovedZ := 0;
Select;
if not FIsApproach then
begin
MovedX := ActualPoints[1].x + 0.5 / (GCadForm.PCad.ZoomScale / 100);
MovedY := ActualPoints[1].y + 0.5 / (GCadForm.PCad.ZoomScale / 100);
GCadForm.PCad.ConvertXY(MovedX, MovedY, MovedZ);
SetCur.X := round(MovedX);
SetCur.Y := round(MovedY);
ClientToScreen(GCadForm.PCad.Handle, SetCur);
SetCursorPos(SetCur.X, SetCur.Y);
end;
// ñîõðàíèòü ëèñò ïîäêëþ÷åííûõ ôèãóð
// Tolik 16/04/2018 -- õåðíÿ...
//GTempJoinedOrtholinesList := JoinedOrtholinesList;
//GTempJoinedConnectorsList := JoinedConnectorsList;
if GTempJoinedOrtholinesList = nil then
GTempJoinedOrtholinesList := TList.Create
else
GTempJoinedOrtholinesList.Clear;
if GTempJoinedConnectorsList <> nil then
GTempJoinedConnectorsList.Clear
else
GTempJoinedConnectorsList := TList.Create;
if GTempJoinedLinesConnectors = nil then
GTempJoinedLinesConnectors := TList.Create
else
GTempJoinedLinesConnectors.Clear;
if Self.ConnectorType = ct_Clear then
if JoinedOrthoLinesList.Count > 0 then
GTempJoinedOrtholinesList.Assign(JoinedOrthoLinesList, LaCopy);
if Self.ConnectorType = ct_NB then
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
JoinedCon := TConnectorObject(JoinedConnectorsList[i]);
if GTempJoinedConnectorsList.IndexOf(JoinedCon) = -1 then
GTempJoinedConnectorsList.Add(JoinedCon);
for j := 0 to JoinedCon.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedCon.JoinedOrtholinesList[j]);
if GTempJoinedOrtholinesList.IndexOf(JoinedLine) = -1 then
GTempJoinedOrtholinesList.Add(JoinedLine);
if JoinedLine.JoinConnector2.ID = JoinedCon.ID then
LineConn := TConnectorObject(JoinedLine.JoinConnector1)
else
LineConn := TConnectorObject(JoinedLine.JoinConnector2);
{if LineConn.JoinedConnectorsList.Count > 0 then
LineConn := TConnectorObject(LineConn.JoinedConnectorsList[0]);}
if GTempJoinedLinesConnectors.IndexOf(LineConn) = -1 then
GTempJoinedLinesConnectors.Add(LineConn);
end;
end;
end
//
// ñîõðàíèòü êîíåêòîðû - íà÷àëüíûå òî÷êè ïðèñîåäèíåííûõ ëèíèé
// Tolik 25/03/2016 --
// GTempJoinedLinesConnectors.Clear;
{for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector1);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector2);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
end;}
else
begin
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector1);
if JoinedCon.Id = Self.Id then
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector2);
{if JoinedCon.JoinedConnectorsList.Count > 0 then
JoinedCon := TConnectorObject(JoinedCon.JoinedConnectorsList[0]);}
if GTempJoinedLinesConnectors.IndexOf(JoinedCon) = -1 then
GTempJoinedLinesConnectors.Add(JoinedCon);
end;
end;
// Tolik 13/04/2018 --
vLine1 := Nil;
vLine2 := Nil;
if Self.ConnectorType = ct_Clear then
begin
for i := 0 to JoinedOrthoLinesList.Count - 1 do
begin
if TOrthoLine(JoinedOrthoLinesList[i]).FIsVertical then
begin
if vLine1 = nil then
vLine1 := TOrthoLine(JoinedOrthoLinesList[i])
else
begin
vLine2 := TOrthoLine(JoinedOrthoLinesList[i]);
break;
end;
end;
end;
end
else
if Self.ConnectorType = ct_Nb then
begin
for i := 0 to JoinedconnectorsList.Count - 1 do
begin
Joinedcon := TConnectorObject(JoinedConnectorsList[i]);
for j := 0 to Joinedcon.JoinedOrthoLinesList.Count - 1 do
begin
if TOrthoLine(Joinedcon.JoinedOrthoLinesList[j]).FIsVertical then
begin
if vLine1 = nil then
vLine1 := TOrthoLine(Joinedcon.JoinedOrthoLinesList[j])
else
begin
vLine2 := TOrthoLine(Joinedcon.JoinedOrthoLinesList[j]);
break;
end;
end;
end;
if vLine2 <> nil then
break;
end;
end;
if FJoinedOrthoLinesByVerticals = nil then
FJoinedOrthoLinesByVerticals := TList.Create
else
FJoinedOrthoLinesByVerticals.Clear;
if Self.ConnectorType = ct_Nb then
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
JoinedCon := TConnectorObject(JoinedConnectorsList[i]);
for j := 0 to JoinedCon.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedCon.JoinedOrthoLinesList[j]);
if not JoinedLine.FisRaiseUpDown then
if not JoinedLine.FisVertical then
begin
//if GTempJoinedOrtholinesList.IndexOf(JoinedLine) = -1 then
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
FJoinedOrthoLinesByVerticals.Add(JoinedLine);
LineConn := TConnectorObject(JoinedLine.JoinConnector1);
if LineConn.Id = JoinedCon.Id then
LineConn := TConnectorObject(JoinedLine.JoinConnector2);
if FModConnsOtherSides.IndexOf(LineConn) = -1 then
FModConnsOtherSides.Add(LineConn);
if LineConn.JoinedConnectorsList.Count > 0 then
LineConn := TConnectorObject(LineConn.JoinedConnectorsList[0]);
end;
end;
end;
end;
end
else
if Self.ConnectorType = ct_Clear then
begin
for i := 0 to JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedOrthoLinesList[i]);
if not JoinedLine.FisRaiseUpDown then
if not JoinedLine.FisVertical then
// if GTempJoinedOrtholinesList.IndexOf(JoinedLine) = -1 then
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
FJoinedOrthoLinesByVerticals.Add(JoinedLine);
if JoinedLine.JoinConnector1.ID = Self.ID then
JoinedCon := TConnectorObject(JoinedLine.JoinConnector2)
else
JoinedCon := TConnectorObject(JoinedLine.JoinConnector1);
if FModConnsOtherSides.IndexOf(JoinedCon) = -1 then
FModConnsOtherSides.Add(JoinedCon);
if JoinedCon.JoinedConnectorsList.Count > 0 then
JoinedCon := TConnectorObject(JoinedCon.JoinedConnectorsList[0]);
end;
end;
end;
JoinedCon := nil;
if vLine1 <> nil then
begin
PassedList := TList.Create;
PassedList.Add(vLine1);
if self.ConnectorType = ct_Clear then
begin
if vLine1.JoinConnector1.ID = self.Id then
Joinedcon := TConnectorObject(vLine1.JoinConnector2)
else
if vLine1.JoinConnector2.ID = self.Id then
Joinedcon := TConnectorObject(vLine1.JoinConnector1);
end
else
if Self.ConnectorType = ct_Nb then
begin
if JoinedConnectorsList.IndexOf(TConnectorObject(vLine1.JoinConnector1)) = -1 then
Joinedcon := TConnectorObject(vLine1.JoinConnector1)
else
if JoinedConnectorsList.IndexOf(TConnectorObject(vLine1.JoinConnector2)) = -1 then
JoinedCon := TConnectorObject(vLine1.JoinConnector2)
end;
if JoinedCon <> nil then
begin
if JoinedCon.JoinedconnectorsList.Count > 0 then
JoinedCon := TConnectorObject(JoinedCon.JoinedConnectorsList[0]);
CheckAddJoinedLinesByVerticals(JoinedCon);
end;
if vLine2 <> nil then
begin
Joinedcon := Nil;
PassedList.Add(vLine2);
if self.ConnectorType = ct_Clear then
begin
if vLine2.JoinConnector1.ID = self.Id then
Joinedcon := TConnectorObject(vLine2.JoinConnector2)
else
if vLine2.JoinConnector2.ID = self.Id then
Joinedcon := TConnectorObject(vLine2.JoinConnector1);
end
else
if Self.ConnectorType = ct_Nb then
begin
if JoinedConnectorsList.IndexOf(TConnectorObject(vLine2.JoinConnector1)) = -1 then
Joinedcon := TConnectorObject(vLine2.JoinConnector1)
else
if JoinedConnectorsList.IndexOf(TConnectorObject(vLine2.JoinConnector2)) = -1 then
Joinedcon := TConnectorObject(vLine2.JoinConnector2)
end;
if JoinedCon <> nil then
begin
if JoinedCon.JoinedconnectorsList.Count > 0 then
JoinedCon := TconnectorObject(JoinedCon.JoinedConnectorsList[0]);
CheckAddJoinedLinesByVerticals(JoinedCon);
end;
end;
PassedList.free;
end;
//
// Tolik 30/03/2018
{ for i := 0 to FModConnsOtherSides.Count - 1 do
begin
if GTempJoinedLinesConnectors.IndexOf(TConnectorObject(FModConnsOtherSides[i])) = -1 then
GTempJoinedLinesConnectors.Add(TConnectorObject(FModConnsOtherSides[i]));
end;}
//
// óáðàòü âûäåëåíèå
if JoinedConnectorslist.Count > 0 then
begin
for i := 0 to JoinedConnectorslist.Count - 1 do
if TConnectorObject(JoinedConnectorslist[i]).Selected then
TConnectorObject(JoinedConnectorslist[i]).Deselect;
end;
if (DrawFigure <> nil) And DrawFigure.Selected then
DrawFigure.Deselect;
Result := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], 0, dsTrace, nil);
TConnectorObject(REsult).FIsApproach := FIsApproach;
TConnectorObject(REsult).FHouse := FHouse;
TConnectorObject(REsult).rMode := rMode;
if FIsApproach then
begin
appdeltax := 0;
appdeltay := 0;
fMoveByApproach := True;
end;
GTraceNotMove := True;
GNormalNotMove := True;
GAddDeltaX := 0;
GAddDeltaY := 0;
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
if GrpSizeX < 1 then
begin
//TConnectorObject(result).GrpSizeX := GrpSizeX + 3;
//TConnectorObject(result).GrpSizeY := GrpSizeY + 3;
{BUG_2015_04_14_1}
if (GCadForm.PCad.ZoomScale <> 0) then
begin
TConnectorObject(result).GrpSizeX := GrpSizeX + 3 / (GCadForm.PCad.ZoomScale / 100);
TConnectorObject(result).GrpSizeY := GrpSizeY + 3 / (GCadForm.PCad.ZoomScale / 100);
end
else
begin
TConnectorObject(result).GrpSizeX := GrpSizeX + 3;
TConnectorObject(result).GrpSizeY := GrpSizeY + 3;
end;
{}
//TConnectorObject(result).GrpSizeX := GrpSizeX + 3 * Self.FDrawFigurePercent / 100;
//TConnectorObject(result).GrpSizeY := GrpSizeY + 3 * Self.FDrawFigurePercent / 100;
end
else
begin
TConnectorObject(result).GrpSizeX := GrpSizeX;
TConnectorObject(result).GrpSizeY := GrpSizeY;
//TConnectorObject(result).GrpSizeX := GrpSizeX * Self.FDrawFigurePercent / 100;
//TConnectorObject(result).GrpSizeY := GrpSizeY * Self.FDrawFigurePercent / 100;
end;
TConnectorObject(result).FDrawFigure := DrawFigure;
TConnectorObject(result).FDrawFigureMoved := True;
if EQDP(Self.CenterPoint, DrawFigure.CenterPoint) then
TConnectorObject(result).FDrawFigureMoved := False;
TConnectorObject(result).FDrawFigurePercent := TConnectorObject(self).FDrawFigurePercent;
TConnectorObject(result).FConnectorType := ConnectorType;
GIsConnMoved := False;
GBeforeDragConnectorPoints := ActualPoints[1];
// DrawFigure ActualPoints
if (DrawFigure <> nil) and (DrawFigure.InFigures.Count > 0) then
begin
InFigure := TFigure(DrawFigure.InFigures[0]);
GTempDrawFigureAP[0] := InFigure.ap1;
GTempDrawFigureAP[1] := InFigure.ap2;
GTempDrawFigureAP[2] := InFigure.ap3;
GTempDrawFigureAP[3] := InFigure.ap4;
end;
GLastConnector := Self;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateModification', E.Message);
end;
end;
// Ñðàáàòûâàåò êîãäà êëèêàåøü íà îáüåêò ñ öåëüþ äàëüíåéøåãî åãî ïåðåìåùåíèÿ
(*
function TConnectorObject.CreateModification: TFigure;
var
i: integer;
JoinedCon: TConnectorObject;
ClickedX, ClickedY: Double;
MovedP: TPoint;
MovedZ, MovedX, MovedY: Double;
SetCur: TPoint;
InFigure: TFigure;
begin
try
Result := nil;
FModPosOffset.x := 0;
FModPosOffset.y := 0;
if FModConnsOtherSides <> nil then
FreeAndNil(FModConnsOtherSides);
FModConnsOtherSides := GetConnectorsOtherSides(Self);
MovedZ := 0;
Select;
if not FIsApproach then
begin
MovedX := ActualPoints[1].x + 0.5 / (GCadForm.PCad.ZoomScale / 100);
MovedY := ActualPoints[1].y + 0.5 / (GCadForm.PCad.ZoomScale / 100);
GCadForm.PCad.ConvertXY(MovedX, MovedY, MovedZ);
SetCur.X := round(MovedX);
SetCur.Y := round(MovedY);
ClientToScreen(GCadForm.PCad.Handle, SetCur);
SetCursorPos(SetCur.X, SetCur.Y);
end;
// ñîõðàíèòü ëèñò ïîäêëþ÷åííûõ ôèãóð
GTempJoinedOrtholinesList := JoinedOrtholinesList;
GTempJoinedConnectorsList := JoinedConnectorsList;
// ñîõðàíèòü êîíåêòîðû - íà÷àëüíûå òî÷êè ïðèñîåäèíåííûõ ëèíèé
// Tolik 25/03/2016 --
// GTempJoinedLinesConnectors.Clear;
if GTempJoinedLinesConnectors <> nil then
GTempJoinedLinesConnectors.Clear
else
GTempJoinedLinesConnectors := TList.Create;
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector1);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector2);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
end;
// Tolik 30/03/2018
{ for i := 0 to FModConnsOtherSides.Count - 1 do
begin
if GTempJoinedLinesConnectors.IndexOf(TConnectorObject(FModConnsOtherSides[i])) = -1 then
GTempJoinedLinesConnectors.Add(TConnectorObject(FModConnsOtherSides[i]));
end;}
//
// óáðàòü âûäåëåíèå
if JoinedConnectorslist.Count > 0 then
begin
for i := 0 to JoinedConnectorslist.Count - 1 do
if TConnectorObject(JoinedConnectorslist[i]).Selected then
TConnectorObject(JoinedConnectorslist[i]).Deselect;
end;
if (DrawFigure <> nil) And DrawFigure.Selected then
DrawFigure.Deselect;
Result := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], 0, dsTrace, nil);
TConnectorObject(REsult).FIsApproach := FIsApproach;
TConnectorObject(REsult).FHouse := FHouse;
TConnectorObject(REsult).rMode := rMode;
if FIsApproach then
begin
appdeltax := 0;
appdeltay := 0;
fMoveByApproach := True;
end;
GTraceNotMove := True;
GNormalNotMove := True;
GAddDeltaX := 0;
GAddDeltaY := 0;
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
if GrpSizeX < 1 then
begin
//TConnectorObject(result).GrpSizeX := GrpSizeX + 3;
//TConnectorObject(result).GrpSizeY := GrpSizeY + 3;
{BUG_2015_04_14_1}
if (GCadForm.PCad.ZoomScale <> 0) then
begin
TConnectorObject(result).GrpSizeX := GrpSizeX + 3 / (GCadForm.PCad.ZoomScale / 100);
TConnectorObject(result).GrpSizeY := GrpSizeY + 3 / (GCadForm.PCad.ZoomScale / 100);
end
else
begin
TConnectorObject(result).GrpSizeX := GrpSizeX + 3;
TConnectorObject(result).GrpSizeY := GrpSizeY + 3;
end;
{}
//TConnectorObject(result).GrpSizeX := GrpSizeX + 3 * Self.FDrawFigurePercent / 100;
//TConnectorObject(result).GrpSizeY := GrpSizeY + 3 * Self.FDrawFigurePercent / 100;
end
else
begin
TConnectorObject(result).GrpSizeX := GrpSizeX;
TConnectorObject(result).GrpSizeY := GrpSizeY;
//TConnectorObject(result).GrpSizeX := GrpSizeX * Self.FDrawFigurePercent / 100;
//TConnectorObject(result).GrpSizeY := GrpSizeY * Self.FDrawFigurePercent / 100;
end;
TConnectorObject(result).FDrawFigure := DrawFigure;
TConnectorObject(result).FDrawFigureMoved := True;
if EQDP(Self.CenterPoint, DrawFigure.CenterPoint) then
TConnectorObject(result).FDrawFigureMoved := False;
TConnectorObject(result).FDrawFigurePercent := TConnectorObject(self).FDrawFigurePercent;
TConnectorObject(result).FConnectorType := ConnectorType;
GIsConnMoved := False;
GBeforeDragConnectorPoints := ActualPoints[1];
// DrawFigure ActualPoints
if (DrawFigure <> nil) and (DrawFigure.InFigures.Count > 0) then
begin
InFigure := TFigure(DrawFigure.InFigures[0]);
GTempDrawFigureAP[0] := InFigure.ap1;
GTempDrawFigureAP[1] := InFigure.ap2;
GTempDrawFigureAP[2] := InFigure.ap3;
GTempDrawFigureAP[3] := InFigure.ap4;
end;
GLastConnector := Self;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateModification', E.Message);
end;
end;
*)
function TConnectorObject.CreateRotModification: TFigure;
var
i: integer;
JoinedCon: TConnectorObject;
ClickedX, ClickedY: Double;
MovedP: TPoint;
MovedZ, MovedX, MovedY: Double;
SetCur: TPoint;
InFigure: TFigure;
begin
try
Result := nil;
MovedZ := 0;
{
Select;
if not FIsApproach then
begin
MovedX := ActualPoints[1].x + 0.5 / (GCadForm.PCad.ZoomScale / 100);
MovedY := ActualPoints[1].y + 0.5 / (GCadForm.PCad.ZoomScale / 100);
GCadForm.PCad.ConvertXY(MovedX, MovedY, MovedZ);
SetCur.X := round(MovedX);
SetCur.Y := round(MovedY);
//ClientToScreen(GCadForm.PCad.Handle, SetCur);
//SetCursorPos(SetCur.X, SetCur.Y);
end;
// ñîõðàíèòü ëèñò ïîäêëþ÷åííûõ ôèãóð
GTempJoinedOrtholinesList := JoinedOrtholinesList;
GTempJoinedConnectorsList := JoinedConnectorsList;
// ñîõðàíèòü êîíåêòîðû - íà÷àëüíûå òî÷êè ïðèñîåäèíåííûõ ëèíèé
GTempJoinedLinesConnectors.Clear;
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector1);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
JoinedCon := TConnectorObject(TOrthoLine(JoinedOrtholinesList[i]).JoinConnector2);
if JoinedCon <> Self then
GTempJoinedLinesConnectors.Add(JoinedCon);
end;
// óáðàòü âûäåëåíèå
if JoinedConnectorslist.Count > 0 then
begin
for i := 0 to JoinedConnectorslist.Count - 1 do
if TConnectorObject(JoinedConnectorslist[i]).Selected then
TConnectorObject(JoinedConnectorslist[i]).Deselect;
end;}
if (DrawFigure <> nil) And DrawFigure.Selected then
DrawFigure.Deselect;
Result := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], 0, dsTrace, nil);
TConnectorObject(REsult).FIsRotating := true;
TConnectorObject(REsult).FIsApproach := FIsApproach;
TConnectorObject(REsult).FHouse := FHouse;
TConnectorObject(REsult).rMode := rMode;
if FIsApproach then
begin
appdeltax := 0;
appdeltay := 0;
fMoveByApproach := True;
end;
GTraceNotMove := True;
GNormalNotMove := True;
GAddDeltaX := 0;
GAddDeltaY := 0;
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
if GrpSizeX < 1 then
begin
TConnectorObject(result).GrpSizeX := GrpSizeX + 3;
TConnectorObject(result).GrpSizeY := GrpSizeY + 3;
end
else
begin
TConnectorObject(result).GrpSizeX := GrpSizeX;
TConnectorObject(result).GrpSizeY := GrpSizeY;
end;
TConnectorObject(result).FDrawFigure := TFigureGrpMod(DrawFigure.CreateModification);
TConnectorObject(result).FConnectorType := ConnectorType;
GIsConnMoved := False;
{//11.03.2012
GBeforeDragConnectorPoints := ActualPoints[1];
// DrawFigure ActualPoints
if (DrawFigure <> nil) and (DrawFigure.InFigures.Count > 0) then
begin
InFigure := TFigure(DrawFigure.InFigures[0]);
GTempDrawFigureAP[0] := InFigure.ap1;
GTempDrawFigureAP[1] := InFigure.ap2;
GTempDrawFigureAP[2] := InFigure.ap3;
GTempDrawFigureAP[3] := InFigure.ap4;
end;
GLastConnector := Self;}
except
on E: Exception do AddExceptionToLogExt(ClassName, 'CreateRotModification', E.Message);
end;
end;
// Òðåéñ âî âðåìÿ ïåðåìåùåíèÿ
function TConnectorObject.TraceModification(CadControl: Pointer; mp: TModPoint; TraceFigure:
TFigure; x, y: Double; Shift: TShiftState): Boolean;
var
i: integer;
deltax, deltay: double;
fulldeltax, fulldeltay: double;
pos: TDoublePoint;
p1_in: boolean;
p2_in: boolean;
//23.07.2013
PtMoved: Boolean;
Conn1, Conn2: TConnectorObject;
op1, op2, CurrPt: TDoublePoint;
op: PDoublePoint;
adim75: double;
aZoomScaleCad: double;
begin
try
if FIsApproach then
begin
{
If MP.SeqNbr in [3,4,5] then
begin
p1_in := fHouse.IsPointInRegion(x,DrawFigure.ap2.y);
p2_in := fHouse.IsPointInRegion(x,DrawFigure.ap3.y);
if p1_in and p2_in then
begin
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[2] := DoublePoint(x, DrawFigure.ap2.y);
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[3] := DoublePoint(x, DrawFigure.ap3.y);
end;
end
else
if MP.SeqNbr in [1,8,7] then
begin
p1_in := fHouse.IsPointInRegion(x,DrawFigure.ap1.y);
p2_in := fHouse.IsPointInRegion(x,DrawFigure.ap4.y);
if p1_in and p2_in then
begin
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[1] := DoublePoint(x,DrawFigure.ap1.y);
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[4] := DoublePoint(x,DrawFigure.ap4.y);
end;
end;
If mp.SeqNbr in [1,2,3] then
begin
p1_in := fHouse.IsPointInRegion(DrawFigure.ap1.x,y);
p2_in := fHouse.IsPointInRegion(DrawFigure.ap2.x,y);
if p1_in and p2_in then
begin
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[1] := DoublePoint(DrawFigure.ap1.x,y);
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[2] := DoublePoint(DrawFigure.ap2.x,y);
end;
end
else
if mp.SeqNbr in [5,6,7] then
begin
p1_in := fHouse.IsPointInRegion(DrawFigure.ap3.x,y);
p2_in := fHouse.IsPointInRegion(DrawFigure.ap4.x,y);
if p1_in and p2_in then
begin
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[3] := DoublePoint(DrawFigure.ap3.x,y);
TConnectorObject(TraceFigure).DrawFigure.ActualPoints[4] := DoublePoint(DrawFigure.ap4.x,y);
end;
end;
}
DrawFigure.TraceModification(CadControl, mp, DrawFigure, x, y, Shift);
Result := true;
exit;
end;
Result := false;
deltax := x - TraceFigure.ActualPoints[1].x;
deltay := y - TraceFigure.ActualPoints[1].y;
adim75 := 7.5;
aZoomScaleCad := 0;
if (GCadForm.PCad <> nil) then
aZoomScaleCad := GCadForm.PCad.ZoomScale;
if aZoomScaleCad > 0 then
begin
adim75 := adim75 / (aZoomScaleCad / 100);
end;
if not GMoveByArrow then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
// ÎÐÒÎÃÎÍÀËÜÍÎÅ ÏÅÐÅÌÅÙÅÍÈÅ
if (ssShift in GGlobalShiftState) then
begin
fulldeltax := x - GBeforeDragConnectorPoints.x;
fulldeltay := y - GBeforeDragConnectorPoints.y;
if abs(fulldeltax) >= abs(fulldeltay) then
begin
TraceFigure.ActualPoints[1] := GBeforeDragConnectorPoints;
x := TraceFigure.ActualPoints[1].x + fulldeltax;
y := TraceFigure.ActualPoints[1].y;
end
else
if abs(fulldeltax) < abs(fulldeltay) then
begin
TraceFigure.ActualPoints[1] := GBeforeDragConnectorPoints;
x := TraceFigure.ActualPoints[1].x;
y := TraceFigure.ActualPoints[1].y + fulldeltay;
end;
end
else
// C Ó×ÅÒÎÌ ÓÃËÀ
if (not GCadForm.PCad.SnapToGrids)and((not GCadForm.PCad.SnapToGuides)or(GCadForm.PCad.Guides.count = 0)) then
begin
//23.07.2013
FModPosOffset.x := 0;
FModPosOffset.y := 0;
PtMoved := false;
if FModConnsOtherSides.Count = 1 then
begin
Conn1 := TConnectorObject(FModConnsOtherSides[0]);
op1 := Conn1.ActualPoints[1];
if Abs(op1.x - x) <= adim75 then
begin
FModPosOffset.x := op1.x - x;
x := op1.x;
PtMoved := true;
end;
if Abs(op1.y - y) <= adim75 then
begin
FModPosOffset.y := op1.y - y;
y := op1.y;
PtMoved := true;
end;
end
else if FModConnsOtherSides.Count = 2 then
begin
Conn1 := TConnectorObject(FModConnsOtherSides[0]);
Conn2 := TConnectorObject(FModConnsOtherSides[1]);
op1 := DoublePoint(Conn1.ActualPoints[1].x, Conn2.ActualPoints[1].y);
op2 := DoublePoint(Conn2.ActualPoints[1].x, Conn1.ActualPoints[1].y);
op := nil;
CurrPt := DoublePoint(x,y);
if GetLineLength(op1, CurrPt) <= adim75 then
op := @op1
else if GetLineLength(op2, CurrPt) <= adim75 then
op := @op2;
if op <> nil then
begin
FModPosOffset.x := op^.x - x;
FModPosOffset.y := op^.y - y;
x := op^.x;
y := op^.y;
PtMoved := true;
end
end;
if Not PtMoved then
begin
pos := GetPosWithAngle(GCurrMousePos.x, GCurrMousePos.y, GCadForm.FDefaultTraceStepRotate);
x := pos.x;
y := pos.y;
end;
end;
// ÏÎÊÀÇÛÂÀÒÜ SHADOW
if GGlobalShiftState = [] then
if not CheckTrunkObject(GLastConnector) then
SetConnectedLinesDrawShadow(x, y);
end;
end;
if (deltax <> 0) or (deltay <> 0) then
GIsConnMoved := True;
if GFigureSnap = nil then
GDraggedFigureZOrder := ActualZOrder[1]
else
begin
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
GDraggedFigureZOrder := TConnectorObject(GFigureSnap).ActualZOrder[1]
else if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
GDraggedFigureZOrder := TOrthoLine(GFigureSnap).ActualZOrder[1];
end;
TraceFigure.ActualPoints[1] := DoublePoint(x, y);
// ïîèñê îáúåêòîâ äëÿ ïðèâÿçêè â ðåæèìå òðåéñà çà ìîäïîèíò
if not (ssAlt in GGlobalShiftState) then
begin
if not GIsConnMoved then
GFigureSnap := Nil
else
//============ther test=====================
begin
if FindSnapTimer = nil then
CreateSnapTimer(False);
if FindSnapTimer <> nil then
begin
FindSnapTimer.Enabled:=false;
FindSnapTimer.Enabled:=true;
FindSnapTimer.tag := 1;
FDeltaPoint.x:=TraceFigure.ActualPoints[1].x;
FDeltaPoint.y:=TraceFigure.ActualPoints[1].y;
end;
end;
// GFigureSnap := TConnectorObject(TraceFigure).FindSnapObject(TraceFigure.ActualPoints[1].x, TraceFigure.ActualPoints[1].y); ther test
{ ther test
if (GPrevFigureSnap <> nil) AND (GPrevFigureSnap <> GFigureSnap) then
DrawSnapFigures(GPrevFigureSnap, False);
if GFigureSnap <> nil then
begin
DrawSnapFigures(GFigureSnap, True);
GPrevFigureSnap := GFigureSnap;
end;
}
end;
Result := true;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.TraceModification', E.Message);
end;
end;
// Ïîcëå ïåðåìåùåíèÿ
function TConnectorObject.EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure:
TFigure; x, y: Double; Shift: TShiftState): Boolean;
var
i, j, k: integer;
SaveFigureSnap: TFigure;
CurrPointObject: TConnectorObject;
CheckedBreak: Boolean;
JoinedConn: TConnectorObject;
JoinedLine: TOrthoLine;
fulldeltax, fulldeltay: double;
pos: TDoublePoint;
begin
try
if FindSnapTimer <> nil then
FindSnapTimer.Enabled := false;
Result := false;
if not GMoveByArrow then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
// ÎÐÒÎÃÎÍÀËÜÍÎÅ ÏÅÐÅÌÅÙÅÍÈÅ
if (ssShift in GGlobalShiftState) then
begin
fulldeltax := x - GBeforeDragConnectorPoints.x;
fulldeltay := y - GBeforeDragConnectorPoints.y;
if abs(fulldeltax) >= abs(fulldeltay) then
begin
y := GBeforeDragConnectorPoints.y;
end
else
if abs(fulldeltax) < abs(fulldeltay) then
begin
x := GBeforeDragConnectorPoints.x;
end;
end
else
// C Ó×ÅÒÎÌ ÓÃËÀ
if (not GCadForm.PCad.SnapToGrids)and((not GCadForm.PCad.SnapToGuides)or(GCadForm.PCad.Guides.count = 0)) then
begin
//23.07.2013
if (FModPosOffset.x <> 0) or (FModPosOffset.y <> 0) then
begin
x := x + FModPosOffset.x;
y := y + FModPosOffset.y;
end
else
begin
pos := GetPosWithAngle(GCurrMousePos.x, GCurrMousePos.y, GCadForm.FDefaultTraceStepRotate);
x := pos.x;
y := pos.y;
end;
end;
end;
end;
GCadForm.PCad.DeselectAll(2);
// ÄÓÁËÈÊÀÒ !!!
if ssCtrl in GGlobalShiftState then
if (ConnectorType <> ct_Clear) then
if GCadForm.PCad.SelectedCount = 0 then
begin
if FTrunkName = ctsnCrossATS then
begin
CreateCrossATSDuplicate(x, y);
end
else
if FTrunkName = ctsnDistributionCabinet then
begin
CreateDistribCabDuplicate(x, y);
end
else
begin
CreateDuplicate(x, y);
SkipConnectedLinesDrawShadow;
end;
Exit;
end;
if GCadForm.FNoMoveConnectedObjects then
if (ConnectorType <> ct_clear) and (JoinedConnectorsList.Count > 0) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes10);
Exit;
end;
if (GCadForm.PCad.SelectedCount > 1) and (GCadForm.FNoMoveConnectedObjects) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes10);
Exit;
end;
{**************************************************************************}
SaveFigureSnap := GFigureSnap;
//Tolik 13/09/2016 --
// òàê íåïðàâèëüíî, ïîòîìó ÷òî ïðîñòî îòîðâåò ïóñòîé êîííåêòîð îò ïîèíòà,
// åñëè åñòü ïîèíò, ïîýòîìó òóò íåìíîæêî èçìåíèì
Move(x - ActualPoints[1].x, y - ActualPoints[1].y);
{ if ((ConnectorType = ct_Nb) or ((connectorType = ct_Clear) and (JoinedConnectorsList.Count = 0))) then
Move(x - ActualPoints[1].x, y - ActualPoints[1].y)
else
if (ConnectorType = ct_Clear) and (JoinedConnectorsList.Count > 0) then
TConnectorObject(JoinedConnectorsList[0]).Move(x - TConnectorObject(JoinedConnectorsList[0]).ActualPoints[1].x,
y - TConnectorObject(JoinedConnectorsList[0]).ActualPoints[1].y);
}//
if (not GCadForm.PCad.SnapToGrids)and(not GCadForm.PCad.SnapToGuides) then
begin
if SaveFigureSnap = nil then
if not Self.Deleted then //Òîëèê -- 30/03/2018 -- ïîñëå ìóâà â ðåçóëüòàòå ñíàïà êîííåêòîð ìîæåò áûòü óæå óäàëåí!!!
ActualPoints[1] := DoublePoint(x, y);
end;
Result := true;
//Tolik 05/05/2017 --
// if Assigned(TraceFigure) and (not TraceFigure.Deleted) and (GCadForm.PCad.Figures.IndexOf(TraceFigure) <> -1) then
//
if TraceFigure <> nil then //Tolik 02/04/2018 -- íå ïðîâåðÿòü -- ¸áíåòñÿ íà îáúåêòå !!!
TraceFigure.Deselect;
// Tolik -- 30/03/2018 -- ïîñëå ìóâà â ðåçóëüòàòå ñíàïà êîííåêòîð ìîæåò áûòü óæå óäàëåí!!!
if not Self.Deleted then
begin
// îòîðâàòü êîíåêòîð åñëè îí çà ïðåäåëàìè îáüåêòà
if ConnectorType = ct_Clear then
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
CurrPointObject := TConnectorObject(JoinedConnectorsList[i]);
CheckedBreak := CheckByBreakConnector(Self, CurrPointObject);
if CheckedBreak then // îòîðâàòü êîíåêòîð
UnsnapConnectorFromPointObject(Self, CurrPointObject);
end;
end;
end;
// Tolik 16/04/2018 --
//GTempJoinedOrtholinesList := nil;
FreeAndNil(GTempJoinedOrtholinesList);
//GTempJoinedConnectorsList := nil;
FreeAndNil(GTempJoinedConnectorsList);
//
SkipConnectedLinesDrawShadow;
if not Deleted then // Tolik -- 30/03/2018 -- ïîñëå ìóâà â ðåçóëüòàòå ñíàïà êîííåêòîð ìîæåò áûòü óæå óäàëåí!!!
Select;
FreeAndNil(FModConnsOtherSides);
// Tolik 30/11/2015
TPowerCad(Self.Owner).ModPoint := nil;
//
except
on E: Exception do addExceptionToLogEx('TConnectorObject.EndModification', E.Message);
end;
end;
Function TConnectorObject.TraceRotate(CadControl: Pointer;mp:TModPoint;var TraceFigure:TFigure; x,y:Double;Shift: TShiftState):boolean;
var a1,a2,a: Double;
s: Integer;
CurrPos: TPoint;
begin
if mp.SeqNbr = 5 then
begin
TraceFigure.RotPoint := DoublePoint(x,y);
end
else
begin
a1 := GetRadOfLine(TraceFigure.rotPoint,DoublePoint(mp.CoordX ,mp.CoordY));
a2 := GetRadOfLine(TraceFigure.rotPoint,DoublePoint(x,y));
//Tolik -- 18/10/2017 --
//TraceFigure.Free;
FreeAndNil(TraceFigure);
//
//GetCursorPos(CurrPos);
TraceFigure := CreateRotModification; //TConnectorObject(Self).DrawFigure.CreateModification; //CreateRotModification;
//SetCursorPos(CurrPos.x, CurrPos.y);
TraceFigure.RotPoint := RotPoint;
a := a2-a1;
s := sign(a);
a := abs(a);
if abs(a - 0) < (pi/180)*5 then a := 0;
if abs(a - pi/2) < (pi/180)*5 then a := pi/2;
if abs(a - pi) < (pi/180)*5 then a := pi;
if abs(a - 3*(pi/2)) < (pi/180)*5 then a := 3*(pi/2);
if abs(a - 2*pi) < (pi/180)*5 then a := 2*pi;
//TraceFigure.Rotate(s*a,TraceFigure.RotPoint);
TConnectorObject(TraceFigure).RotateByParams(s*a,TraceFigure.RotPoint);
end;
end;
Function TConnectorObject.EndRotate(CadControl: Pointer;mp:TModPoint;TraceFigure:TFigure; x,y:Double;Shift: TShiftState):boolean;
var a1,a2,a: Double;
s: Integer;
begin
if mp.SeqNbr = 5 then
begin
RotPoint := TraceFigure.RotPoint;
end
else
begin
a1 := GetRadOfLine(rotPoint,DoublePoint(mp.CoordX ,mp.CoordY));
a2 := GetRadOfLine(rotPoint,DoublePoint(x,y));
a := a2-a1;
s := sign(a);
a := abs(a);
if abs(a - 0) < (pi/180)*5 then a := 0;
if abs(a - pi/2) < (pi/180)*5 then a := pi/2;
if abs(a - 3*(pi/2)) < (pi/180)*5 then a := 3*(pi/2);
if abs(a - pi) < (pi/180)*5 then a := pi;
if abs(a - 2*pi) < (pi/180)*5 then a := 2*pi;
//Rotate(s*a,RotPoint);
RotateByParams(s*a,TraceFigure.RotPoint);
end;
end;
procedure TConnectorObject.DrawSnapFigures(FFigure: TFigure; SetSnapStatus: Boolean);
// Tolik 26/02/2018 -
Function CheckCTNBWithTrace: Boolean;
var nb_Conn: TConnectorObject;
i: Integer;
begin
Result := False;
if Self.ConnectorType = ct_Clear then // Tolik -- 20/04/2018 --
exit;
NB_Conn := Nil;
if Self.ConnectorType = ct_NB then
Nb_Conn := Self
else
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
if TConnectorObject(JoinedConnectorsList[i]).ConnectorType = ct_NB then
begin
NB_Conn := TConnectorObject(JoinedConnectorsList[i]);
break;
end;
end;
end;
if NB_Conn <> nil then
begin
if CheckFigureByClassName(FFigure, cTConnectorObject) then
if TConnectorObject(FFigure).ConnectorType = ct_NB then
Result := True;
end;
end;
//
begin
try
if FFigure <> nil then
begin
// Tolik -- 26/02/2018 -- îòêëþ÷èòü ïîäñâåòêó îáúåêòîâ, íà êîòîðûå íàåçæàåò êîííåêòîð ïðè ïåðåäâèæåíèè
// ÅÑËÈ Ýòî ct_NB
if SetSnapStatus then
if CheckFigurebyClassName(Self, cTConnectorObject) then
if CheckCTNBWithTrace then
exit;
//
if CheckFigureByClassName(FFigure, cTOrthoLine) then
begin
TOrthoLine(FFigure).isSnap := SetSnapStatus;
// TOrthoLine(FFigure).Draw(GCadForm.PCad.DEngine, False); 08.11.2013 ñàìûêîâ
end
else if CheckFigureByClassName(FFigure, cTConnectorObject) then
begin
TConnectorObject(FFigure).isSnap := SetSnapStatus;
// TConnectorObject(FFigure).Draw(GCadForm.PCad.DEngine, False);08.11.2013 ñàìûêîâ
end
else if CheckFigureByClassName(FFigure, cTHouse) then
begin
THouse(FFigure).isSnap := SetSnapStatus;
THouse(FFigure).Draw(GCadForm.PCad.DEngine, False);
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.DrawSnapFigures', E.Message);
end;
end;
function TConnectorObject.FindSnapObject(aFindX, aFindY: Double): TFigure;
var
XMod, YMod: Double;
x, y: Double;
i, j: integer;
JoinedCon: TConnectorObject;
FindFigure: TFigure;
isCurrentReal: Boolean;
RaiseConn: TConnectorObject;
FindFiguresList: TList;
ResFinded: TList;
begin
//GCadForm.mProtocol.Lines.Add(DateTimeToStr(date+time)+': ====FindSnapObject====');//ther test
try
Result := Nil;
//{$IFOPT D+}
// OutputDebugString(PChar('TConnectorObject.FindSnapObject'));
//{$ENDIF}
if DrawStyle = dsTrace then //ÅÑËÈ ÎÁÜÅÊÒ ÏÅÐÅÌÅÙÀÅÒÑß
begin
ResFinded := TList.Create;
FindFigure := Nil;
FindFiguresList := TList.Create;
// Ïîèñê äðóãèõ îáüêòîâ ïðè íàâåäåíèè
XMod := aFindX;
YMod := aFindY;
// Ïîèñê îáüåêòà äëÿ ñîåäèíåíèÿ
try
CheckBySCSObjectsNear(XMod, YMod, ResFinded, self);
except
end;
for i := 0 to ResFinded.Count - 1 do
begin
FindFigure := ResFinded[i];
if FindFigure <> nil then
isCurrentReal := CanSnapToFindFigure(FindFigure, FindFiguresList)
else
isCurrentReal := False;
// Çàíåñòè â ñïèñîê, åñëè åñòü ÷òî çàíîñèòü
if isCurrentReal then
begin
if FindFiguresList.IndexOf(FindFigure) = -1 then
FindFiguresList.Add(FindFigure);
end;
FindFigure := Nil;
end;
FindFigure := Nil;
// ÎÏÐÅÄÅËÈÒÜ ÍÀÉÄÅÍÍÛÉ ÎÁÚÅÊÒ
// íàéòè êîííåêòîð íå ïóñòîé
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTConnectorObject) then
begin
if TConnectorObject(FindFiguresList[i]).ConnectorType <> ct_Clear then
FindFigure := TConnectorObject(FindFiguresList[i]);
end;
end;
// íàéòè êîííåêòîð ïóñòîé, åñëè íåò îáüåêòà
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTConnectorObject) then
begin
FindFigure := TConnectorObject(FindFiguresList[i]);
end;
end;
end;
// åñëè êîííåêòîð íå íàéäåí
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
// íàéòè õîòÿ áû îðòîëèíèþ
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTOrthoLine) then
FindFigure := TOrthoLine(FindFiguresList[i]);
end;
end;
// íàéòè Äîì
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTHouse) then
FindFigure := THouse(FindFiguresList[i]);
end;
end;
Result := FindFigure;
if ResFinded <> nil then
FreeAndNil(ResFinded);
if FindFiguresList <> nil then
FreeAndNil(FindFiguresList);
end; //ÊÎÍÅÖ ÖÈÊËÀ ÏÐÈ ÒÐÅÉÑÅ ÎÁÜÅÊÒÀ
except
on E: Exception do addExceptionToLogEx('TConnectorObject.FindSnapObject', E.Message);
end;
(* Result := Nil;
if DrawStyle = dsTrace then //ÅÑËÈ ÎÁÜÅÊÒ ÏÅÐÅÌÅÙÀÅÒÑß
begin
FindFigure := Nil;
FindFiguresList := TList.Create;
// Ïîèñê äðóãèõ îáüêòîâ ïðè íàâåäåíèè
XMod := aFindX;
YMod := aFindY;
// Ïîèñê îáüåêòà äëÿ ñîåäèíåíèÿ
x := -1;
//// ÖÈÊË ÏÎÈÑÊÀ ÎÁÜÅÊÒÎÂ
while x <= 1 do
begin
y := -1;
while y <= 1 do
begin
isCurrentReal := False;
try
FindFigure := CheckBySCSObjects(XMod + x, YMod + y, self);
except
FindFigure := nil;
end;
if FindFigure <> nil then
isCurrentReal := CanSnapToFindFigure(FindFigure, FindFiguresList)
else
isCurrentReal := False;
// Çàíåñòè â ñïèñîê, åñëè åñòü ÷òî çàíîñèòü
if isCurrentReal then
FindFiguresList.Add(FindFigure);
y := y + 0.5;
FindFigure := Nil;
end;
x := x + 0.5;
end;
FindFigure := Nil;
// ÎÏÐÅÄÅËÈÒÜ ÍÀÉÄÅÍÍÛÉ ÎÁÚÅÊÒ
// íàéòè êîííåêòîð íå ïóñòîé
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTConnectorObject) then
begin
if TConnectorObject(FindFiguresList[i]).ConnectorType <> ct_Clear then
FindFigure := TConnectorObject(FindFiguresList[i]);
end;
end;
// íàéòè êîííåêòîð ïóñòîé, åñëè íåò îáüåêòà
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTConnectorObject) then
begin
FindFigure := TConnectorObject(FindFiguresList[i]);
end;
end;
end;
// åñëè êîííåêòîð íå íàéäåí
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
// íàéòè õîòÿ áû îðòîëèíèþ
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTOrthoLine) then
FindFigure := TOrthoLine(FindFiguresList[i]);
end;
end;
// íàéòè Äîì
if FindFigure = Nil then
begin
for i := 0 to FindFiguresList.Count - 1 do
begin
if CheckFigureByClassName(TFigure(FindFiguresList[i]), cTHouse) then
FindFigure := THouse(FindFiguresList[i]);
end;
end;
Result := FindFigure;
if FindFiguresList <> nil then
FreeAndNil(FindFiguresList);
end; //ÊÎÍÅÖ ÖÈÊËÀ ÏÐÈ ÒÐÅÉÑÅ ÎÁÜÅÊÒÀ
except
on E: Exception do addExceptionToLogEx('TConnectorObject.FindSnapObject', E.Message);
end;
*)
end;
// -- Tolik 25/03/2016 -- ñòàðàÿ çàêîììåí÷åíà -- ñì. íèæå, à çäåñü íåìíîæêî ïåðåäåëàíî ñîâñåì
function TConnectorObject.CanSnapToFindFigure(aFindedFigure: TFigure; aFindedList: TList): Boolean;
var
i, j, k: integer;
JoinedPOConn: TConnectorObject;
JoinedConn: TConnectorObject;
NextJoinedConn: TConnectorObject;
JoinedLine: TOrthoLine;
NextJoinedLine: TOrthoLine;
RaiseConn: TConnectorObject;
begin
try
Result := True;
// ñàì îáúåêò
if aFindedFigure = Self then
Result := False;
// ÷òî ýòîãî îáüåêòà åùå íåò â ñïèñêå íàéäåííûõ îáüåêòîâ
// Tolik -- 16/03/2017 --
if not CheckNoFigureInList(aFindedFigure, aFindedList) then
Result := False;
{if (aFindedList <> nil) then
begin
if (aFindedList.Count = 0) then
Result := False
else
if not CheckNoFigureInList(aFindedFigure, aFindedList) then
Result := False;
end
else
Result := False;}
//
// íàéäåííûé îáúåêò âûäåëåí
if aFindedFigure.Selected then
Result := False;
// îáúåêò ÿâëÿåòñÿ âåðøèíîé ñ-ï
if FConnRaiseType <> crt_None then
Result := False;
// ñàì îáúåêò ïðèñîåäèíåí ê ÒÎ
if (ConnectorType = ct_Clear) and ((JoinedConnectorsList.Count > 0) or (GTempJoinedConnectorsList.Count > 0)) then
Result := False;
if CheckTrunkObject(Self) then
Result := False;
{**************************************************************************}
// Tolik -- 25/03/2016 --
if Result then
begin
//
// ÍÀÉÄÅÍ ÊÎÍÍÅÊÒÎÐ
if CheckFigureByClassName(aFindedFigure, cTConnectorObject) then
begin
if CheckTrunkObject(TConnectorObject(aFindedFigure)) then
Result := False;
// ïðè îòêëþ÷åííîì îòîáðàæåíèè ñ-ï
if not GCadForm.FShowRaise then
begin
if TConnectorObject(aFindedFigure).FConnRaiseType <> crt_None then
Result := False;
end;
// Îáà - ÒÎ
// if (ConnectorType <> ct_Clear) and (TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear) then
// Result := False;
// âåðøèíà ñ-ï è îáúåêò ê íåìó
if Self = TConnectorObject(aFindedFigure).FObjectFromRaise then
Result := False;
if Self = GetRaiseConn(TConnectorObject(aFindedFigure)) then
Result := False;
// ê ñîåäèíèòåëþ êîòîðûé ñâÿçóþùèé ñ ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
if TConnectorObject(aFindedFigure).JoinedConnectorsList.Count > 0 then
Result := False;
// SELF - ÑÎÅÄÈÍÈÒÅËÜ
// Tolik -- 25/03/2016 --
//if ConnectorType = ct_Clear then
if Result Then
begin
if ConnectorType = ct_Clear then
//
begin
// îñíîâàíèå ñ-ï íà îñíîâàíèå ñ-ï
// if (GetRaiseConn(Self) <> nil) and (GetRaiseConn(TConnectorObject(aFindedFigure)) <> nil) then
// Result := False;
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê òîé æå ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
if (aFindedFigure = TFigure(TOrthoLine(GTempJoinedOrtholinesList[i]).JoinConnector1)) or
(aFindedFigure = TFigure(TOrthoLine(GTempJoinedOrtholinesList[i]).JoinConnector2)) then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik 25/03/2016 --
if Result then
begin
// aFindedFigure - ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
if JoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(JoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
// Tolik 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik -- 25/03/2016 --
if not Result then break;
//
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
if JoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(JoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik -- 25/03/2016 --
if Not Result then break;
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê ëèíèè ÷åðåç îäíó (ïðè òðåéñå)
// if GTempJoinedOrtholinesList <> nil then
// begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
// Tolik 25/03/2016
// Result := False;
begin
Result := False;
break;
end;
//
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
// Tolik 25/03/2016
// Result := False;
begin
Result := False;
break;
end;
//
end;
end;
// Tolik -- 25/03/2016 --
if not Result then break;
//
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
// Tolik 25/03/2016 --
begin
Result := False;
break;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
begin
Result := False;
break;
end;
end;
end;
// Tolik -- 25/03/2016 --
if not Result then break;
//
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
// aFindedFigure - ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector1);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
// Tolik 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector2);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
// Tolik -- 25/03/2016 --
// Result := False
begin
Result := False;
break;
end;
end;
end;
end;
// Tolik 25/03/2016 --
if Not Result then break;
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector1);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
//Tolik 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector2);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
end;
end;
// Tolik -- 25/03/2016 --
if not Result then break;
end;
end;
end;
//end;
end;
end;
end;
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
//
// SELF - ÒÎ
if ConnectorType <> ct_Clear then
begin
// íà íàéäåííîì îáúåêòå - ì-ý ñ-ï
RaiseConn := GetRaiseConn(TConnectorObject(aFindedFigure));
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê òîé æå ëèíèè (ïðè òðåéñå)
if GTempJoinedConnectorsList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[j]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
if TConnectorObject(JoinedLine.JoinConnector1) = aFindedFigure then
// Tolik 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
if JoinedPOConn <> JoinedLine.JoinConnector2 then
if TConnectorObject(JoinedLine.JoinConnector2) = aFindedFigure then
//Tolik 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik -- 25/03/2016 --
if not Result then break;
end;
end;
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê ëèíèè ÷åðåç îäíó (ïðè òðåéñå)
//Tolik -- 25/03/2016 --
//if GTempJoinedConnectorsList <> nil then
if Result then
begin
//
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[j]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for k := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[k]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
// Tolik 25/03/2016 --
//Result := False;
begin
Result := False;
break;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
//Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik 25/03/2016 --
if not Result then break;
end;
if JoinedPOConn <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for k := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[k]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
//Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
//Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
end;
end;
// Tolik 25/03/2016 --
if not Result then break;
//
end;
end;
end;
end;
end;
end;
end
{**************************************************************************}
// ÍÀÉÄÅÍÀ ÎÐÒÎËÈÍÈß
else
// Tolik -- 25/03/2016 --
// if CheckFigureByClassName(aFindedFigure, cTOrthoLine then
if Result then
begin
//
if CheckFigureByClassName(aFindedFigure, cTOrthoLine) then
begin
if TOrthoLine(aFindedFigure).FConnectingLine then
Result := False;
// c-ï
if TOrthoLine(aFindedFigure).FIsRaiseUpDown then
Result := False
else
// ëèíèÿ íå ãîðèçîíòàëüíàÿ
if (TOrthoLine(aFindedFigure).ActualZOrder[1] <> TOrthoLine(aFindedFigure).ActualZOrder[2]) and
(not TOrthoLine(aFindedFigure).FIsVertical) then
beep; //Result := False; // ïîêà îòêëþ÷èì ýòó õðåíü - à òî ïîëó÷àåòñÿ ÷òî íà íàêëîííûå ìîæíî òîëüêî íîâûå öåïëÿòü...
// Tolik -- 25/03/2016 --
if Result then
begin
// SELF - ÑÎÅÄÈÍÈÒÅËÜ
if ConnectorType = ct_Clear then
begin
// ÷òî ýòî íå óæå ïðèâÿçàííûå ê íåìó ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
if aFindedFigure = TFigure(GTempJoinedOrtholinesList[i]) then
//Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
//
// ÷òî ýòî íå ëèíèÿ ïðèâÿçàííàÿ ÷åðåç 1 ëèíèþ (ïðè òðåéñå)
//Tolik
//if GTempJoinedOrtholinesList <> nil then
if Result then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
//Tolik -- 25/03/2016 --
// Resulty := False;
begin
Result := False;
break;
end;
end;
// Tolik 25/03/2016 --
if Not Result Then break;
//
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
// Tolik
// Result := False;
begin
Result := False;
break;
end;
//
end;
// Tolik 25/03/2016 --
if Not Result Then break;
//
end;
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
if ((TOrthoLine(aFindedFigure).ActualPoints[1].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[1].y = ActualPoints[1].y)) or
((TOrthoLine(aFindedFigure).ActualPoints[2].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[2].y = ActualPoints[1].y)) then
Result := False;
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
// SELF - ÒÎ
if ConnectorType <> ct_Clear then
begin
// ÷òî ýòî íå óæå ïðèâÿçàííûå ê íåìó ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if aFindedFigure = TFigure(JoinedConn.JoinedOrtholinesList[j]) then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
// Tolik -- 25/03/2016 --
if Not Result then break;
//
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
// ÷òî ýòî íå ëèíèÿ ïðèâÿçàííàÿ ÷åðåç 1 ëèíèþ (ïðè òðåéñå)
if GTempJoinedConnectorsList <> nil then
begin
for k := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[k]);
for i := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[i]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
end;
// Tolik -- 25/03/2016 --
if Not Result then break;
//
if JoinedPOConn <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
// Tolik -- 25/03/2016 --
// Result := False;
begin
Result := False;
break;
end;
//
end;
// Tolik -- 25/03/2016 --
if Not Result then break;
//
end;
// Toilk -- 25/03/2016 --
if Not Result then exit;
//
end;
end;
end;
// Tolik -- 25/03/2016 --
if Result then
begin
if ((TOrthoLine(aFindedFigure).ActualPoints[1].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[1].y = ActualPoints[1].y)) or
((TOrthoLine(aFindedFigure).ActualPoints[2].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[2].y = ActualPoints[1].y)) then
Result := False;
end;
end;
end;
end;
end;
end;
end;
{**************************************************************************}
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CanSnapToFindFigure', E.Message);
end;
end;
(*function TConnectorObject.CanSnapToFindFigure(aFindedFigure: TFigure; aFindedList: TList): Boolean;
var
i, j, k: integer;
JoinedPOConn: TConnectorObject;
JoinedConn: TConnectorObject;
NextJoinedConn: TConnectorObject;
JoinedLine: TOrthoLine;
NextJoinedLine: TOrthoLine;
RaiseConn: TConnectorObject;
begin
try
Result := True;
// ñàì îáúåêò
if aFindedFigure = Self then
Result := False;
// ÷òî ýòîãî îáüåêòà åùå íåò â ñïèñêå íàéäåííûõ îáüåêòîâ
if not CheckNoFigureInList(aFindedFigure, aFindedList) then
Result := False;
// íàéäåííûé îáúåêò âûäåëåí
if aFindedFigure.Selected then
Result := False;
// îáúåêò ÿâëÿåòñÿ âåðøèíîé ñ-ï
if FConnRaiseType <> crt_None then
Result := False;
// ñàì îáúåêò ïðèñîåäèíåí ê ÒÎ
if (ConnectorType = ct_Clear) and ((JoinedConnectorsList.Count > 0) or (GTempJoinedConnectorsList.Count > 0)) then
Result := False;
if CheckTrunkObject(Self) then
Result := False;
{**************************************************************************}
// ÍÀÉÄÅÍ ÊÎÍÍÅÊÒÎÐ
if CheckFigureByClassName(aFindedFigure, cTConnectorObject) then
begin
if CheckTrunkObject(TConnectorObject(aFindedFigure)) then
Result := False;
// ïðè îòêëþ÷åííîì îòîáðàæåíèè ñ-ï
if not GCadForm.FShowRaise then
begin
if TConnectorObject(aFindedFigure).FConnRaiseType <> crt_None then
Result := False;
end;
// Îáà - ÒÎ
// if (ConnectorType <> ct_Clear) and (TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear) then
// Result := False;
// âåðøèíà ñ-ï è îáúåêò ê íåìó
if Self = TConnectorObject(aFindedFigure).FObjectFromRaise then
Result := False;
if Self = GetRaiseConn(TConnectorObject(aFindedFigure)) then
Result := False;
// ê ñîåäèíèòåëþ êîòîðûé ñâÿçóþùèé ñ ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
if TConnectorObject(aFindedFigure).JoinedConnectorsList.Count > 0 then
Result := False;
// SELF - ÑÎÅÄÈÍÈÒÅËÜ
if ConnectorType = ct_Clear then
begin
// îñíîâàíèå ñ-ï íà îñíîâàíèå ñ-ï
// if (GetRaiseConn(Self) <> nil) and (GetRaiseConn(TConnectorObject(aFindedFigure)) <> nil) then
// Result := False;
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê òîé æå ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
if (aFindedFigure = TFigure(TOrthoLine(GTempJoinedOrtholinesList[i]).JoinConnector1)) or
(aFindedFigure = TFigure(TOrthoLine(GTempJoinedOrtholinesList[i]).JoinConnector2)) then
Result := False;
end;
// aFindedFigure - ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
if JoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(JoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
if JoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(JoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
end;
end;
end;
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê ëèíèè ÷åðåç îäíó (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
Result := False;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
Result := False;
end;
end;
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
Result := False;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
Result := False;
end;
end;
end;
end;
// aFindedFigure - ÒÎ
if TConnectorObject(aFindedFigure).ConnectorType <> ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector1);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector2);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
end;
end;
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector1);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
begin
NextJoinedConn := TConnectorObject(NextJoinedLine.JoinConnector2);
if NextJoinedConn.JoinedConnectorsList.Count > 0 then
if TConnectorObject(NextJoinedConn.JoinedConnectorsList[0]) = aFindedFigure then
Result := False;
end;
end;
end;
end;
end;
end;
end;
// SELF - ÒÎ
if ConnectorType <> ct_Clear then
begin
// íà íàéäåííîì îáúåêòå - ì-ý ñ-ï
RaiseConn := GetRaiseConn(TConnectorObject(aFindedFigure));
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê òîé æå ëèíèè (ïðè òðåéñå)
if GTempJoinedConnectorsList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[j]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
if TConnectorObject(JoinedLine.JoinConnector1) = aFindedFigure then
Result := False;
if JoinedPOConn <> JoinedLine.JoinConnector2 then
if TConnectorObject(JoinedLine.JoinConnector2) = aFindedFigure then
Result := False;
end;
end;
end;
end;
// ÷òî ýòî íå êîííåêòîðû ïðèñîåäèíåííûå ê ëèíèè ÷åðåç îäíó (ïðè òðåéñå)
if GTempJoinedConnectorsList <> nil then
begin
// aFindedFigure - ñîåäèíèòåëü
if TConnectorObject(aFindedFigure).ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[j]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for k := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[k]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
Result := False;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
Result := False;
end;
end;
if JoinedPOConn <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for k := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
NextJoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[k]);
if JoinedConn <> NextJoinedLine.JoinConnector1 then
if NextJoinedLine.JoinConnector1 = aFindedFigure then
Result := False;
if JoinedConn <> NextJoinedLine.JoinConnector2 then
if NextJoinedLine.JoinConnector2 = aFindedFigure then
Result := False;
end;
end;
end;
end;
end;
end;
end;
end
{**************************************************************************}
// ÍÀÉÄÅÍÀ ÎÐÒÎËÈÍÈß
else if CheckFigureByClassName(aFindedFigure, cTOrthoLine) then
begin
if TOrthoLine(aFindedFigure).FConnectingLine then
Result := False;
// c-ï
if TOrthoLine(aFindedFigure).FIsRaiseUpDown then
Result := False
else
// ëèíèÿ íå ãîðèçîíòàëüíàÿ
if (TOrthoLine(aFindedFigure).ActualZOrder[1] <> TOrthoLine(aFindedFigure).ActualZOrder[2]) and
(not TOrthoLine(aFindedFigure).FIsVertical) then
beep; //Result := False; // ïîêà îòêëþ÷èì ýòó õðåíü - à òî ïîëó÷àåòñÿ ÷òî íà íàêëîííûå ìîæíî òîëüêî íîâûå öåïëÿòü...
// SELF - ÑÎÅÄÈÍÈÒÅËÜ
if ConnectorType = ct_Clear then
begin
// ÷òî ýòî íå óæå ïðèâÿçàííûå ê íåìó ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
if aFindedFigure = TFigure(GTempJoinedOrtholinesList[i]) then
Result := False;
end;
// ÷òî ýòî íå ëèíèÿ ïðèâÿçàííàÿ ÷åðåç 1 ëèíèþ (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Self <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
Result := False;
end;
if Self <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
Result := False;
end;
end;
end;
if ((TOrthoLine(aFindedFigure).ActualPoints[1].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[1].y = ActualPoints[1].y)) or
((TOrthoLine(aFindedFigure).ActualPoints[2].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[2].y = ActualPoints[1].y)) then
Result := False;
end;
// SELF - ÒÎ
if ConnectorType <> ct_Clear then
begin
// ÷òî ýòî íå óæå ïðèâÿçàííûå ê íåìó ëèíèè (ïðè òðåéñå)
if GTempJoinedOrtholinesList <> nil then
begin
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if aFindedFigure = TFigure(JoinedConn.JoinedOrtholinesList[j]) then
Result := False;
end;
end;
// ÷òî ýòî íå ëèíèÿ ïðèâÿçàííàÿ ÷åðåç 1 ëèíèþ (ïðè òðåéñå)
if GTempJoinedConnectorsList <> nil then
begin
for k := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedPOConn := TConnectorObject(GTempJoinedConnectorsList[k]);
for i := 0 to JoinedPOConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedPOConn.JoinedOrtholinesList[i]);
if JoinedPOConn <> JoinedLine.JoinConnector1 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
Result := False;
end;
if JoinedPOConn <> JoinedLine.JoinConnector2 then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
if JoinedLine <> TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) then
if TOrthoLine(JoinedConn.JoinedOrtholinesList[j]) = aFindedFigure then
Result := False;
end;
end;
end;
end;
if ((TOrthoLine(aFindedFigure).ActualPoints[1].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[1].y = ActualPoints[1].y)) or
((TOrthoLine(aFindedFigure).ActualPoints[2].x = ActualPoints[1].x) and (TOrthoLine(aFindedFigure).ActualPoints[2].y = ActualPoints[1].y)) then
Result := False;
end;
end;
{**************************************************************************}
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CanSnapToFindFigure', E.Message);
end;
end; *)
////////////////////////////////////////////////////////////////////////////////
// Ñðàáàòûâàåò êîãäà ïåðåìåùàåøü îáüåêò
////////////////////////////////////////////////////////////////////////////////
procedure TConnectorObject.Move(deltax, deltay: Double);
var
i: Integer;
Cabinet: TCabinet;
pt: TDoublePoint;
vLevel: TList;
begin
// Tolik -- 23/04/2017 --
if deleted then
Exit;
//
// Tolik 07/02/2017 --
vLevel := nil;
//
try
if DrawStyle = mydsNormal then
if FIsHouseJoined then
begin
for i := 0 to FHouse.PointCount - 1 do
begin
pt := FHouse.ActualPoints[i];
if IsPointIn(pt.x, pt.y) then
begin
FHouse.ActualPoints[i] := DoublePoint(FHouse.ActualPoints[i].x + deltax, FHouse.ActualPoints[i].y + deltay);
break;
end;
end;
end;
//Tolik --09/09/2016
vLevel := CheckOtherConnectorsOnLevel(Self, ActualPoints[1].x, ActualPoints[1].y);
if (vLevel <> nil) and (vLevel.Count > 0) then
//Tolik -- 13/06/2017 --
begin
if vLevel.IndexOf(Self) = -1 then
vLevel.Add(Self);
// Tolik -- 30/03/2018 -
//MoveConnector(deltax, deltay, false, false);
MoveConnector(deltax, deltay, True, false);
//
end
//
else
MoveConnector(deltax, deltay);
FreeAndNil(vLevel);
// Tolik 30/03/2018 -- åñëè ïðè ìóâå ïðîèçîøåë ñíàï êîííåêòîðîâ, òî òåêóùèé êîííåêòîð, åñëè ñíàïèëèñü, íàïðèìåð,
// íà êîííåêòîð ðàéçà, áóäåò îáÿçàòåëüíî óäàëåí...òàê ÷òî íåõ äàëüøå òóò ¸ðçàòü...âî èçáåæàíèå!
if Self.Deleted then
exit;
//
DefRaizeDrawFigurePos;
// Auto ReAlign
if (GCadForm.PCad.SnapToGrids)or(GCadForm.PCad.SnapToGuides) then
begin
if DrawStyle = mydsNormal then
begin
if (not GMoveByArrow) and (not FIsApproach) then
if FConnRaiseType = crt_None then
begin
ReAlignObject(Self);
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Move', E.Message);
end;
SetProjectChanged(True); // Tolik 19/11/2019 --
end;
//Tolik 03/08/2021 -- aCanAlign - ÷òîáû íå ñáèòü êîîðäèíàòû êîííåêòîðîâ çà ñ÷åò ïðèâÿçîê (ê îáúåêòàì, íàïðàâëÿþùèì, ñåòêå è ò.ï.)
//procedure TConnectorObject.MoveP(deltax, deltay: Double; FindSnap: Boolean = true);
procedure TConnectorObject.MoveP(deltax: Double; deltay: Double; FindSnap: Boolean = True; aCanAlign: Boolean = True);
//
var
i: Integer;
Cabinet: TCabinet;
pt: TDoublePoint;
vLevel: TList;
begin
// Tolik 07/02/2017 --
vLevel := nil;
//
try
if DrawStyle = mydsNormal then
if FIsHouseJoined then
begin
for i := 0 to FHouse.PointCount - 1 do
begin
pt := FHouse.ActualPoints[i];
if IsPointIn(pt.x, pt.y) then
begin
FHouse.ActualPoints[i] := DoublePoint(FHouse.ActualPoints[i].x + deltax, FHouse.ActualPoints[i].y + deltay);
break;
end;
end;
end;
//Tolik --09/09/2016
vLevel := CheckOtherConnectorsOnLevel(Self, ActualPoints[1].x, ActualPoints[1].y);
if (vLevel <> nil) and (vLevel.Count > 0) then
MoveConnector(deltax, deltay, false, false)
else
MoveConnector(deltax, deltay, findSnap);
DefRaizeDrawFigurePos;
// Auto ReAlign
if aCanAlign then
begin
if (GCadForm.PCad.SnapToGrids)or(GCadForm.PCad.SnapToGuides) then
begin
if DrawStyle = mydsNormal then
begin
if (not GMoveByArrow) and (not FIsApproach) then
if FConnRaiseType = crt_None then
begin
ReAlignObject(Self);
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Move', E.Message);
end;
// Tolik 07/02/2017 --
if vLevel <> nil then
FreeAndNil(vLevel);
//
end;
procedure TConnectorObject.MoveConnector(deltax, deltay: Double; aFindSnap: Boolean = True; aMoveByVertical: Boolean = False; CheckDelta: Boolean = True);
var
i, j: integer;
RaiseConn: TConnectorObject;
ObjFromRaise: TConnectorObject;
//
ListToPassage: TF_CAD;
ConnToPassage: TConnectorObject;
CurGCadForm: TF_CAD;
CurConnToPassageIndex: Integer;
fulldeltax, fulldeltay: double;
Cabinet: TFigure;
pos: TDoublePoint;
isMove: Boolean;
p1, p2, p3, p4: TDoublePoint;
VertList: TList;
TempLine: TOrthoLine;
// Tolik 21/04/2017 --
LineToMoveList: Tlist;
vdeltax, vdeltay: Double;
Function GetLineToMoveList: TList;
var i: Integer;
begin
Result := tList.Create;
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
if ((not TOrthoLine(JoinedOrtholinesList[i]).Deleted) and
(Result.IndexOf(TOrthoLine(JoinedOrtholinesList[i])) = -1)) then
Result.Add(TOrthoLine(JoinedOrtholinesList[i]));
end;
end;
//
begin
// Tolik 07/02/2017 --
VertList := nil;
//
// Tolik 31/03/2021 --
if deltax = 0 then
if deltay = 0 then
exit;
try
if (DrawStyle = mydsNormal) then
if (FIsHouseJoined) and (not fByHouseMove) and (FHouse.Selected) then
exit;
if (FIsApproach) and (not fByHouseMove) and (fMoveByApproach) and (not FHouse.Selected) then
begin
if (DrawStyle = dsTrace) then
begin
isMove := IsApproachInHouse(deltax, deltay);
if isMove then
begin
appdeltax := appdeltax + deltax;
appdeltay := appdeltay + deltay;
end
else
begin
exit;
end;
end
else
begin
fMoveByApproach := false;
if not GMoveByArrow then
begin
deltax := appdeltax;
deltay := appdeltay;
end
else
begin
isMove := IsApproachInHouse(deltax, deltay);
if not isMove then
exit;
end;
end;
end;
// *************************************************************************
if (deltax <> 0) or (deltay <> 0) then
GIsConnMoved := True;
// Êîððåêò ïîä àâòîñäâèã ïîä ñåòêó
if DrawStyle = dsTrace then
begin
if GTraceNotMove then
begin
GTraceNotMove := False;
GAddDeltaX := deltax;
GAddDeltaY := deltay;
Exit;
end;
end;
if DrawStyle = mydsNormal then
begin
if GNormalNotMove then
begin
GNormalNotMove := False;
deltax := deltax - GAddDeltaX;
deltay := deltay - GAddDeltaY;
GAddDeltaX := 0;
GAddDeltaY := 0;
end;
// ÑÁÐÎÑ ØÀÄÎÓ ÒÐÀÑÑ ÅÑËÈ ÏÅÐÅÌÅÙÅÍÈÅ ÁÛËÎ ×ÅÐÅÇ ÑÅÁß
if DrawStyle = mydsNormal then
if (not GMovedByLine) {and (GMovedBySelf)} then
//Tolik 18/04/2018 --
if not aMoveByVertical then
//
SkipConnectedLinesDrawShadow;
end;
// Ïåðåìåùåíèå ïî îïöèÿì - åñëè çàáëî÷åíî ïåðåìåùåíèå
if GCadForm.FNoMoveConnectedObjects then
if (ConnectorType <> ct_clear) and (JoinedConnectorsList.Count > 0) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes9);
Exit;
end;
if (GCadForm.PCad.SelectedCount > 1) and (GCadForm.FNoMoveConnectedObjects) then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes9);
Exit;
end;
// Ïðè ñêðîëå ÊÀÄà ñáðîñèòü Øàäîó òðàññ ïðè òðåéñå
if DrawStyle = dsTrace then
begin
if (deltax <> 0) or (deltay <> 0) then
if GCadForm.CheckScrollingOnTracing(ActualPoints[1].x, ActualPoints[1].y) then
begin
SkipConnectedLinesDrawShadow;
end;
end;
{**************************************************************************}
if not GMoveByArrow then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
begin
if DrawStyle = dsTrace then
begin
// ÎÐÒÎÃÎÍÀËÜÍÎÅ ÏÅÐÅÌÅÙÅÍÈÅ
if ssShift in GGlobalShiftState then
begin
deltax := 0;
deltay := 0;
fulldeltax := GCurrMousePos.x - GBeforeDragConnectorPoints.x;
fulldeltay := GCurrMousePos.y - GBeforeDragConnectorPoints.y;
if abs(fulldeltax) >= abs(fulldeltay) then
begin
// IGOR 05.11.2013 - Ïîêà çàêîìåíòèë - â ñàìîì êîíöå ïðîöåäóðû îíè âûñòàâëÿþòñÿ åùå ðàç
// åñëè îñòàâèòü è çäåñü - ïðè áîëüøîì êîëè÷åñòâå îáúåêòîâ äåðãàåòñÿ òðåéñ êâàäðàòèê
// âîçìîæíî êàêèå òî äðóãèå ïåðåìåùåíèÿ ïîëàìàþòñÿ...
// ÍÅËÜÇß ÏÎÊÀ ÊÎÌÌÅÍÒÈÒÜ - ñáèâàåòñÿ îðòîãîíàëüíîñòü è ó÷åò óãëîâ, âîçìîæíî êàê òî ïî èíîìó îáîéòè ýòî ïîëó÷èòñÿ
ActualPoints[1] := GBeforeDragConnectorPoints;
deltax := fulldeltax;
deltay := 0;
end
else
if abs(fulldeltax) < abs(fulldeltay) then
begin
// IGOR 05.11.2013 - Ïîêà çàêîìåíòèë - â ñàìîì êîíöå ïðîöåäóðû îíè âûñòàâëÿþòñÿ åùå ðàç
// åñëè îñòàâèòü è çäåñü - ïðè áîëüøîì êîëè÷åñòâå îáúåêòîâ äåðãàåòñÿ òðåéñ êâàäðàòèê
// âîçìîæíî êàêèå òî äðóãèå ïåðåìåùåíèÿ ïîëàìàþòñÿ...
// ÍÅËÜÇß ÏÎÊÀ ÊÎÌÌÅÍÒÈÒÜ - ñáèâàåòñÿ îðòîãîíàëüíîñòü è ó÷åò óãëîâ, âîçìîæíî êàê òî ïî èíîìó îáîéòè ýòî ïîëó÷èòñÿ
ActualPoints[1] := GBeforeDragConnectorPoints;
deltay := fulldeltay;
deltax := 0;
end;
end
else
// C Ó×ÅÒÎÌ ÓÃËÀ ÁÅÇ ÏÐÈÂßÇÊÈ Ê ÑÅÒÊÅ
if (not GCadForm.PCad.SnapToGrids)and ((not GCadForm.PCad.SnapToGuides)or(GCadForm.PCad.Guides.count = 0)) and (not GMovedByLine) then
begin
pos := GetPosWithAngle(GCurrMousePos.x, GCurrMousePos.y, GCadForm.FDefaultTraceStepRotate);
// IGOR 05.11.2013 - Ïîêà çàêîìåíòèë - â ñàìîì êîíöå ïðîöåäóðû îíè âûñòàâëÿþòñÿ åùå ðàç
// åñëè îñòàâèòü è çäåñü - ïðè áîëüøîì êîëè÷åñòâå îáúåêòîâ äåðãàåòñÿ òðåéñ êâàäðàòèê
// âîçìîæíî êàêèå òî äðóãèå ïåðåìåùåíèÿ ïîëàìàþòñÿ...
// ÍÅËÜÇß ÏÎÊÀ ÊÎÌÌÅÍÒÈÒÜ - ñáèâàåòñÿ îðòîãîíàëüíîñòü è ó÷åò óãëîâ, âîçìîæíî êàê òî ïî èíîìó îáîéòè ýòî ïîëó÷èòñÿ
ActualPoints[1] := pos;
end;
// ÐÈÑÎÂÀÒÜ SHADOW ËÈÍÈÈ
if (not GMovedByLine) then
begin
if GGlobalShiftState = [] then
if not CheckTrunkObject(GLastConnector) then
SetConnectedLinesDrawShadow(ActualPoints[1].x, ActualPoints[1].y);
end;
GMovedBySelf := True;
end;
if DrawStyle = mydsNormal then
begin
// ÎÐÒÎÃÎÍÀËÜÍÎÅ ÏÅÐÅÌÅÙÅÍÈÅ
if (ssShift in GGlobalShiftState) and (not GMovedByLine) then
begin
if abs(deltax) >= abs(deltay) then
deltay := 0
else
if abs(deltax) < abs(deltay) then
deltax := 0;
end
else
// C Ó×ÅÒÎÌ ÓÃËÀ ÁÅÇ ÏÐÈÂßÇÊÈ Ê ÑÅÒÊÅ
if (not GCadForm.PCad.SnapToGrids)and((GCadForm.PCad.Guides.count = 0)or (not GCadForm.PCad.SnapToGuides)) and (not GMovedByLine) and (not GMovedByOtherObject) and (GMovedBySelf) then
begin
pos := GetPosWithAngle(GCurrMousePos.x, GCurrMousePos.y, GCadForm.FDefaultTraceStepRotate);
deltax := pos.x - GBeforeDragConnectorPoints.x;
deltay := pos.y - GBeforeDragConnectorPoints.y;
end;
GMovedBySelf := False;
end;
end;
end;
// ÄÓÁËÈÊÀÒ !!!
if (DrawStyle = mydsNormal) and (ssCtrl in GGlobalShiftState) and (not GMoveByArrow) then
begin
if (ConnectorType <> ct_Clear) then
begin
if GCadForm.PCad.SelectedCount = 1 then
begin
if not FIsApproach then
begin
if FTrunkName = ctsnCrossATS then
CreateCrossATSDuplicate(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay)
else
if FTrunkName = ctsnDistributionCabinet then
CreateDistribCabDuplicate(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay)
else
CreateDuplicate(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
end;
Exit;
end;
end;
end;
end;
// Tolik 20/04/2017 -- ýòî ïîêà ïðîñòî "ÊÎÑÒÛËÜ", åñòü áîëüøàÿ íåîáõîäèìîñòü îáíàðóæèòü, ãäå
// ÏÎËÓ×ÀÅÒÑß ÐÀÑÕÎÆÄÅÍÈÅ ÌÅÆÄÓ ÊÎÎÐÄÈÍÀÒÀÌÈ ÎÐÒÎËÈÍÈÈ È ÅÅ ÊÎÍÍÅÊÒÎÐΠ!!!
if not aMoveByVertical then
VertList := CheckOtherConnectorsOnLevel(Self, ActualPoints[1].x, ActualPoints[1].y);
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
LineToMoveList := GetLineToMoveList;
for i := 0 to LineToMoveList.Count - 1 do
begin
TempLine := TOrthoLine(LineToMoveList[i]);
if Self.ID = TempLine.JoinConnector1.ID then
ReMoveJoinedOrthoLines(TempLine, ActualPoints[1].x - TempLine.ActualPoints[1].x,
ActualPoints[1].y - TempLine.ActualPoints[1].y, CheckDelta)
else
if Self.Id = TempLine.JoinConnector2.ID then
ReMoveJoinedOrthoLines(TempLine, ActualPoints[1].x - TempLine.ActualPoints[2].x,
ActualPoints[1].y - TempLine.ActualPoints[2].y, CheckDelta)
end;
LineToMoveList.free;
{
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
TempLine := TOrthoLine(JoinedOrtholinesList[i]);
if Self.ID = TempLine.JoinConnector1.ID then
ReMoveJoinedOrthoLines(TOrthoLine(JoinedOrtholinesList[i]), ActualPoints[1].x - TempLine.ActualPoints[1].x,
ActualPoints[1].y - TempLine.ActualPoints[1].y, CheckDelta)
else
if Self.Id = TempLine.JoinConnector2.ID then
ReMoveJoinedOrthoLines(TOrthoLine(JoinedOrtholinesList[i]), ActualPoints[1].x - TempLine.ActualPoints[2].x,
ActualPoints[1].y - TempLine.ActualPoints[2].y, CheckDelta)
end;
}
{
for i := 0 to JoinedOrtholinesList.Count - 1 do
ReMoveJoinedOrthoLines(TOrthoLine(JoinedOrtholinesList[i]), deltax, deltay, CheckDelta);
if not aMoveByVertical then
VertList := CheckOtherConnectorsOnLevel(Self, ActualPoints[1].x, ActualPoints[1].y);
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
}
if DrawStyle = mydsNormal then
if DrawFigure <> nil then
if Not DrawFigure.Selected then
DrawFigure.move(deltax, deltay);
if CaptionsGroup <> nil then
if Not CaptionsGroup.Selected then
CaptionsGroup.Move(deltax, deltay);
if NotesGroup <> nil then
if Not NotesGroup.Selected then
NotesGroup.Move(deltax, deltay);
// ïåðåäâèíóòü ïóñòûå êîíåêòîðû ïðèâÿçàííûå ê îáüåêòó
if ConnectorType <> ct_Clear then
begin
GMovedByOtherObject := True;
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
//13/09/2016 -- Tolik
if (not TConnectorObject(JoinedConnectorsList[i]).Selected) and (not GDisableMove) then
TConnectorObject(JoinedConnectorsList[i]).MoveConnector(deltax, deltay, False, true)
else
if TConnectorObject(JoinedConnectorsList[i]).LockMove then
TConnectorObject(JoinedConnectorsList[i]).MoveConnector(deltax, deltay, False, true);
{if (not TConnectorObject(JoinedConnectorsList[i]).Selected) and (not GDisableMove) then
TConnectorObject(JoinedConnectorsList[i]).MoveConnector(deltax, deltay, False)
else
if TConnectorObject(JoinedConnectorsList[i]).LockMove then
TConnectorObject(JoinedConnectorsList[i]).MoveConnector(deltax, deltay, False)}
end;
GMovedByOtherObject := False;
end;
{*********************************************}
// ïåðåäâèãàòü âìåñòå ñ ñ-ï
if GMoveWithRaise then
begin
MoveRaiseConnector(deltax, deltay);
MoveBetweenRaiseConnector(deltax, deltay);
end;
{*********************************************}
// if not GMoveByArrow then
begin
if aFindSnap then
begin
if DrawStyle = dsTrace then
begin
if FindSnapTimer = nil then
CreateSnapTimer;
if FindSnapTimer <> nil then
begin
FindSnapTimer.Tag := 0;
FindSnapTimer.Enabled := false;
FindSnapTimer.Enabled := true;
FDeltaPoint.x := deltax;
FDeltaPoint.y := deltay;
end;
end
else
begin
if (not GMovedByLine) and (GCadForm.PCad.SelectedCount <= 1) then
if Not GCadForm.TimerFindSnap.Enabled then
begin
if FindSnapTimer <> nil then
FindSnapTimer.Enabled := false;
//GCadForm.mProtocol.Lines.Add(DateTimeToStr(date+time)+': ==MoveConnector=='); //ther test
FindObjectsOnMove(deltax, deltay);
GCadForm.TimerFindSnap.Enabled := true;
end;
end;
// }
end;
// ÏÎÈÑÊ ÎÁÚÅÊÒΠÍÀ ÎÁÐÀÁÎÒ×ÈÊÅ !!!
// ïðè íàæàòîì Àëüòå óáðàòü ïðåäûäóùèå âûäåëåííûå îáúåêòû
if (ssAlt in GGlobalShiftState) then
begin
if GPrevFigureSnap <> nil then
begin
DrawSnapFigures(GPrevFigureSnap, False);
GPrevFigureSnap := nil;
end;
end;
end;
// Tolik 30/09/2018 --
if Self.Deleted then
exit;
//
// Z âûâåñòè íà ïàíåëü
if DrawStyle = dsTrace then
begin
if GFigureSnap = nil then
GDraggedFigureZOrder := ActualZOrder[1]
else
begin
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
GDraggedFigureZOrder := TConnectorObject(GFigureSnap).ActualZOrder[1]
else if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
GDraggedFigureZOrder := TOrthoLine(GFigureSnap).ActualZOrder[1];
end;
end;
if DrawStyle = mydsNormal then
GDraggedFigureZOrder := -1;
// ÊÀÁÈÍÅÒ
if DrawStyle = mydsNormal then
begin
Cabinet := GetCabinetAtPos(ActualPoints[1].x, ActualPoints[1].y, False, self);
if Cabinet <> nil then
begin
if CheckFigureByClassName(Cabinet, cTCabinet) then
begin
if TCabinet(Cabinet).FSCSID <> FCabinetID then
begin
FCabinetID := TCabinet(Cabinet).FSCSID;
MoveObjectToRoomInPM(GCadForm.FCADListID, ID, FCabinetID);
end;
end
else if CheckFigureByClassName(Cabinet, cTCabinetExt) then
begin
if TCabinetExt(Cabinet).FSCSID <> FCabinetID then
begin
FCabinetID := TCabinetExt(Cabinet).FSCSID;
MoveObjectToRoomInPM(GCadForm.FCADListID, ID, FCabinetID);
end;
end;
end;
end;
if CheckTrunkObject(Self) then
begin
AfterMoveTrunkObject(Self, deltax, deltay);
end;
if not aMoveByVertical then
if VertList <> nil then
begin
for i := 0 to VertList.Count - 1 do
begin
if not TConnectorObject(VertList[i]).Selected then
begin
vdeltax := Self.AP1.x - TConnectorObject(VertList[i]).Ap1.x;
vdeltay := Self.AP1.y - TConnectorObject(VertList[i]).Ap1.y;
if ((vDeltax <> 0) or (vDeltay <> 0)) then
TConnectorObject(VertList[i]).MoveConnector(vdeltax, vdeltay, false, true);
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.MoveConnector', E.Message);
end;
// Tolik -- 07/02/2017 --
if VertList <> nil then
FreeAndNil(VertList);
end;
procedure TConnectorObject.MoveRaiseConnector(deltax, deltay: Double);
var
RaiseConn, ObjFromRaise: TConnectorObject;
begin
try
if (ConnectorType <> ct_Clear) or (JoinedConnectorsList.Count = 0) then
begin
GMoveWithRaise := False;
GMovedByOtherObject := True;
// ïîëó÷èòü ñ-ï
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
if (not RaiseConn.Selected) and (not GDisableMove) then
RaiseConn.MoveConnector(deltax, deltay, False)
else
if RaiseConn.LockMove then
RaiseConn.MoveConnector(deltax, deltay, False);
end;
// ïîëó÷èòü ÒÎ ïîä ñ-ï
ObjFromRaise := FObjectFromRaise;
if ObjFromRaise <> nil then
if (not ObjFromRaise.Selected) and (not GDisableMove) then
ObjFromRaise.MoveConnector(deltax, deltay, False)
else
if ObjFromRaise.LockMove then
ObjFromRaise.MoveConnector(deltax, deltay, False);
GMoveWithRaise := True;
GMovedByOtherObject := False;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.MoveRaiseConnector', E.Message);
end;
end;
procedure TConnectorObject.MoveBetweenRaiseConnector(deltax, deltay: Double);
var
RaiseConn, ObjFromRaise: TConnectorObject;
ListToPassage, CurGCadForm: TF_CAD;
ConnToPassage: TConnectorObject;
CurConnToPassageIndex: Integer;
OldPoints, NewPoints: TDoublePoint;
begin
try
// ïåðåäâèíóòü ì-ý ñ-ï
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
GMovedByOtherObject := True;
if RaiseConn.FID_ConnToPassage <> -1 then
begin
// ïîëó÷èòü êîýôôèöèåíò ïåðåìåùåíèÿ ïî Shift
// ïåðåìåñòèòü òîëüêî ñåáÿ è çàïèñàòü êîýôôèöèåíò
if (ssShift in GGlobalShiftState) and not (ssCtrl in GGlobalShiftState) then
begin
NewPoints := ActualPoints[1];
OldPoints := DoublePoint(ActualPoints[1].x - deltax, ActualPoints[1].y - deltay);
if OldPoints.x < 1 then
OldPoints.x := 1;
if OldPoints.y < 1 then
OldPoints.y := 1;
FRaiseShiftX := FRaiseShiftX * (NewPoints.x / OldPoints.x);
FRaiseShiftY := FRaiseShiftY * (NewPoints.y / OldPoints.y);
end
else
// ïåðåìåñòèòü ñåáÿ, à îáúåêò íà äðóãîì ýòàæå ïåðåìåñòèòü ñ ó÷åòîì
// åãî êîýôôèöèåíòà ïåðåìåùåíèÿ ìàñøòàáà
begin
ListToPassage := GetListOfPassage(RaiseConn.FID_ListToPassage);
ConnToPassage := TConnectorObject(GetFigureByID(ListToPassage, RaiseConn.FID_ConnToPassage));
if ConnToPassage <> nil then
begin
ObjFromRaise := ConnToPassage.FObjectFromRaise;
if ObjFromRaise <> nil then
begin
CurGCadForm := GCadForm;
GCadForm := ListToPassage;
CurConnToPassageIndex := ConnToPassage.FID_ConnToPassage;
ConnToPassage.FID_ConnToPassage := -1;
// ïðîñòî ïåðåìåùåíèå áåç ó÷åòà êîýôôèöèåíòà
if (ssShift in GGlobalShiftState) and (ssCtrl in GGlobalShiftState) then
ObjFromRaise.MoveConnector(deltax, deltay)
else
// ïåðåìåùåíèå ñ ó÷åòîì êîýôôèöèåíòà
ObjFromRaise.MoveConnector(deltax * ObjFromRaise.FRaiseShiftX, deltay * ObjFromRaise.FRaiseShiftY, False);
ConnToPassage.FID_ConnToPassage := CurConnToPassageIndex;
GCadForm := CurGCadForm;
end;
end;
end;
end;
GMovedByOtherObject := False;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.MoveBetweenRaiseConnector', E.Message);
end;
end;
procedure TConnectorObject.FindObjectsOnMove(deltax, deltay: Double);
var
i: integer;
FiguresList: TList;
Item: TMenuItem;
FFigure: TFigure;
Point: TPoint;
FHeightStr: string;
X, Y: double;
// Tolik -- 07/04/2017 --
SnapFigureBound: TDoubleRect;
POINTS: TDoublePointArr;
dim1: Double;
CanSnap: Boolean;
begin
// Tolik 19/04/2018 --
{ if Self.ID = -1 then
exit;}
FFindSnapEnable := False;
try
if FIsApproach then
exit;
//
// Tolik -- 10/04/2017 --
dim1 := 0.6;
FiguresList := Nil;
//
if not (ssAlt in GGlobalShiftState) then
begin
// Âûçîâ ïðîöåäóðû ïîèñêà îáüåêòîâ
if (DrawStyle = dsTrace) then
begin
if not GIsConnMoved then
GFigureSnap := Nil
else
GFigureSnap := FindSnapObject(ActualPoints[1].x, ActualPoints[1].y);
if (GPrevFigureSnap <> nil) AND (GPrevFigureSnap <> GFigureSnap) then
DrawSnapFigures(GPrevFigureSnap, False);
if GFigureSnap <> nil then
begin
DrawSnapFigures(GFigureSnap, True);
GPrevFigureSnap := GFigureSnap;
end;
if isSnap then
isSnap := False;
end;
if DrawStyle = mydsNormal then
begin
if (GFigureSnap <> nil) then
begin
// Tolik -- 07/04/2017 -- ïðîâåðèòü, ðÿäîì ëè ôèãóðà ñ êîííåêòîðîì -- ÍÅ ÒÐÎÃÀÒÜ!!!
// ïðîâåðêà íàïèñàíà âî èçáåæàíèå ñíàïà êîííåêòîðà, êîòîðûé äâèãàåòñÿ â äàííûé ìîìåíò
// (îñîáåííî êðèòè÷íî ïðè àâòîìàòè÷åñêèõ îïåðàöèÿõ), åñëè åñòü ñíàïôèãóðà, à êîííåêòîð ôèã
// çíàåò ãäå îò íåå --- òî ÷òîáû îí ê íåé íå ïðèêîííåê÷èâàëñÿ -- à òî áûëè ñëó÷àè....
// Tolik 13/06/2017 --
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
//
begin
// Tolik 08/11/2017 --
//SnapFigureBound := GFigureSnap.GetBoundRect;
//
SetLength(points, 4);
{POINTS[0].x := SnapFigureBound.Left - dim1 ;
POINTS[0].y := SnapFigureBound.Top - dim1;
POINTS[1].x := SnapFigureBound.Right + dim1 ;
POINTS[1].y := SnapFigureBound.Top - dim1;
POINTS[2].x := SnapFigureBound.Right + dim1;
POINTS[2].y := SnapFigureBound.Bottom + dim1;
POINTS[3].x := SnapFigureBound.Left - dim1;
POINTS[3].y := SnapFigureBound.Bottom + dim1;}
POINTS[0].x := TConnectorObject(GFigureSnap).RedRect[1].x;
POINTS[0].y := TConnectorObject(GFigureSnap).RedRect[1].y;
POINTS[1].x := TConnectorObject(GFigureSnap).RedRect[2].x;
POINTS[1].y := TConnectorObject(GFigureSnap).RedRect[1].y;
POINTS[2].x := TConnectorObject(GFigureSnap).RedRect[2].x;
POINTS[2].y := TConnectorObject(GFigureSnap).RedRect[2].y;
POINTS[3].x := TConnectorObject(GFigureSnap).RedRect[1].x;
POINTS[3].y := TConnectorObject(GFigureSnap).RedRect[2].y;
//
if not PtInPolygon(points, DoublePoint(ActualPoints[1].x, ActualPoints[1].y)) then
begin
SetLength(Points, 0);
if GPrevFigureSnap <> nil then
DrawSnapFigures(GPrevFigureSnap, False);
if GFigureSnap <> nil then
DrawSnapFigures(GFigureSnap, False);
// Tolik 08/11/2017 --
{GFigureSnap := Nil;
GPrevFigureSnap := Nil;}
if GFigureSnap <> nil then
begin
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
TConnectorObject(GFigureSnap).isSnap := False
else
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
TOrthoLine(GFigureSnap).isSnap := False
else
THouse(GFigureSnap).isSnap := False;
GFigureSnap := nil;
end;
if GPrevFigureSnap <> nil then
begin
if CheckFigureByClassName(GPrevFigureSnap, cTConnectorObject) then
TConnectorObject(GPrevFigureSnap).isSnap := False
else
if CheckFigureByClassName(GPrevFigureSnap, cTOrthoLine) then
TOrthoLine(GPrevFigureSnap).isSnap := False
else
THouse(GPrevFigureSnap).isSnap := False;
GPrevFigureSnap := nil;
end;
FFindSnapEnable := True;
//
SetLength(Points, 0); // Toik 18/05/2018 --
exit;
end;
SetLength(Points, 0);
end;
//
// *******************************************************************
// if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
X := TConnectorObject(GFigureSnap).ActualPoints[1].x;
Y := TConnectorObject(GFigureSnap).ActualPoints[1].y;
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
begin
FiguresList := GetObjectsByVertical(Self, TConnectorObject(GFigureSnap));
end
else
begin
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) and (TOrthoLine(GFigureSnap).FIsVertical) then
FiguresList := GetObjectsByVertical(Self, TConnectorObject(GFigureSnap))
else
begin
FiguresList := TList.Create;
FiguresList.Add(GFigureSnap);
end;
end;
// ôîðìèðîâàòü ñïèñîê îáúåêòîâ
if (FiguresList <> nil) and (FiguresList.Count > 1) then
begin
GFigureSnap := nil;
GetCursorPos(Point);
FSCS_Main.pmFiguresByLevel.Items.Clear;
for i := 0 to FiguresList.Count - 1 do
begin
FFigure := TFigure(FiguresList[i]);
Item := TMenuItem.Create(FSCS_Main.pmFiguresByLevel);
FHeightStr := '';
if CheckFigureByClassName(FFigure, cTOrthoLine) then
begin
if TOrthoLine(FFigure).ActualZOrder[1] = TOrthoLine(FFigure).ActualZOrder[2] then
FHeightStr := FormatFloat(ffMask, MetreToUOM(TOrthoLine(FFigure).ActualZOrder[1]))
else
FHeightStr := FormatFloat(ffMask, MetreToUOM(TOrthoLine(FFigure).ActualZOrder[1])) + '-' +
FormatFloat(ffMask, MetreToUOM(TOrthoLine(FFigure).ActualZOrder[2]));
end
else if CheckFigureByClassName(FFigure, cTConnectorObject) then
FHeightStr := FormatFloat(ffMask, MetreToUOM(TConnectorObject(FFigure).ActualZOrder[1]));
Item.Caption := GetFullFigureName(FFigure) + ' (' + FHeightStr + GetUOMString(GCurrProjUnitOfMeasure) + ')';
FSCS_Main.pmFiguresByLevel.Items.Add(Item);
Item.Tag := FFigure.ID;
Item.OnClick := GCadForm.SnapFigureEvent;
end;
FSCS_Main.pmFiguresByLevel.Popup(Point.X, Point.Y);
if FiguresList <> nil then
FreeAndNil(FiguresList);
//Tolik -- 19/04/2018
if GFigureSnap <> nil then
begin
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
TConnectorObject(GFigureSnap).isSnap := False
else
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
TOrthoLine(GFigureSnap).isSnap := False
else
THouse(GFigureSnap).isSnap := False;
GFigureSnap := nil;
end;
if GPrevFigureSnap <> nil then
begin
if CheckFigureByClassName(GPrevFigureSnap, cTConnectorObject) then
TConnectorObject(GPrevFigureSnap).isSnap := False
else
if CheckFigureByClassName(GPrevFigureSnap, cTOrthoLine) then
TOrthoLine(GPrevFigureSnap).isSnap := False
else
THouse(GPrevFigureSnap).isSnap := False;
GPrevFigureSnap := nil;
end;
GCadForm.PCad.Refresh;
FFindSnapEnable := True;
exit;
end;
if FiguresList <> nil then
FreeAndNil(FiguresList);
// *******************************************************************
// Tolik 22/03/2018 --
CanSnap := True;
if (GetRaiseConn(Self) <> nil) then
begin
begin
if not GUseVerticalTraces then
begin
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes11 + cCadClasses_Mes11_1);
CanSnap := False;
end;
end;
end;
if CanSnap then
begin
if not CheckTrunkObject(Self) then
begin
if not FIsApproach then
begin
//// To Connector //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
begin
if (ConnectorType = ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType = ct_Clear) then
CheckingSnapConnectorToConnector(Self, TConnectorObject(GFigureSnap))
else
if (ConnectorType = ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType <> ct_Clear) then
CheckingSnapConnectorToPointObject(Self, TConnectorObject(GFigureSnap), True)
else
if (ConnectorType <> ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType = ct_Clear) then
CheckingSnapPointObjectToConnector(Self, TConnectorObject(GFigureSnap));
end
else
//// To Ortholine //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
begin
if ConnectorType = ct_Clear then
begin
CheckingSnapConnectorToOrtholine(Self, TOrthoLine(GFigureSnap));
end
else
begin
CheckingSnapPointObjectToOrthoLine(Self, TOrthoLine(GFigureSnap));
end;
end
else
//// To Ortholine //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTHouse) then
begin
if ConnectorType = ct_Clear then
SnapConnectorToHouse(Self, THouse(GFigureSnap))
end;
end;
end;
end;
{
if (GetRaiseConn(Self) = nil) then
begin
if not CheckTrunkObject(Self) then
begin
if not FIsApproach then
begin
//// To Connector //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTConnectorObject) then
begin
if (ConnectorType = ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType = ct_Clear) then
CheckingSnapConnectorToConnector(Self, TConnectorObject(GFigureSnap))
else
if (ConnectorType = ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType <> ct_Clear) then
CheckingSnapConnectorToPointObject(Self, TConnectorObject(GFigureSnap), True)
else
if (ConnectorType <> ct_Clear) and (TConnectorObject(GFigureSnap).ConnectorType = ct_Clear) then
CheckingSnapPointObjectToConnector(Self, TConnectorObject(GFigureSnap));
end
else
//// To Ortholine //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTOrthoLine) then
begin
if ConnectorType = ct_Clear then
begin
CheckingSnapConnectorToOrtholine(Self, TOrthoLine(GFigureSnap));
end
else
begin
CheckingSnapPointObjectToOrthoLine(Self, TOrthoLine(GFigureSnap));
end;
end
else
//// To Ortholine //////////////////////////
if CheckFigureByClassName(GFigureSnap, cTHouse) then
begin
if ConnectorType = ct_Clear then
SnapConnectorToHouse(Self, THouse(GFigureSnap))
end;
end;
end;
end
else
if GetRaiseConn(Self) <> nil then
GCadForm.mProtocol.Lines.Add(cCadClasses_Mes11);
}
if GPrevFigureSnap <> nil then
DrawSnapFigures(GPrevFigureSnap, False);
GFigureSnap := Nil;
GPrevFigureSnap := Nil;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.FindObjectsOnMove', E.Message);
end;
FFindSnapEnable := True;
end;
procedure TConnectorObject.ReMoveJoinedOrthoLines(AJoinedLine: TOrthoLine; deltax, deltay: Double; CheckDelta: boolean = True);
var
OldAP1, OldAP2: TDoublePoint;
NewAP1, NewAP2: TDoublePoint;
mydeltax, mydeltay: Double;
CP: TDoublePoint;
x1, y1, z1, x2, y2, z2: double;
GetPointObject: TConnectorObject;
ResPoints: TDoublePoint;
Cabinet: TFigure;
Bnd: TDoubleRect;
DrawFigureCP: TDoublePoint;
// Tolik -- 27//11/2015
// CanX, CanY : Boolean;
Captions: TRichTextMod;
begin
try
if (AJoinedLine = nil) or (not OrtholineDetect(AJoinedLine)) then
exit;
OldAP1 := AJoinedLine.ActualPoints[1];
OldAP2 := AJoinedLine.ActualPoints[2];
// Tolik -- 21/04/2017 -- åñëè íóæíî ïîìåíÿòü êîîðäèíàòû êîíöîâ ïðèñîåäèíåííûõ òðàññ, òî èõ
// êîîðäèíàòû äîëæíû ñîîòâåòñòâîâàòü êîíöåâèêó(êîííåêòîðó)
{
if Self = AJoinedLine.JoinConnector1 then
begin
AJoinedLine.ActualPoints[1] := DoublePoint(AJoinedLine.ActualPoints[1].x + deltax,
AJoinedLine.ActualPoints[1].y + deltay);
AJoinedLine.ActualZOrder[1] := ActualZOrder[1];
end;
if Self = AJoinedLine.JoinConnector2 then
begin
AJoinedLine.ActualPoints[2] := DoublePoint(AJoinedLine.ActualPoints[2].x + deltax,
AJoinedLine.ActualPoints[2].y + deltay);
AJoinedLine.ActualZOrder[2] := ActualZOrder[1];
end;
}
if Self = AJoinedLine.JoinConnector1 then
begin
AJoinedLine.ActualPoints[1] := DoublePoint(ActualPoints[1].x, ActualPoints[1].y);
AJoinedLine.ActualZOrder[1] := ActualZOrder[1];
end;
if Self = AJoinedLine.JoinConnector2 then
begin
AJoinedLine.ActualPoints[2] := DoublePoint(ActualPoints[1].x, ActualPoints[1].y);
AJoinedLine.ActualZOrder[2] := ActualZOrder[1];
end;
//
AJoinedLine.CalculLength := AJoinedLine.LengthCalc;
AJoinedLine.LineLength := AJoinedLine.CalculLength;
// RECALC IN PM !!!
if Not AJoinedLine.FIsRaiseUpDown then
begin
if Not AJoinedLine.Selected then
if Not AJoinedLine.FNotRecalcLength then
if (deltax <> 0) or (deltay <> 0) or Not CheckDelta then
SetLineFigureLengthInPM(AJoinedLine.ID, AJoinedLine.LineLength);
end
else
begin
if Not AJoinedLine.FNotRecalcLength then
if Not CheckDelta then
SetLineFigureLengthInPM(AJoinedLine.ID, AJoinedLine.LineLength);
end;
NewAP1 := AJoinedLine.ActualPoints[1];
NewAP2 := AJoinedLine.ActualPoints[2];
CP.x := (AJoinedLine.ActualPoints[1].x + AJoinedLine.ActualPoints[2].x) / 2;
CP.y := (AJoinedLine.ActualPoints[1].y + AJoinedLine.ActualPoints[2].y) / 2;
// ÅÑËÈ ÝÒÎ ÍÅ Ñ-Ï !!!
///////////// ïîäñ÷åòû äëÿ CaptionsGroup //////////////////////////////////
if AJoinedLine.CaptionsGroup <> nil then
begin
if (OldAP1.x <> NewAP1.x) or (OldAP1.y <> NewAP1.y) or (OldAP2.x <> NewAP2.x) or (OldAP2.y <> NewAP2.y) or Not CheckDelta then
begin
// ïåðåñîçäàòü ïîäïèñü â íóæíîì ìåñòå
{$IF Defined(SCS_PE) or Defined(SCS_PANDUIT)}
Captions := TRichTextMod(AJoinedLine.CaptionsGroup.InFigures[1]);
ResPoints := AJoinedLine.CaptionsGroupRemoveCalc(AJoinedLine.CaptionsGroup.CenterPoint, OldAP1, OldAP2, NewAP1, NewAP2, AJoinedLine.CaptionsGroupH, Captions.re.Lines.Count);
AJoinedLine.UpdateLengthTextBox(false, false);
if (AJoinedLine.FCaptionsViewType = cv_Auto) {or (AJoinedLine.FCaptionsViewType = cv_Center)} then
AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
ResPoints.y - (AJoinedLine.CaptionsGroup.CenterPoint.y));
if AJoinedLine.ShowLength then
// Tolik -- 12/04/2017 --
{
AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
ResPoints.y - AJoinedLine.CaptionsGroup.CenterPoint.y)
}
begin
(*
Captions := TRichTextMod(AJoinedLine.CaptionsGroup.InFigures[1]);
ResPoints := AJoinedLine.CaptionsGroupRemoveCalc(AJoinedLine.CaptionsGroup.CenterPoint, OldAP1, OldAP2, NewAP1, NewAP2, AJoinedLine.CaptionsGroupH, Captions.re.Lines.Count);
//Tolik -- 09/12/2015
AJoinedLine.UpdateLengthTextBox(false, false);
//AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
// ResPoints.y - (AJoinedLine.CaptionsGroup.CenterPoint.y));
if (AJoinedLine.FCaptionsViewType = cv_Auto) {or (AJoinedLine.FCaptionsViewType = cv_Center)} then
AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
ResPoints.y - (AJoinedLine.CaptionsGroup.CenterPoint.y));
*)
end
else
begin
// new mark
// ïî ïðàâèëüíîìó íóæíî áû ñìåñòèòü íåìíîãî âñòîðîíó ÷òî áû áûëî íå ïî öåíòðó ëèíèè
// íî íóæíî ñìîòðåòü íà òî êàê ðàçìåùàåòñÿ ëèíèÿ
// ïîêà îñòàâèì êàê áûëî
// Tolik 13/04/2017 --
{AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
ResPoints.y - AJoinedLine.CaptionsGroup.CenterPoint.y)}
//
//AJoinedLine.CaptionsGroup.Move(abs(AJoinedLine.CaptionsGroup.ap2.x - AJoinedLine.CaptionsGroup.ap1.x)/2, 0);
end;
{$ELSE}
// Tolik
Captions := TRichTextMod(AJoinedLine.CaptionsGroup.InFigures[1]);
ResPoints := AJoinedLine.CaptionsGroupRemoveCalc(AJoinedLine.CaptionsGroup.CenterPoint, OldAP1, OldAP2, NewAP1, NewAP2, AJoinedLine.CaptionsGroupH, Captions.re.Lines.Count);
//Tolik -- 09/12/2015
AJoinedLine.UpdateLengthTextBox(false, false);
//AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
// ResPoints.y - (AJoinedLine.CaptionsGroup.CenterPoint.y));
if (AJoinedLine.FCaptionsViewType = cv_Auto) {or (AJoinedLine.FCaptionsViewType = cv_Center)} then
AJoinedLine.CaptionsGroup.Move(ResPoints.x - AJoinedLine.CaptionsGroup.CenterPoint.x,
ResPoints.y - (AJoinedLine.CaptionsGroup.CenterPoint.y));
//
{$IFEND}
end;
end;
//////////// ïîäñ÷åòû äëÿ NotesGroup /////////////////////////////////////
if AJoinedLine.NotesGroup <> nil then
begin
if (OldAP1.x <> NewAP1.x) or (OldAP1.y <> NewAP1.y) or (OldAP2.x <> NewAP2.x) or (OldAP2.y <> NewAP2.y) or Not CheckDelta then
begin
AJoinedLine.ReCreateNotesGroup;
end;
end;
//////////// ïîäñ÷åòû äëÿ MultilineCaptionBox /////////////////////////////////////
if AJoinedLine.FCount > 1 then
begin
if AJoinedLine.MultilineCaptionBox <> nil then
begin
mydeltax := CP.x - TTextMod(AJoinedLine.MultilineCaptionBox).CenterPoint.x;
mydeltay := CP.y - TTextMod(AJoinedLine.MultilineCaptionBox).CenterPoint.y;
AJoinedLine.MoveTextBox(AJoinedLine.MultilineCaptionBox, AJoinedLine.ActualPoints[1], AJoinedLine.ActualPoints[2], True);
if Not TTextMod(AJoinedLine.MultilineCaptionBox).Selected then
TTextMod(AJoinedLine.MultilineCaptionBox).Move(mydeltax, mydeltay);
end;
end;
//////////// ïîäñ÷åòû äëÿ DrawFigure /////////////////////////////////////
if (OldAP1.x <> NewAP1.x) or (OldAP1.y <> NewAP1.y) or (OldAP2.x <> NewAP2.x) or (OldAP2.y <> NewAP2.y) or Not CheckDelta then
begin
// Tolik -- 05/05/2017 -- åñëè óñòàíîâëåíà îïöèÿ "ïîêàçûâàòü ÓÃÎ äëÿ ðàéçîâ", òî òóò òîæå íàäî áûëî ó÷åñòü,
// à òî õåðíÿ ïîëíàÿ ïðè ìóâå ïðîèñõîäèò -- ÓÃÎ ðàéçîâ îñòàþòñÿ íà ñòàðûõ ìåñòàõ
//if not AJoinedLine.FIsRaiseUpDown then
if (not AJoinedLine.FIsRaiseUpDown) or TF_CAD(TPowerCad(AJoinedLine.Owner).Owner).FListSettings.CADShowRaiseDrawFigure then
//
if AJoinedLine.DrawFigure <> nil then
begin
Bnd := AJoinedLine.DrawFigure.GetBoundRect;
DrawFigureCP.x := (Bnd.Left + Bnd.Right) / 2;
DrawFigureCP.y := (Bnd.Top + Bnd.Bottom) / 2;
if (not AJoinedLine.FIsRaiseUpDown) then
AJoinedLine.ReCreateDrawFigureBlock;
if AJoinedLine.DrawFigure.InFigures.Count > 0 then
begin
// ïåðåäâèíóòü ÓÃÎ â íóæíîå ìåñòî
ResPoints := AJoinedLine.DrawFigureRemoveCalc(DrawFigureCP, OldAP1, OldAP2, NewAP1, NewAP2, AJoinedLine.DrawFigureH);
// Ýòîò êóñîê Òîëÿí áûë çàêîìåíòèë â ñâîå âðåìÿ, íî âåðíåì ïîêà íàçàä òàê êàê âðîäå äâîéíûõ
// ïåðåìåùåíèé íå óäàëîñü âîñïðîèçâåñòè
AJoinedLine.DrawFigure.Move(ResPoints.x - AJoinedLine.DrawFigure.CenterPoint.x,
ResPoints.y - AJoinedLine.DrawFigure.CenterPoint.y);
end;
end;
if AJoinedLine.DrawStyle = mydsNormal then
begin
Cabinet := GetCabinetAtPos(AJoinedLine.ActualPoints[1].x, AJoinedLine.ActualPoints[1].y, False, AJoinedLine);
if Cabinet <> nil then
begin
if CheckFigureByClassName(Cabinet, cTCabinet) then
begin
if TCabinet(Cabinet).FSCSID <> AJoinedLine.FCabinetID then
begin
AJoinedLine.FCabinetID := TCabinet(Cabinet).FSCSID;
MoveObjectToRoomInPM(GCadForm.FCADListID, AJoinedLine.ID, AJoinedLine.FCabinetID);
end;
end
else if CheckFigureByClassName(Cabinet, cTCabinetExt) then
begin
if TCabinetExt(Cabinet).FSCSID <> AJoinedLine.FCabinetID then
begin
AJoinedLine.FCabinetID := TCabinetExt(Cabinet).FSCSID;
MoveObjectToRoomInPM(GCadForm.FCADListID, AJoinedLine.ID, AJoinedLine.FCabinetID);
end;
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.ReMoveJoinedOrthoLines', E.Message);
end;
end;
function TConnectorObject.Duplicate: TFigure;
begin
try
Result := nil;
Result := TConnectorObject.Create(ActualPoints[1].x + 5, ActualPoints[1].y + 5, ActualZOrder[1], LayerHandle, DrawStyle, Owner);
TConnectorObject(Result).ConnectorType := ConnectorType;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Duplicate', E.Message);
end;
end;
function TConnectorObject.GetActualZOrder(Index: Integer): Double;
var
DynArrLen: integer;
begin
try
result := 0;
DynArrLen := length(FActualZOrder);
if (Index <= DynArrLen) And (Index > 0)then
result := FActualZOrder[Index - 1];
except
// on E: Exception do addExceptionToLogEx('TConnectorObject.GetActualZOrder', E.Message);
end;
end;
procedure TConnectorObject.SetActualZOrder(Index: Integer;
const Value: Double);
var
i: integer;
DynArrLen: integer;
begin
try
DynArrLen := length(FActualZOrder);
if Index > DynArrLen then
SetLength(FACtualZOrder, Index);
FActualZOrder[Index - 1] := Value;
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
if TOrthoLine(JoinedOrtholinesList[i]).JoinConnector1 = Self then
TOrthoLine(JoinedOrtholinesList[i]).ActualZOrder[1] := Value;
if TOrthoLine(JoinedOrtholinesList[i]).JoinConnector2 = Self then
TOrthoLine(JoinedOrtholinesList[i]).ActualZOrder[2] := Value;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetActualZOrder', E.Message);
end;
end;
procedure TConnectorObject.SetDrawFigure(const Value: TFigureGrpMod);
var
deltax, deltay: Double;
Bnd: TDoubleRect;
begin
try
// Tolik
if Value <> nil then
begin
//
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
// Tolik
FreeAndNil(FDrawFigure);
//
end;
FDrawFigure := TFigureGrpMod(Value);
// Tolik -- 14/09/2017 --
// Bnd := DrawFigure.GetBoundRect;
Bnd := DrawFigure.GetBoundRectWithoutAutoCreatedFigures;
//
GrpSizeX := Bnd.Right - Bnd.Left;
GrpSizeY := Bnd.Bottom - Bnd.Top;
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
DrawFigure.ActualPoints[1] := DoublePoint((Bnd.Left + Bnd.Right)/2 - GrpSizeX/2,
(Bnd.Top + Bnd.Bottom)/2 - GrpSizeY/2);
deltax := ActualPoints[1].x - GrpSizeX / 2 - DrawFigure.ActualPoints[1].x;
deltay := ActualPoints[1].y - GrpSizeY / 2 - DrawFigure.ActualPoints[1].y;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure(2, DrawFigure, False));
GCadForm.PCad.AddCustomFigure(2, DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
AutoShiftObject(Self);
// IGOR - 2013-13-05 Ýòî äëÿ òîãî ÷òîáû øòðèõîâêà îáúåêòîâ áûëà âïåðåäè, à íå çà ÓÃÎ
// Tolik 12/02/2020 -- åñëè ñîçäàåòñÿ äîì ñ ïîäúåçäîì, òî ïîäúåçò êàê êîííåêòîð íà êàä íå äîáàâèòñÿ...
// áóäåò êàêàøêà... ïðîâåðêà íàäî!
if GCadForm.PCad.Figures.IndexOf(Self) <> -1 then
//
GCadForm.PCad.Figures.Move(GCadForm.PCad.Figures.IndexOf(self), GCadForm.PCad.Figures.IndexOf(FDrawFigure));
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetDrawFigure', E.Message);
end;
end;
destructor TConnectorObject.Destroy;
var i: Integer;
begin
// Tolik -- 22/04/2017 -- ÂÀÆÍÎ!!! íå óäàëÿòü !!!
if Self = GLastConnector then
GLastConnector := nil;
//
// Tolik 02/04/2018 --
if FJoinedOrthoLinesByVerticals <> nil then
FreeAndNil(FJoinedOrthoLinesByVerticals); // ñïèñîê ïðèñîåäèíåííûõ òðàññ ÷åðåç âåðòèêàëè
(*
//Tolik
if Self.ConnectorType = ct_Clear then // 03/08/2017 -- ct_NB íà çàêðûòèè ëèñòà/ïðîåêòà âûçûâàåò ìíîæåñòâî ïðîáëåì
DeleteObjectFromPM(Self.ID, Self.Name);
//
*)
//// ïîïðîáóåì òàê:
if Self.ConnectorType = ct_Clear then // 03/08/2017 -- ct_NB íà çàêðûòèè ëèñòà/ïðîåêòà âûçûâàåò ìíîæåñòâî ïðîáëåì
begin
// òðåéñîâàÿ â ïðèíöèïå íå äîëæíà áûòü â ÏÌêå
if (DrawStyle <> dsTrace) then
begin
// åñëè îòìåíà äåéñòâèÿ, ÍÎ ÏÌêà íå îòìåíÿåòñÿ áóäåè òàê:
//if ListUndoAction.FBasePath <> '' then
// ïðè îòìåíå äåéñòâèé TPowerCad(Owner ).OnObjectInserted = nil, ïîýòîìó íå íóæíî äåëàòü DeleteObjectFromPM
if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
begin
if Assigned( TPowerCad(Owner).OnObjectInserted ) then
begin
if not GProjectClose then
DeleteObjectFromPM(Self.ID, Self.Name);
end;
end;
end;
end;
try
if DrawStyle <> dsTrace then
begin
try
if (Owner <> nil) and (TPowerCad(Owner).Owner <> nil) then
TF_CAD(TPowerCad(Owner ).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Destroy FNeedUpdateCheckedFigures', E.Message);
end;
end;
if FIsRotating then //11.03.2012
FreeAndNil(FDrawFigure);
if FindSnapTimer <> nil then
FreeAndNil(FindSnapTimer);
//Tolik
if RemJoined <> nil then
begin
//RemJoined.Clear;
FreeAndNil(RemJoined);
end;
if JoinedOrtholinesList <> nil then
begin
//JoinedOrtholinesList.Clear;
FreeAndNil(JoinedOrtholinesList);
end;
if JoinedConnectorsList <> nil then
begin
//JoinedConnectorslist.Clear;
//JoinedConnectorslist.Free;
FreeAndNil(JoinedConnectorslist);
end;
if OutTextCaptions <> nil then
begin
FreeAndNil(OutTextCaptions);
end;
if OutTextNotes <> nil then
begin
FreeAndNil(OutTextNotes);
end;
if FModConnsOtherSides <> nil then
begin
//FModConnsOtherSides.Clear;
//FModConnsOtherSides.Free;
FreeAndNil(FModConnsOtherSides);
end;
if Length(FActualZOrder) > 0 then
SetLength(FActualZOrder, 0);
if Length(FJoinedConnectorsIndexes) > 0 then
SetLength(FJoinedConnectorsIndexes, 0);
if Length(FJoinedConnectorsIndexesForGrp) > 0 then
SetLength(FJoinedConnectorsIndexesForGrp, 0);
if FindSnapTimer <> nil then
FreeAndNil(FindSnapTimer);
// 21.09.2105 Tolik GCadForm.PCad.Figures ñþäà óæå ìîæåò êàê nil ïîïàñòü, ïîòîìó ëó÷øå âîîáùå òàê íå äåëàòü,
// ÷òîáû íå íàðâàòüñÿ íà AV íà ïóñòîì ìåñòå
{ if FDrawFigure <> nil then
begin
if GCadForm.PCad.Figures.IndexOf(FDrawFigure) = -1 then
FDrawFigure.Free;
end;}
{ if CaptionsGroup <> nil then
begin
i := GCadForm.PCad.Figures.IndexOf(Self.CaptionsGroup);
if i <> -1 then
begin
GCadForm.PCad.Figures.Delete(i);
try
FreeAndNil(Self.CaptionsGroup);
Except
on E: Exception do
showmessage(inttostr(i));
end;
end
else
begin
beep;
end;
end;
if NotesGroup <> nil then
begin
i := GCadForm.PCad.Figures.IndexOf(Self.NotesGroup);
if i <> -1 then
begin
GCadForm.PCad.Figures.Delete(i);
try
FreeAndNil(Self.NotesGroup);
Except
on E: Exception do
showmessage(inttostr(i));
end;
end
else
begin
beep;
end;
end; }
//
inherited;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Destroy', E.Message);
end;
end;
procedure TConnectorObject.WriteToStream(Stream: TStream);
var
xInt: integer;
xIntL: word;
xIntH: word;
xStr: string;
xDbl: double;
i: integer;
xParam: byte;
GetGroupObject: TSCSFigureGrp;
FiguresList: TList;
l0, l1, l2: Integer;
begin
try
inherited;
//
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
// DrawFigure
if DrawFigure <> nil then
begin
xInt := FiguresList.IndexOf(DrawFigure);
l0 := GCadForm.Pcad.GetLayerHandle(0);
l1 := GCadForm.Pcad.GetLayerHandle(1);
l2 := GCadForm.Pcad.GetLayerHandle(2);
WriteField(20, Stream, xInt, sizeof(xInt));
end;
// ConnectorType
xInt := Ord(ConnectorType);
WriteField(21, Stream, xInt, sizeof(xInt));
// ñîõðàíèòü CaptionsGroup
xInt := FiguresList.IndexOf(CaptionsGroup);
WriteField(22, Stream, xInt, sizeof(xInt));
// ñîõðàíèòü FObjectFromRaise
if FObjectFromRaise <> nil then
begin
GetGroupObject := TConnectorObject(FObjectFromRaise).FGroupObject;
if GetGroupObject = nil then
begin
xInt := FiguresList.IndexOf(FObjectFromRaise);
WriteField(23, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(78, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := GetGroupObject.InFigures.IndexOf(FObjectFromRaise);
WriteField(23, Stream, xInt, sizeof(xInt));
xInt := FiguresList.IndexOf(GetGroupObject);
WriteField(78, Stream, xInt, sizeof(xInt));
end;
end
else
begin
xInt := -1;
WriteField(23, Stream, xInt, sizeof(xInt));
xInt := -1;
WriteField(78, Stream, xInt, sizeof(xInt));
end;
// ConnectorFullness
xInt := Ord(FConnFullness);
WriteField(24, Stream, xInt, sizeof(xInt));
// Save FID_ListToPassage
xInt := FID_ListToPassage;
WriteField(25, Stream, xInt, sizeof(xInt));
// Save FID_ConnToPassage
xInt := FID_ConnToPassage;
WriteField(26, Stream, xInt, sizeof(xInt));
// Save FConnRaiseType
xInt := Ord(FConnRaiseType);
WriteField(27, Stream, xInt, sizeof(xInt));
// Save FBlockID
xInt := FBlockID;
WriteField(28, Stream, xInt, sizeof(xInt));
// Save FObjectType
xInt := FObjectType;
WriteField(29, Stream, xInt, sizeof(xInt));
// ñîõðàíèòü NotesGroup
xInt := FiguresList.IndexOf(NotesGroup);
WriteField(30, Stream, xInt, sizeof(xInt));
// FNotesRowType
xInt := Ord(FNotesRowsType);
WriteField(31, Stream, xInt, sizeof(xInt));
// FNetworkType
xInt := $0;
if nt_Computer in FNetworkTypes then
xInt := xInt + cComputer_nt;
if nt_Telephon in FNetworkTypes then
xInt := xInt + cTelephon_nt;
if nt_Television in FNetworkTypes then
xInt := xInt + cTelevision_nt;
if nt_Gas in FNetworkTypes then
xInt := xInt + cGas_nt;
if nt_Electric in FNetworkTypes then
xInt := xInt + cElectric_nt;
WriteField(32, Stream, xInt, sizeof(xInt));
// Save JoinedConnectorsList
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
GetGroupObject := TConnectorObject(JoinedConnectorsList[i]).FGroupObject;
if GetGroupObject = nil then
begin
xIntL := FiguresList.IndexOf(JoinedConnectorsList[i]);
xIntH := $FFFF;
xInt := MakeLong(xIntL, xIntH);
if ((33 + i) <= 72) then
WriteField(33 + i, Stream, xInt, sizeof(xInt));
// xIntH := -1;
// if ((53 + i) <= 72) then
// WriteField(53 + i, Stream, xInt, sizeof(xInt));
end
else
begin
xIntL := GetGroupObject.InFigures.IndexOf(JoinedConnectorsList[i]);
xIntH := FiguresList.IndexOf(GetGroupObject);
xInt := MakeLong(xIntL, xIntH);
if ((33 + i) <= 72) then
WriteField(33 + i, Stream, xInt, sizeof(xInt));
// if ((53 + i) <= 72) then
// WriteField(53 + i, Stream, xInt, sizeof(xInt));
end;
end;
// Save FConnRaiseType
xInt := Ord(FDefectDegree);
WriteField(75, Stream, xInt, sizeof(xInt));
// FComponID
xInt := FComponID;
WriteField(76, Stream, xInt, sizeof(xInt));
// FHouse
if FHouse <> nil then
begin
xInt := FiguresList.IndexOf(FHouse);
WriteField(77, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(77, Stream, xInt, sizeof(xInt));
end;
// FCaptionsFontColor
xInt := FCaptionsFontColor;
WriteField(79, Stream, xInt, sizeof(xInt));
// FNotesFontColor
xInt := FNotesFontColor;
WriteField(80, Stream, xInt, sizeof(xInt));
// FBlockCount
xInt := FBlockCount;
WriteField(81, Stream, xInt, sizeof(xInt));
// FGroupObject
if FGroupObject <> nil then
begin
xInt := FiguresList.IndexOf(FGroupObject);
WriteField(82, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(82, Stream, xInt, sizeof(xInt));
end;
// FCaptionsFontSize
xInt := FCaptionsFontSize;
WriteField(83, Stream, xInt, sizeof(xInt));
// FNotesFontSize
xInt := FNotesFontSize;
WriteField(84, Stream, xInt, sizeof(xInt));
// FCabinetID
xInt := FCabinetID;
WriteField(85, Stream, xInt, sizeof(xInt));
// FIndex
xInt := FIndex;
WriteField(86, Stream, xInt, sizeof(xInt));
// FCaptionsViewType
xInt := Ord(FCornerType);
WriteField(87, Stream, xInt, sizeof(xInt));
// FCaptionsViewType
xInt := Ord(FCaptionsViewType);
WriteField(88, Stream, xInt, sizeof(xInt));
// FJoinedListIDForBox
xInt := Ord(FJoinedListIDForBox);
WriteField(89, Stream, xInt, sizeof(xInt));
// Save MarkingList
for i := 0 to OutTextCaptions.Count - 1 do
begin
xStr := OutTextCaptions.Strings[i];
if ((180 + i) <= 210) then
begin
WriteStrField(180 + i, Stream, xStr);
xStr := ReadStringFromStream(Stream);
end
end;
xStr := FTrunkName;
WriteStrField(211, Stream, xStr);
xStr := FBlockGUID;
WriteStrField(212, Stream, xStr);
// FCaptionsNotesFontName
xStr := FCaptionsFontName;
WriteStrField(213, Stream, xStr);
xStr := FNotesFontName;
WriteStrField(214, Stream, xStr);
// ActualPoints
xDbl := ActualPoints[1].x;
WriteField(220, Stream, xDbl, sizeof(xDbl));
xDbl := ActualPoints[1].y;
WriteField(221, Stream, xDbl, sizeof(xDbl));
xDbl := ActualZOrder[1];
WriteField(222, Stream, xDbl, sizeof(xDbl));
// GrpSize
xDbl := GrpSizeX;
WriteField(223, Stream, xDbl, sizeof(xDbl));
xDbl := GrpSizeY;
WriteField(224, Stream, xDbl, sizeof(xDbl));
xDbl := FDrawFigureAngle;
WriteField(225, Stream, xDbl, sizeof(xDbl));
// DrawFigure Percent Image
xDbl := FOriginalSizeX;
WriteField(226, Stream, xDbl, sizeof(xDbl));
xDbl := FOriginalSizeY;
WriteField(227, Stream, xDbl, sizeof(xDbl));
xDbl := FDrawFigurePercent;
WriteField(228, Stream, xDbl, sizeof(xDbl));
// RaiseShift
xDbl := FRaiseShiftX;
WriteField(229, Stream, xDbl, sizeof(xDbl));
xDbl := FRaiseShiftY;
WriteField(230, Stream, xDbl, sizeof(xDbl));
// ôëàã îòîáðàæåíèÿ ïîäïèñåé
if ShowCaptions = true then
xParam := 0
else
xParam := 1;
WriteField(101, Stream, xParam, sizeof(xParam));
// ôëàã îòîáðàæåíèÿ âûíîñîê
if ShowNotes = true then
xParam := 0
else
xParam := 1;
WriteField(102, Stream, xParam, sizeof(xParam));
// ñâ-âà èçìåíåíííûõ ïîëåé
if FIsNameChanged then
xParam := 0
else
xParam := 1;
WriteField(103, Stream, xParam, sizeof(xParam));
if FIsCaptionsChanged then
xParam := 0
else
xParam := 1;
WriteField(104, Stream, xParam, sizeof(xParam));
if FIsNoteschanged then
xParam := 0
else
xParam := 1;
WriteField(105, Stream, xParam, sizeof(xParam));
if FIsBlockChanged then
xParam := 0
else
xParam := 1;
WriteField(106, Stream, xParam, sizeof(xParam));
// ìåíÿëñÿ ëè òèï óãîëêà
if FCornerTypeChangedByUser then
xParam := 0
else
xParam := 1;
WriteField(107, Stream, xParam, sizeof(xParam));
// êàê çåðêàëüíîå îòîáðàæåíèå
if FMirrored then
xParam := 0
else
xParam := 1;
WriteField(108, Stream, xParam, sizeof(xParam));
// ïîäíÿòü ñîñòîÿíèå "êàê êîíå÷íûé îáúåêò"
if AsEndPoint then
xParam := 0
else
xParam := 1;
WriteField(109, Stream, xParam, sizeof(xParam));
// House
if FIsApproach then
xParam := 0
else
xParam := 1;
WriteField(110, Stream, xParam, sizeof(xParam));
if FIsHouseJoined then
xParam := 0
else
xParam := 1;
WriteField(111, Stream, xParam, sizeof(xParam));
if FDrawFigureMoved then
xParam := 0
else
xParam := 1;
WriteField(112, Stream, xParam, sizeof(xParam));
except
on E: Exception do addExceptionToLogEx('TConnectorObject.WriteToStream' + Self.FMark, E.Message);
end;
end;
procedure TConnectorObject.SetPropertyFromStream(xCode: Byte;
data: Pointer; size: Integer);
var
xStr: string;
xInt: integer;
xIntL: word;
xIntH: word;
FindCode: integer;
xParam: byte;
DataP: PChar;
begin
try
inherited;
case xCode of
220: GConnectorPoints.x := pDouble(data)^;
221: GConnectorPoints.y := pDouble(data)^;
222: ActualZOrder[1] := pDouble(data)^;
223: GrpSizeX := pDouble(data)^;
224: GrpSizeY := pDouble(data)^;
225: FDrawFigureAngle := pDouble(data)^;
//
226: FOriginalSizeX := pDouble(data)^;
227: FOriginalSizeY := pDouble(data)^;
228: FDrawFigurePercent := pDouble(data)^;
229: FRaiseShiftX := pDouble(data)^;
230: FRaiseShiftY := pDouble(data)^;
20: begin
xInt := pInt(data)^;
FDrawFigureIndex := xInt;
FCornerType := GCadForm.FDefaultCornerType;
FCabinetID := -1;
tmpParentDupID := -1;
FCaptionsFontSize := -1;
FNotesFontSize := -1;
FCaptionsFontColor := -1;
FNotesFontColor := -1;
FGroupObjectIndex := -1;
//
FOriginalSizeX := -1;
FOriginalSizeY := -1;
FDrawFigurePercent := 100;
FCaptionsFontName := GCadForm.FFontName;
FNotesFontName := GCadForm.FFontName;
FBlockCount := 2;
FRaiseShiftX := 1;
FRaiseShiftY := 1;
//
FObjectFromRaiseIndexForGrp := -1;
FDefectDegree := dodNormal;
FHouseIndex := -1;
FIsApproach := False;
FIsHouseJoined := False;
FDrawFigureMoved := false;
end;
21: begin
xInt := pInt(data)^;
FConnectorType := TConnectorType(xInt);
end;
22: begin
xInt := pInt(data)^;
FCaptionsGroupIndex := xInt;
end;
23: begin
xInt := pInt(data)^;
FObjectFromRaiseIndex := xInt;
end;
24: begin
xInt := pInt(data)^;
FConnFullness := TComponInterfacesFullness(xInt);
end;
25: begin
xInt := pInt(data)^;
FID_ListToPassage := xInt;
end;
26: begin
xInt := pInt(data)^;
FID_ConnToPassage := xInt;
end;
27: begin
xInt := pInt(data)^;
FConnRaiseType := TConnRaiseType(xInt);
end;
28: begin
xInt := pInt(data)^;
FBlockID := xInt;
end;
29: begin
xInt := pInt(data)^;
FObjectType := xInt;
end;
30: begin
xInt := pInt(data)^;
FNotesGroupIndex := xInt;
end;
31: begin
xInt := pInt(data)^;
FNotesRowsType := TNotesRowsType(xInt);
end;
32: begin
// FNetworkType
xInt := pInt(data)^;
FNetworkTypes := [];
if xInt and cComputer_nt = cComputer_nt then
FNetworkTypes := FNetworkTypes + [nt_Computer];
if xInt and cTelephon_nt = cTelephon_nt then
FNetworkTypes := FNetworkTypes + [nt_Telephon];
if xInt and cTelevision_nt = cTelevision_nt then
FNetworkTypes := FNetworkTypes + [nt_Television];
if xInt and cGas_nt = cGas_nt then
FNetworkTypes := FNetworkTypes + [nt_Gas];
if xInt and cElectric_nt = cElectric_nt then
FNetworkTypes := FNetworkTypes + [nt_Electric];
end;
75: begin
xInt := pInt(data)^;
FDefectDegree := TDefectDegree(xInt);
end;
76: begin
xInt := pInt(data)^;
FComponID := xInt;
end;
77: begin
xInt := pInt(data)^;
FHouseIndex := xInt;
end;
78: begin
xInt := pInt(data)^;
FObjectFromRaiseIndexForGrp := xInt;
end;
79: begin
xInt := pInt(data)^;
FCaptionsFontColor := xInt;
end;
80: begin
xInt := pInt(data)^;
FNotesFontColor := xInt;
end;
81: begin
xInt := pInt(data)^;
FBlockCount := xInt;
end;
82: begin
xInt := pInt(data)^;
FGroupObjectIndex := xInt;
end;
83: begin
xInt := pInt(data)^;
FCaptionsFontSize := xInt;
end;
84: begin
xInt := pInt(data)^;
FNotesFontSize := xInt;
end;
85: begin
xInt := pInt(data)^;
FCabinetID := xInt;
end;
86: begin
xInt := pInt(data)^;
FIndex := xInt;
end;
87: begin
xInt := pInt(data)^;
FCornerType := TCornerType(xInt);
end;
88: begin
xInt := pInt(data)^;
FCaptionsViewType := TConnCaptionsViewType(xInt);
end;
89: begin
xInt := pInt(data)^;
FJoinedListIDForBox := xInt;
end;
101: begin
xParam := pByte(data)^;
if xParam = 0 then
ShowCaptions := true
else
ShowCaptions := false;
end;
102: begin
xParam := pByte(data)^;
if xParam = 0 then
ShowNotes := true
else
ShowNotes := false;
end;
103: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsNameChanged := true
else
FIsNameChanged := false;
end;
104: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsCaptionsChanged := true
else
FIsCaptionsChanged := false;
end;
105: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsNotesChanged := true
else
FIsNotesChanged := false;
end;
106: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsBlockChanged := true
else
FIsBlockChanged := false;
end;
107: begin
xParam := pByte(data)^;
if xParam = 0 then
FCornerTypeChangedByUser := true
else
FCornerTypeChangedByUser := false;
end;
108: begin
xParam := pByte(data)^;
if xParam = 0 then
FMirrored := true
else
FMirrored := false;
end;
109: begin
xParam := pByte(data)^;
if xParam = 0 then
AsEndPoint := true
else
AsEndPoint := false;
end;
110: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsApproach := true
else
FIsApproach := false;
end;
111: begin
xParam := pByte(data)^;
if xParam = 0 then
FIsHouseJoined := true
else
FIsHouseJoined := false;
end;
112: begin
xParam := pByte(data)^;
if xParam = 0 then
FDrawFigureMoved := true
else
FDrawFigureMoved := false;
end;
211: begin
DataP := data;
xStr := DataP;
FTrunkName := xStr;
end;
212: begin
DataP := data;
xStr := DataP;
FBlockGUID := xStr;
end;
213: begin
DataP := data;
xStr := DataP;
FCaptionsFontName := xStr;
end;
214: begin
DataP := data;
xStr := DataP;
FNotesFontName := xStr;
end;
end;
if (xCode >= 33) AND (xCode <= 72) then
begin
FindCode := Length(FJoinedConnectorsIndexes);
FindCode := FindCode + 1;
SetLength(FJoinedConnectorsIndexes, FindCode);
SetLength(FJoinedConnectorsIndexesForGrp, FindCode);
xInt := pInt(data)^;
xIntL := LoWord(DWord(xInt));
xIntH := HiWord(DWord(xInt));
FJoinedConnectorsIndexes[FindCode - 1] := xIntL;
if xIntH = 0 then
xIntH := $FFFF;
FJoinedConnectorsIndexesForGrp[FindCode - 1] := xIntH;
end;
// if (xCode >= 53) AND (xCode <= 72) then
// begin
// xInt := pInt(data)^;
// FJoinedConnectorsIndexesForGrp[xCode - 53] := xInt;
// end;
if (xCode >= 180) AND (xCode <= 210) then
begin
DataP := data;
xStr := DataP;
OutTextCaptions.Add(xStr);
end;
FDrawFigure := nil;
CaptionsGroup := nil;
NotesGroup := nil;
ActualPoints[1] := GConnectorPoints;
// ïåðåñîçäàòü OutText
if OutTextCaptions = nil then
OutTextCaptions := TStringList.Create;
if OutTextNotes = nil then
begin
OutTextNotes := TStringList.Create;
if ID <> 0 then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).AddSCSFigure(Self);
end;
// ïåðåñîçäàòü RemJoined
if RemJoined = nil then
RemJoined := TList.Create;
// ïåðåñîçäàòü JoinedOrtholinesList
if JoinedOrtholinesList = nil then
JoinedOrtholinesList := TList.Create;
// ïåðåñîçäàòü JoinesConnectorsList
if JoinedConnectorslist = nil then
JoinedConnectorslist := TList.Create;
TF_CAD(TPowerCad(Owner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetPropertyFromStream', E.Message);
end;
end;
//==============================================================================
//============= TFigureGrpMod ==================================================
//==============================================================================
function TFigureGrpMod.duplicate: TFigure;
var
i: integer;
TempFig: TFigure;
CurFig: TFigure;
TempWMF: TWMFObject;
TempPath: string;
//08.09.2011 Buffer: array[0..1023] of Char;
begin
try
Result := nil;
Result := TFigureGrpMod.Create(LayerHandle, Owner);
for i := 0 to InFigures.Count - 1 do
begin
try
if CheckFigureByClassName(TFigure(InFigures[i]), 'TWMFObject') then
begin
TempWMF := TWMFObject(InFigures[i]);
TempPath := GetAnsiTempPath; //08.09.2011 SetString(TempPath, Buffer, GetTempPath(Sizeof(Buffer) - 1, Buffer));
TempWMF.MetaFile.SaveToFile(TempPath + 'tempWMF.bmp');
TempWMF.PictureName := TempPath + 'tempWMF.bmp';
TempFig := TempWMF.Duplicate;
end
else
begin
TempFig := TFigure(InFigures[i]).Duplicate;
end;
except
end;
TFigureGrpMod(Result).AddFigure(TempFig);
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpMod.duplicate', E.Message);
end;
end;
// Tolik -- 11/08/2017 -- óäàëèòü àâòîñîçäàííûå ôèãóðû èç
// ãðóïïîâîé ôèãóðû
procedure TFigureGrpMod.RemoveAutoCreatedFigures;
var i: Integer;
InFigure: TFigure;
begin
if not Self.Deleted then
if Assigned(infigures) then
begin
for i := (infigures.Count - 1) downto 0 do
begin
inFigure := TFigure(inFigures[i]);
if inFigure.isAutoCreatedFigure = biTrue then
begin
inFigures.Remove(inFigure);
if not inFigure.Deleted then
inFigure.Free;
end;
end;
end;
end;
procedure TFigureGrpMod.GetBounds(var figMaxX, figMaxY, figMinX, figMinY: Double);
begin
inherited;
{ test
figMaxX := -1000;
figMaxY := -1000;
figMinX := -1000;
figMinY := -1000;
GProcCnt := GProcCnt + 1;}
end;
procedure TFigureGrpMod.getModPoints(ModList: TMyList);
begin
if fFromApproach <> nil then
inherited
else
if LayerHandle = LongInt(TPowerCad(Owner).Layers[1]) then
inherited
end;
function TFigureGrpMod.IsPointIn(x, y: Double): Boolean;
var
apoint : TDoublePoint;
a: integer;
nx,ny,z: Double;
ctrl: Double;
ap,p1,p2,p3,p4: TDoublePoint;
DEngine: TPCDrawEngine;
begin
result := false;
if assigned(Owner) then
if LayerHandle = LongInt(TPowerCad(Owner).Layers[1]) then
begin
try
//Result := False;
//CP := CenterPoint;
//if (x >= ActualPoints[1].x - 0.5) and (x <= ActualPoints[1].x + 0.5) and (y >= ActualPoints[1].y - 0.5) AND (y <= ActualPoints[1].y + 0.5) then
// Result := True;
//Result := inherited IsPointIn(x, y);
apoint := DoublePoint(x,y); ap := aPoint;
p1 := ap1; p2 := ap2; p3 := ap3; p4 := ap4;
if assigned(Owner) then
begin
z:= 0;
DEngine := TPCDrawing(Owner).DEngine;
DEngine.ConvertPoint(ap.x,ap.y,z);
DEngine.ConvertPoint(p1.x,p1.y,z);
DEngine.ConvertPoint(p2.x,p2.y,z);
DEngine.ConvertPoint(p3.x,p3.y,z);
DEngine.ConvertPoint(p4.x,p4.y,z);
end;
if ( ispointinLine(p1,p2,ap,width) or
ispointinLine(p2,p3,ap,width) or
ispointinLine(p3,p4,ap,width) or
ispointinLine(p4,p1,ap,width) ) then
result := true;
except
end;
end;
end;
procedure TFigureGrpMod.select;
begin
try
if fFromApproach <> nil then
begin
if fRMode or fTraceMod then
inherited;
end
else
begin
if assigned(Owner) then
if LayerHandle = LongInt(TPowerCad(Owner).Layers[1]) then
inherited;
end;
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.select', E.Message);
end;
end;
//==============================================================================
//============= TFrame =========================================================
//==============================================================================
function TFrame.IsPointIn(x, y: Double): Boolean;
begin
Result := False;
Result := inherited IsPointIn(x, y);
end;
procedure TFrame.Select;
begin
inherited;
end;
procedure TFrame.WriteToStream(Stream: TStream);
begin
try
inherited;
except
on E: Exception do addExceptionToLogEx('TFrame.WriteToStream', E.Message)
end;
end;
procedure TFrame.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
begin
try
inherited;
except
on E: Exception do addExceptionToLogEx('TFrame.SetPropertyFromStream', E.Message)
end;
end;
//Procedure TConnectorObject.AddAutoCreatedObjsToDrawFigure(Angle, aTransparency: Integer; cpx, cpy, Radius, CutRadius: Double; FillColor: TColor; aCutStyle: TPieCutStyle; aRotateAngle: integer = -1);
Procedure TConnectorObject.AddAutoCreatedObjsToDrawFigure(AFigClassName: String; AParamList: TStringList);
var i: Integer;
PieFigure: TPie;
EllFigure: TOverLappedEllipse;
ap1: TDoublePoint;
MaxX, MaxY, MinX, MinY: Double;
Angle, FAngle, SAngle: double;
TransParency: Integer;
cpx, cpy, Radius, CutRadius: Double;
FillColor: TColor;
CutStyle: TPieCutStyle;
RotateAngle: integer;
cX, cY, cX1, cY1, Rad1, Rad2, CutRad1, CutRad2: Double;
w,s,c,abrs,abrc:integer;
LHandle: LongInt;
begin
if DrawFigure = nil then
exit;
if AParamList = nil then
exit;
// åñëè äîáàâëÿåì ñåêòîð
if aFigClassName = 'TPie' then
begin
if AParamList.Count < 9 then // åñëè íå õâàòàåò ïàðàìåòðîâ -- íàõ
exit;
Angle := StrToFloat_My(aParamList[0]); // óãîë
TransParency := StrToInt(aParamList[1]); //ïðîçðà÷íîñòü
cpx := StrToFloat_My(aParamList[2]); // öåíòðÕ
cpy := StrToFloat_My(aParamList[3]); // öåíòðÓ
Radius := StrToFloat_My(aParamList[4]); // ðàäèóñ
CutRadius := StrToFloat_My(aParamList[5]);// îáðåçêà
FillColor := StrToInt(aParamList[6]);//öâåò
CutStyle := TPieCutStyle(StrToInt(aParamList[7])); // ñòèëü îáðåçêè
RotateAngle := StrToInt(aParamList[8]); // óãîë ïîâîðîòà
// Tolik 31/10/2019 --
{
Sangle := (360 - Angle/2)/180*PI;
FAngle := (Angle/360)*PI;
}
while Angle > 360 do
Angle := Angle - 360;
if Angle = 360 then
begin
Sangle := 0;
FAngle := 2*PI;
end
else
begin
Sangle := (360 - Angle/2)/180*PI;
FAngle := (Angle/360)*PI;
end;
//
// DrawFigure.GetBounds(MaxX, MaxY, MinX, MinY);
{AP1.y := (MaxY + MinY)/2;
AP1.x := (MaxX);}
AP1.x := cpx;
AP1.y := cpy;
PieFigure := TPie.Create(
ap1.x,
ap1.y,
radius,
SAngle,
FAngle,
GCadForm.PCad.DefaultPenWidth,
ord(GCadForm.PCad.DefaultPenStyle),
GCadForm.PCad.DefaultPenColor,
//ord(cad.DefaultBrushStyle),
1,
{clSkyBlue}
FillColor,
DrawFigure.LayerHandle,mydsNormal,DrawFigure.Owner,
CutStyle{PieLinearCut}, CutRadius);
PieFigure.Transparency := TransParency;
PieFigure.isAutoCreatedFigure := biTrue; // autocreated figure
if Angle <> 360 then // 01/11/2019 -- åñëè çîíà êðóãëàÿ, ÿñåí ïåíü, âðàùàòü íå íóæíî ...
if RotateAngle <> -1 then
PieFigure.Rotate((RotateAngle/180)*PI, DoublePoint(cpx, cpy));
// GCadForm.PCad.AddCustomFigure (GLN(PieFigure.LayerHandle), PieFigure, False);
//DrawFigure.AddToGrp(PieFigure);
//FAngle := 0;
if Angle <> 360 then // 01/11/2019 -- åñëè çîíà êðóãëàÿ, ÿñåí ïåíü, âðàùàòü íå íóæíî ...
PieFigure.Rotate(FDrawFigureAngle, Self.DrawFigure.CenterPoint);//DoublePoint(cpx, cpy)); //Self.DrawFigure.CenterPoint);//DoublePoint(cpx, cpy));
DrawFigure.AddFigure(PieFigure); //òàê ïðàâèëüíåå
end
else
if aFigClassName = 'TOverLappedEllipse' then
begin
cx := StrToFloat_My(aParamList[0]); // öåíòðÕ
cy := StrToFloat_My(aParamList[1]); // öåíòðÓ
cx1 := StrToFloat_My(aParamList[2]); // öåíòðÕ
cy1 := StrToFloat_My(aParamList[3]); // öåíòðÓ
Rad1 := StrToFloat_My(aParamList[4]);
Rad2 := StrToFloat_My(aParamList[5]);
CutRad1 := StrToFloat_My(aParamList[6]);
CutRad2 := StrToFloat_My(aParamList[7]);
FillColor := StrToInt(aParamList[8]); // öâåò çàëèâêè
TransParency := StrToInt(aParamList[9]); // ïðîçðà÷íîñòü
EllFigure := TOverlappedEllipse.create(cX, cY, cX1, cY1, Rad1, Rad2, CutRad1, CutRad2,1,1,1,1,clRed,
DrawFigure.LayerHandle, TDrawStyle(1), nil);
EllFigure.TransParency := TransParency;
EllFigure.isAutoCreatedFigure := biTrue;
//EllFigure.Owner := GCadForm.PCad;
EllFigure.Rotate(FDrawFigureAngle, Self.DrawFigure.CenterPoint);
//DrawFigure.AddFigure(EllFigure); //òàê ïðàâèëüíåå
DrawFigure.InsertFigure(EllFigure);
end;
end;
procedure TConnectorObject.SetConnectorType(const Value: TConnectorType);
var
i: integer;
deltax, deltay: Double;
LHandle: integer;
Bnd: TDoubleRect;
CaptionsLHandle: integer;
NotesLHandle: integer;
begin
try
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
end;
FConnectorType := Value;
//Tolik 18/12/2019 --
if FDrawFigure <> nil then
begin
GCadForm.PCad.Figures.Remove(FDrawFigure);
FreeAndNil(FDrawFigure);
end;
//
FDrawFigure := GetConnectorImg(FConnectorType);
if DrawFigure <> nil then
Bnd := DrawFigure.GetBoundRect;
GrpSizeX := Bnd.Right - Bnd.Left;
GrpSizeY := Bnd.Bottom - Bnd.Top;
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
if (GCadForm.PCad <> nil) AND (DrawStyle <> dsTrace) then
begin
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
Bnd := DrawFigure.GetBoundRect;
GrpSizeX := Bnd.Right - Bnd.Left;
GrpSizeY := Bnd.Bottom - Bnd.Top;
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
DrawFigure.ActualPoints[1] := DoublePoint((Bnd.Left + Bnd.Right) / 2 - GrpSizeX / 2,
(Bnd.Top + Bnd.Bottom) / 2 - GrpSizeY / 2);
deltax := ActualPoints[1].x - GrpSizeX / 2 - DrawFigure.ActualPoints[1].x;
deltay := ActualPoints[1].y - GrpSizeY / 2 - DrawFigure.ActualPoints[1].y;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(FLHandle), DrawFigure, False));
GCadForm.PCad.AddCustomFigure (GLN(FLHandle), DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
// óáðàòü CaptionsGroup è NotesGroup
if ConnectorType = ct_Clear then
begin
if CaptionsGroup <> nil then
begin
if CheckFigureByClassName(CaptionsGroup, cTFigureGrpNotMod) then
RemoveInFigureGrp(TFigureGrp(CaptionsGroup));
GCadForm.PCad.Figures.Remove(CaptionsGroup);
FreeAndNil(CaptionsGroup);
end;
if NotesGroup <> nil then
begin
RemoveInFigureGrp(TFigureGrp(NotesGroup));
GCadForm.PCad.Figures.Remove(NotesGroup);
FreeAndNil(NotesGroup);
end;
end;
if ConnectorType <> ct_Clear then
if NotesGroup <> nil then
ReCreateNotesGroup(True);
end
else
begin
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetConnectorType', E.Message);
end;
end;
// Tolik 21/11/2016--
// ñòàðàÿ çàêîììåí÷åíà (ñì. íèæå)
// çäåñü ïåðåïèñàíî (äîïèñàíî), ÷òîáû íå ïèçäàíóòü íóæíûé ðàéç íà ïîèíòå
procedure TConnectorObject.Delete(Recurse: Boolean = True; DelRaise: Boolean = True);
var
i, j: integer;
JoinedConn: TConnectorObject;
RaiseLine: TOrthoLine;
RaiseConn: TConnectorObject;
ConnectedConn: TConnectorObject;
ListOfPassage: TF_CAD;
ConnOfPassage: TConnectorObject;
JoinedLine: TOrthoLine;
CurGCadForm: TF_CAD;
ObjParams: TObjectParams;
SnappedList: TList;
PrevConnector: TConnectorObject;
// Tolik -- 23/09/2016 --
ActualPX, ActualPY: Double;
CanDelTrunkConnector: Boolean;
// Tolik 22/11/2016 --
// ïðîöåäóðà ïðîâåðêè óäàëåíèÿ ðàéçà, åñëè óäàëÿåì òî÷å÷íûé îáúåêò (ÍÅ ÏÓÑÒÎÉ ÊÎÍÍÅÊÒÎÐ!!!)
Procedure CheckDeleteRaiseOnPointObject;
var RConn1, RConn2, TrunkConn: TConnectorObject;
isTrunk: Boolean; //
Line1Count, Line2Count: Integer;
CanDelRaise: Boolean;
function CheckCanDelTrunk: Boolean;
var
i: Integer;
ListOfPassage: TF_CAD;
ConnOfPassage: TConnectorObject;
CurGCadForm: TF_CAD;
SCSFigureGrp: TSCSFigureGrp;
RelatedConn1, RelatedConn2: TConnectorObject;
RelatedRaise: TOrthoLine;
CanDelRelatedRaise: Boolean;
begin
Result := False;
if not CanDelTrunkConnector then
exit;
try
ListOfPassage := GetListOfPassage(TrunkConn.FID_ListToPassage);
if ListOfPassage <> nil then
begin
RelatedRaise := Nil;
CanDelRelatedRaise := False;
ConnOfPassage := TConnectorObject(GetFigureByID(ListOfPassage, TrunkConn.FID_ConnToPassage));
if ConnOfPassage <> nil then
begin
CurGCadForm := GCadForm;
GCadForm := ListOfPassage;
for i := 0 to ConnOfPassage.JoinedOrtholinesList.Count - 1 do
begin
if TOrthoLine(ConnOfPassage.JoinedOrtholinesList[i]).FIsRaiseUpDown then
begin
RelatedRaise := TOrthoLine(ConnOfPassage.JoinedOrtholinesList[i]);
Break; //// BREAK ////;
end;
end;
if RelatedRaise <> nil then
begin
if (RelatedRaise.JoinConnector1 <> nil) and (not TConnectorObject(RelatedRaise.JoinConnector1).Deleted) then
begin
if (TConnectorObject(RelatedRaise.JoinConnector1).RemJoined.IndexOf(RelatedRaise) = -1) and
(TConnectorObject(RelatedRaise.JoinConnector1).JoinedOrtholinesList.Count - TConnectorObject(RelatedRaise.JoinConnector1).RemJoined.Count = 1) then
CanDelRelatedRaise := True;
end
else
CanDelRelatedRaise := True;
if not CanDelRelatedRaise then
begin
if (RelatedRaise.JoinConnector2 <> nil) and (not TConnectorObject(RelatedRaise.JoinConnector2).Deleted) then
begin
if (TConnectorObject(RelatedRaise.JoinConnector2).RemJoined.IndexOf(RelatedRaise) = -1) and
(TConnectorObject(RelatedRaise.JoinConnector2).JoinedOrtholinesList.Count - TConnectorObject(RelatedRaise.JoinConnector2).RemJoined.Count = 1) then
CanDelRelatedRaise := True;
end
end;
end;
if CanDelRelatedRaise then
begin
if RelatedRaise.FGroupObject = nil then
RelatedRaise.Delete
else
begin
SCSFigureGrp := RelatedRaise.FGroupObject;
if (not SCSFigureGrp.Deleted) then
begin
SCSFigureGrp.RemoveFromGrp(RelatedRaise);
SCSFigureGrp.RemoveFromGrp(RelatedRaise.JoinConnector1);
SCSFigureGrp.RemoveFromGrp(RelatedRaise.JoinConnector2);
RelatedRaise.Delete;
end;
end;
{ConnOfPassage.FConnRaiseType := crt_None;
ConnOfPassage.Delete(True);}
RefreshCAD(GCadForm.PCad);
end;
GCadForm := CurGCadForm;
end;
{else
begin
SCSFigureGrp := GetSCSFigureGrp(ListOfPassage, aItRaise.FID_ConnToPassage);
if SCSFigureGrp <> nil then
begin
ConnOfPassage := TConnectorObject(GetFigureByIDInSCSFigureGrp(SCSFigureGrp, aItRaise.FID_ConnToPassage));
if ConnOfPassage <> nil then
begin
CurGCadForm := GCadForm;
GCadForm := ListOfPassage;
// ConnOfPassage.FConnRaiseType := crt_None;
DeleteObjectFromSCSFigureGrp(SCSFigureGrp, ConnOfPassage);
RefreshCAD(GCadForm.PCad);
GCadForm := CurGCadForm;
end;
end;
end;}
end;
except
on E: Exception do addExceptionToLogEx('U_ESCadClasses.TConnectorObject.Delete.CheckDeleteRaiseOnPointObject', E.Message);
end;
end;
begin
if RaiseLine = nil then
exit;
isTRunk := False;
Line1Count := 0;
Line2Count := 0;
TrunkConn := nil;
RConn1 := TConnectorObject(RaiseLine.JoinConnector1);
RConn2 := TConnectorObject(RaiseLine.JoinConnector2);
if (RConn1 <> nil) and (not RConn1.Deleted) and (RConn2 <> nil) and (not RConn2.Deleted) then
begin
Line1Count := RConn1.JoinedOrthoLinesList.Count - RConn1.RemJoined.Count;
Line2Count := RConn2.JoinedOrtholinesList.Count - RConn2.RemJoined.Count;
if (RConn1.FConnRaiseType = crt_BetweenFloorUp) or (RConn1.FConnRaiseType = crt_BetweenFloorDown) or
(RConn1.FConnRaiseType = crt_TrunkUp) or (RConn1.FConnRaiseType = crt_TrunkDown) then
begin
isTrunk := True;
TrunkConn := RConn1;
end
else
if (RConn2.FConnRaiseType = crt_BetweenFloorUp) or (RConn2.FConnRaiseType = crt_BetweenFloorDown) or
(RConn2.FConnRaiseType = crt_TrunkUp) or (RConn2.FConnRaiseType = crt_TrunkDown) then
begin
isTrunk := True;
TrunkConn := RConn2;
end;
if isTrunk then
CanDelRaise := CheckCanDelTrunk
else
begin
//Tolik 15/11/2019 --
{ if (Line1Count <= 1) or (Line2Count <= 1) then
CanDelRaise := True;}
if (Line1Count <= 1) then
if RConn1.JoinedConnectorsList.Count = 0 then
CandelRaise := true;
if (Line2Count <= 1) then
if RConn2.JoinedConnectorsList.Count = 0 then
CanDelRaise := True;
end;
end
else
CanDelRaise := True;
if CanDelRaise then
RaiseLine.Delete;
end;
//
// Tolik 15/03/2017 --
function checkCanSnapConnToConn(conn1, conn2: TConnectorObject): Boolean;
var i: Integer;
RaiseLine: TOrthoLine;
begin
RaiseLine := nil;
Result := True;
for i := 0 to conn1.JoinedOrtholinesList.Count - 1 do
begin
if TOrthoLine(conn1.JoinedOrtholinesList[i]).FIsRaiseUpDown then
begin
RaiseLine := TOrthoLine(conn1.JoinedOrtholinesList[i]);
Break; //// BREAK ////;
end;
end;
if RaiseLine = nil then
begin
for i := 0 to conn2.JoinedOrtholinesList.Count - 1 do
begin
if TOrthoLine(conn2.JoinedOrtholinesList[i]).FIsRaiseUpDown then
begin
RaiseLine := TOrthoLine(conn2.JoinedOrtholinesList[i]);
Break; //// BREAK ////;
end;
end;
end;
Result := (RaiseLine = nil);
end;
//
begin
// Tolik -- 21/11/2016-- èáî íåõ òóò âîîáùå!
if deleted then
exit;
//
try
// Tolik 21/05/2019 --
if GPrevFigureTraceTo <> nil then
if ID = GPrevFigureTraceTo.ID then
GPrevFigureTraceTo := nil;
if GPrevFigureSnap <> nil then
if ID = GPrevFigureSnap.ID then
GPrevFigureSnap := nil;
if GFigureSnap <> nil then
if ID = GFigureSnap.ID then
GFigureSnap := nil;
//
// Tolik --25/07/2017 --
//if Self.ConnectorType = ct_Clear then
DeleteObjectFromPM(Self.ID, Self.Name);
//
SnappedList := TList.Create;
RaiseConn := nil;
RaiseLine := Nil;
CanDelTrunkConnector := False;
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
if (TConnectorObject(JoinedConnectorsList[i]) <> nil) and (not TConnectorObject(JoinedConnectorsList[i]).deleted) then
begin
if (TConnectorObject(JoinedConnectorsList[i]).FConnRaiseType = crt_BetweenFloorUp) or
(TConnectorObject(JoinedConnectorsList[i]).FConnRaiseType = crt_BetweenFloorDown) or
(TConnectorObject(JoinedConnectorsList[i]).FConnRaiseType = crt_TrunkUp) or
(TConnectorObject(JoinedConnectorsList[i]).FConnRaiseType = crt_TrunkDown) then
begin
CanDelTrunkConnector := True;
Break; //// BREAK ////;
end;
end;
end;
// Tolik -- 23/09/2016--
ActualPX := Self.ActualPoints[1].x;
ActualPY := Self.ActualPoints[1].y;
//
if Owner <> nil then //07.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
// House
if FIsHouseJoined then
FHouse.fJoined.Remove(Self);
if FIsApproach then
fHouse.fApproaches.Remove(Self);
//
if CheckTrunkObject(Self) then
begin
//Tolik
FreeAndNil(SnappedList);
//
DeleteTrunkObject(Self);
Exit;
end;
// ObjFromRaise
// if DelRaise then
// íà ïóñòîì êîííåêòîðå óäàëÿåì ðàéç ïî-ëþáîìó
if ConnectorType = ct_clear then
begin
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
if (RaiseConn.FConnRaiseType = crt_BetweenFloorUp) or (RaiseConn.FConnRaiseType = crt_BetweenFloorDown) or (RaiseConn.FConnRaiseType = crt_TrunkUp) or (RaiseConn.FConnRaiseType = crt_TrunkDown) then
begin
DeleteRaiseOtherFloor(RaiseConn);
end;
if RaiseConn.ConnectorType = ct_clear then
begin
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
end;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;
RaiseLine := GetRaiseLine(RaiseConn);
if RaiseLine <> nil then
begin
TOrthoLine(RaiseLine).Delete;
// Tolik 25/05/2021 --
//RaiseLine := Nil;
SnappedList.Free;
exit;
//
end;
end
// Tolik -- õåð ìû òàê ðàéç íàéäåì, íóæíî â ëþáîì ñëó÷àå óáåäèòüñÿ, ÷òî ðàéçà íåò íè õ
else
begin
for i := 0 to JoinedOrtholinesList.count - 1 do
begin
if TOrthoLine(JoinedOrthoLinesList[i]).FisRaiseUpDown then
begin
RaiseLine := TOrthoLine(JoinedOrthoLinesList[i]);
break;
end;
end;
if RaiseLine <> nil then
begin
RaiseLine.delete;
//Tolik 25/05/2021 --
//RaiseLine := Nil;
SnappedList.free;
exit;
//
end;
end;
end;
// ýòî êîíå÷íûé îáúåêò
if AsEndPoint then
begin
GEndPoint := Nil;
GListWithEndPoint := Nil;
end;
// ì-ý ïåðåõîä
if (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_TrunkUp) or (FConnRaiseType = crt_TrunkDown)then
begin
DeleteRaiseOtherFloor(Self);
end;
// íà ïîèíòå ðàéç íå óäàëÿåì, à âûñòàâëÿåì è óäàëÿåì ïîòîì (åñëè íóæíî), ïîñëå ïðîâåðêè
if ConnectorType <> ct_Clear then
begin
// åñëè åñòü ñ-ï óäàëèòü è åãî
(*RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
if TOrthoLine(RaiseConn.JoinedOrtholinesList[i]).FIsRaiseUpDown then
RaiseLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
{ TOrthoLine(RaiseLine).Delete;
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;}
end
else
if FConnRaiseType <> crt_None then
begin
RaiseLine := GetRaiseLine(Self);
// TOrthoLine(RaiseLine).Delete;
end;*)
RaiseConn := nil;
RaiseLine := RaiseFromConnector(Self);
if RaiseLine <> nil then
begin
if TConnectorObject(RaiseLine.JoinConnector1).JoinedConnectorsList.IndexOf(Self) <> -1 then
RaiseConn := TConnectorObject(RaiseLine.JoinConnector1)
else
if TConnectorObject(RaiseLine.JoinConnector2).JoinedConnectorsList.IndexOf(Self) <> -1 then
RaiseConn := TConnectorObject(RaiseLine.JoinConnector2);
end;
// Tolik 17/02/2021 --
if RaiseConn <> nil then
if FObjectFromRaise <> nil then
begin
RaiseConn.FObjectFromRaise := FObjectFromRaise;
FObjectFromRaise := Nil;
end;
while JoinedConnectorsList.Count > 0 do
begin
JoinedConn := TConnectorObject(JoinedConnectorsList[0]);
UnsnapConnectorFromPointObject(JoinedConn, Self);
SnappedList.Add(JoinedConn);
end;
end;
if AsEndPoint then
begin
GEndPoint := nil;
GListWithEndPoint := nil;
end;
Deleted := True;
if Self = GLastConnector then
GLastConnector := nil;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
// TPowerCad(Owner).Figures.Remove(Self); //07/11/2015
//
// Tolik 07/06/2021 --
{
if Assigned(CaptionsGroup) then
CaptionsGroup.Delete;
if Assigned(NotesGroup) then
NotesGroup.Delete;
if Assigned(DrawFigure) then
begin
TPowerCad(Owner).Figures.Remove(DrawFigure); //07/11/2015
DrawFigure.Delete;
end;
}
if Assigned(CaptionsGroup) then
begin
if TF_Cad(Owner.Owner).FRemFigures.IndexOf(CaptionsGroup) = -1 then
CaptionsGroup.Delete;
end;
if Assigned(NotesGroup) then
begin
if TF_Cad(Owner.Owner).FRemFigures.IndexOf(NotesGroup) = -1 then
NotesGroup.Delete;
end;
if Assigned(DrawFigure) then
begin
if TF_Cad(Owner.Owner).FRemFigures.IndexOf(DrawFigure) = -1 then
DrawFigure.Delete;
end;
//
i := 0;
if Recurse then
begin
while i < JoinedOrtholinesList.Count do
begin
TOrthoLine(JoinedOrtholinesList[i]).Delete;
i := i + 1;
end;
end;
// óäàëèòü ññûëêè íà êîíåêòîð èç ïðèâÿçàííûõ êîíåêòîðîâ
for i := 0 to JoinedConnectorslist.Count - 1 do
begin
JoinedConn := TConnectorObject(JoinedConnectorslist[i]);
//Tolik 07/11/2015
{ õóéíÿ êàêà-òî ... áóäóò äóáëè(ïîäðÿä) - ïðîñêî÷èò
j := 0;
while j < JoinedConn.JoinedConnectorslist.Count do
begin
if TFigure(JoinedConn.JoinedConnectorslist[j]) = Self then
JoinedConn.JoinedConnectorslist.Remove(Self);
j := j + 1;
end;
}
// ëó÷øå òàê:
while JoinedConn.JoinedConnectorslist.IndexOf(Self) <> -1 do
JoinedConn.JoinedConnectorslist.Remove(Self);
//
end;
// ïðèñîåäèíèòü êîííåêòîðû îòâÿçàííûå îò ÐÒ
if SnappedList.Count > 0 then
begin
if RaiseConn <> nil then
PrevConnector := RaiseConn
else
PrevConnector := TConnectorObject(SnappedList[0]);
SnappedList.Remove(PrevConnector);
// åñëè åñòü ðàéç, íóæíî ïåðåáðîñèòü FObjectFromRaise, òàê êàê ïîñëå ñíàïà êîííåêòîðîâ ïåðåñ÷èòàþòñÿ äëèíû òðàññ
// è ïåðåñòðîÿòñÿ ïîäïèñè ê òðàññàì
if RaiseLine <> nil then
begin
if (RaiseLine.FObjectFromRaisedLine <> nil) and (RaiseLine.FObjectFromRaisedLine.ID = Self.Id) then
begin
RaiseLine.FObjectFromRaisedLine := PrevConnector;
end;
if (RaiseLine.JoinConnector1 <> nil) and (not TConnectorObject(RaiseLine.JoinConnector1).deleted) then
begin
if (TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise <> nil) and
(TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise.Id = Self.Id) then
TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise := PrevConnector;
end;
if (RaiseLine.JoinConnector2 <> nil) and (not TConnectorObject(RaiseLine.JoinConnector2).deleted) then
begin
if (TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise <> nil) and
(TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise.Id = Self.Id) then
TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise := PrevConnector;
end;
end;
if (PrevConnector <> nil) and (not PrevConnector.Deleted) then
begin
ConnectedConn := nil;
// Tolik 15/11/2019 --
{for i := 1 to SnappedList.Count - 1 do
begin
ConnectedConn := TConnectorObject(SnappedList[i]);
if (ConnectedConn <> nil) and (not ConnectedConn.Deleted) then
begin
// Tolik 15/03/2017 -- ýòî ïåðåäåëàòü ïîñëå òîãî, êàê ïåðåïèøåòñÿ ñíàï
// êîííåêòîðîâ ñ ó÷åòîì âåðòèêàëüíûõ ëèíèé
//if checkCanSnapConnToConn(ConnectedConn, PrevConnector) then
//
CheckingSnapConnectorToConnector(ConnectedConn, PrevConnector);// ConnectedConn := SnapConnectorToConnector(ConnectedConn, PrevConnector);
PrevConnector := ConnectedConn;
end;
end;}
for i := SnappedList.Count - 1 downto 0 do
begin
ConnectedConn := TConnectorObject(SnappedList[i]);
if (ConnectedConn <> nil) and (not ConnectedConn.Deleted) then
begin
// Tolik 15/03/2017 -- ýòî ïåðåäåëàòü ïîñëå òîãî, êàê ïåðåïèøåòñÿ ñíàï
// êîííåêòîðîâ ñ ó÷åòîì âåðòèêàëüíûõ ëèíèé
//if checkCanSnapConnToConn(ConnectedConn, PrevConnector) then
//
PrevConnector := SnapConnectorToConnector(PrevConnector, ConnectedConn, false);
end;
end;
if (ConnectedConn <> nil) and (not ConnectedConn.Deleted) then
// tolik -- 23/09/2016--
// ConnectedConn.Move(ActualPoints[1].x - ConnectedConn.ActualPoints[1].x, ActualPoints[1].y - ConnectedConn.ActualPoints[1].y);
ConnectedConn.Move(ActualPX - ConnectedConn.ActualPoints[1].x, ActualPY - ConnectedConn.ActualPoints[1].y);
//
// Tolik 13/02/2021 -- âûðàâíÿòü ïðèñîåäèíåííûå òðàññû ïî êîííåêòîðó
for i := 0 to PrevConnector.JoinedOrthoLinesList.Count - 1 do
begin
if TOrthoLine(PrevConnector.JoinedOrthoLinesList[i]).Joinconnector1.Id = PrevConnector.ID then
TOrthoLine(PrevConnector.JoinedOrthoLinesList[i]).ActualPoints[1] := PrevConnector.ap1
else
if TOrthoLine(PrevConnector.JoinedOrthoLinesList[i]).Joinconnector2.Id = PrevConnector.ID then
TOrthoLine(PrevConnector.JoinedOrthoLinesList[i]).ActualPoints[2] := PrevConnector.ap1;
end;
end;
end;
// åñëè áûë ðàéç íà ïîèíòå -- âûïîëíÿåì ïðîâåðêó íà óäàëåíèå
// åñëè íå íóæåí -- áóäåò óäàëåí
if RaiseLine <> nil then
begin
if SnappedList.Count > 0 then
begin
ConnectedConn := nil;
// Tolik -- âûðàâíÿòü ðàéç (ñ òðàññàìè)
if RaiseLine.JoinConnector1.ID = PrevConnector.ID then
connectedConn := TConnectorObject(RaiseLine.JoinConnector2)
else
if RaiseLine.JoinConnector2.ID = PrevConnector.ID then
connectedConn := TConnectorObject(RaiseLine.JoinConnector1);
if ConnectedConn <> nil then
begin
ConnectedConn.ActualPoints[1] := PrevConnector.Ap1;
for i := 0 to ConnectedConn.JoinedOrtholinesList.Count - 1 do
begin
if TOrthoLine(ConnectedConn.JoinedOrthoLinesList[i]).Joinconnector1.Id = ConnectedConn.ID then
TOrthoLine(ConnectedConn.JoinedOrthoLinesList[i]).ActualPoints[1] := ConnectedConn.ap1
else
if TOrthoLine(ConnectedConn.JoinedOrthoLinesList[i]).Joinconnector2.Id = ConnectedConn.ID then
TOrthoLine(ConnectedConn.JoinedOrthoLinesList[i]).ActualPoints[2] := ConnectedConn.ap1
end;
end;
//
//if SnappedList.Count = 1 then
ConnectedConn := PrevConnector;
if (RaiseLine.FObjectFromRaisedLine <> nil) and (RaiseLine.FObjectFromRaisedLine.Id = Self.Id) then
RaiseLine.FObjectFromRaisedLine := ConnectedConn;
if (TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise <> nil) and
(TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise.ID = Self.ID) then
TConnectorObject(RaiseLine.JoinConnector1).FObjectFromRaise := ConnectedConn;
if (TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise <> nil) and
(TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise.ID = Self.ID) then
TConnectorObject(RaiseLine.JoinConnector2).FObjectFromRaise := ConnectedConn;
end;
CheckDeleteRaiseOnPointObject;
end;
FreeAndNil(SnappedList);
except
//on E: Exception do addExceptionToLogEx('TConnectorObject.Delete', E.Message);
on E: Exception do addExceptionToLogEx('TConnectorObject.Delete ' + inttostr(ID), E.Message);
end;
end;
(*
procedure TConnectorObject.Delete(Recurse: Boolean = True; DelRaise: Boolean = True);
var
i, j: integer;
JoinedConn: TConnectorObject;
RaiseLine: TOrthoLine;
RaiseConn: TConnectorObject;
ConnectedConn: TConnectorObject;
ListOfPassage: TF_CAD;
ConnOfPassage: TConnectorObject;
JoinedLine: TOrthoLine;
CurGCadForm: TF_CAD;
ObjParams: TObjectParams;
SnappedList: TList;
PrevConnector: TConnectorObject;
// Tolik -- 23/09/2016 --
ActualPX, ActualPY: Double;
//
begin
try
SnappedList := TList.Create;
if Not Deleted then
begin
// Tolik -- 23/09/2016--
ActualPX := Self.ActualPoints[1].x;
ActualPY := Self.ActualPoints[1].y;
//
if Owner <> nil then //07.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
// House
if FIsHouseJoined then
FHouse.fJoined.Remove(Self);
if FIsApproach then
fHouse.fApproaches.Remove(Self);
//
if CheckTrunkObject(Self) then
begin
//Tolik
FreeAndNil(SnappedList);
//
DeleteTrunkObject(Self);
Exit;
end;
// ObjFromRaise
if DelRaise then
begin
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
if (RaiseConn.FConnRaiseType = crt_BetweenFloorUp) or (RaiseConn.FConnRaiseType = crt_BetweenFloorDown) or (RaiseConn.FConnRaiseType = crt_TrunkUp) or (RaiseConn.FConnRaiseType = crt_TrunkDown) then
begin
DeleteRaiseOtherFloor(RaiseConn);
end;
if RaiseConn.ConnectorType = ct_clear then
begin
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
end;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;
RaiseLine := GetRaiseLine(RaiseConn);
if RaiseLine <> nil then
begin
TOrthoLine(RaiseLine).Delete;
end;
end;
end;
// ýòî êîíå÷íûé îáúåêò
if AsEndPoint then
begin
GEndPoint := Nil;
GListWithEndPoint := Nil;
end;
// ì-ý ïåðåõîä
if (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_TrunkUp) or (FConnRaiseType = crt_TrunkDown)then
begin
DeleteRaiseOtherFloor(Self);
end;
if ConnectorType <> ct_Clear then
begin
// åñëè åñòü ñ-ï óäàëèòü è åãî
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
if TOrthoLine(RaiseConn.JoinedOrtholinesList[i]).FIsRaiseUpDown then
RaiseLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
TOrthoLine(RaiseLine).Delete;
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;
end
else
if FConnRaiseType <> crt_None then
begin
RaiseLine := GetRaiseLine(Self);
TOrthoLine(RaiseLine).Delete;
end;
while JoinedConnectorsList.Count > 0 do
begin
JoinedConn := TConnectorObject(JoinedConnectorsList[0]);
UnsnapConnectorFromPointObject(JoinedConn, Self);
SnappedList.Add(JoinedConn);
end;
end;
if AsEndPoint then
begin
GEndPoint := nil;
GListWithEndPoint := nil;
end;
Deleted := True;
if Self = GLastConnector then
GLastConnector := nil;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
// TPowerCad(Owner).Figures.Remove(Self); //07/11/2015
//
if Assigned(CaptionsGroup) then
CaptionsGroup.Delete;
if Assigned(NotesGroup) then
NotesGroup.Delete;
if Assigned(DrawFigure) then
begin
DrawFigure.Delete;
TPowerCad(Owner).Figures.Remove(DrawFigure); //07/11/2015
end;
i := 0;
if Recurse then
begin
while i < JoinedOrtholinesList.Count do
begin
TOrthoLine(JoinedOrtholinesList[i]).Delete;
i := i + 1;
end;
end;
end;
// óäàëèòü ññûëêè íà êîíåêòîð èç ïðèâÿçàííûõ êîíåêòîðîâ
for i := 0 to JoinedConnectorslist.Count - 1 do
begin
JoinedConn := TConnectorObject(JoinedConnectorslist[i]);
//Tolik 07/11/2015
{ õóéíÿ êàêà-òî ... áóäóò äóáëè(ïîäðÿä) - ïðîñêî÷èò
j := 0;
while j < JoinedConn.JoinedConnectorslist.Count do
begin
if TFigure(JoinedConn.JoinedConnectorslist[j]) = Self then
JoinedConn.JoinedConnectorslist.Remove(Self);
j := j + 1;
end;
}
// ëó÷øå òàê:
while JoinedConn.JoinedConnectorslist.IndexOf(Self) <> -1 do
JoinedConn.JoinedConnectorslist.Remove(Self);
//
end;
// ïðèñîåäèíèòü êîííåêòîðû îòâÿçàííûå îò ÐÒ
if SnappedList.Count > 0 then
begin
PrevConnector := TConnectorObject(SnappedList[0]);
if (PrevConnector <> nil) and (not PrevConnector.Deleted) then
begin
ConnectedConn := nil;
for i := 1 to SnappedList.Count - 1 do
begin
ConnectedConn := TConnectorObject(SnappedList[i]);
if (ConnectedConn <> nil) and (not ConnectedConn.Deleted) then
begin
SnapConnectorToConnector(ConnectedConn, PrevConnector);
PrevConnector := ConnectedConn;
end;
end;
if (ConnectedConn <> nil) and (not ConnectedConn.Deleted) then
// tolik -- 23/09/2016--
// ConnectedConn.Move(ActualPoints[1].x - ConnectedConn.ActualPoints[1].x, ActualPoints[1].y - ConnectedConn.ActualPoints[1].y);
ConnectedConn.Move(ActualPX - ConnectedConn.ActualPoints[1].x, ActualPY - ConnectedConn.ActualPoints[1].y);
//
end;
end;
FreeAndNil(SnappedList);
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Delete', E.Message);
end;
end;
*)
procedure TFigureGrpMod.Delete;
begin
try
if Not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
TPowerCad(Owner).Figures.Remove(Self);
//
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpMod.Delete', E.Message);
end;
end;
// Tolik -- 21/11/2016-- ñòàðàÿ çàêîììåí÷åíà -- ñì íèæå
procedure TOrthoLine.Delete;
var
i,j: integer;
RaiseConn: TConnectorObject;
ObjFromRaise: TConnectorObject;
ObjParams: TObjectParams;
RaiseLine, RelatedRaiseLine: TOrthoLine;
RemJoinConn1, RemJoinConn2: Integer;
// Tolik 29/09/2017 --
CrossLine: TOrthoLine;
PointDeleted: Boolean;
CrossInfo: POrthoLineCrossInfo;
CrossLinesList: TList;
//
function isTrunk(aLine: TOrthoLine): Boolean;
var currConn: TConnectorObject;
begin
Result := False;
currConn := TConnectorObject(aLine.JoinConnector1);
if (currConn <> nil) and (not currConn.deleted) then
begin
if (CurrConn.FConnRaiseType = crt_BetweenFloorUp) or (currConn.FConnRaiseType = crt_BetweenFloorDown) or
(CurrConn.FConnRaiseType = crt_TrunkUp) or (currConn.FConnRaiseType = crt_TrunkDown) then
begin
Result := True;
exit;
end;
end
else
exit;
currConn := TConnectorObject(aLine.JoinConnector2);
if (currConn <> nil) and (not currConn.deleted) then
begin
if (CurrConn.FConnRaiseType = crt_BetweenFloorUp) or (currConn.FConnRaiseType = crt_BetweenFloorDown) or
(CurrConn.FConnRaiseType = crt_TrunkUp) or (currConn.FConnRaiseType = crt_TrunkDown) then
begin
Result := True;
exit;
end;
end
end;
// Tolik 06/01/2016 --
Function CheckCanDelRaise(aRaiseLine: TOrthoLine) : boolean;
var i: Integer;
begin
Result := True;
for i := 0 to TConnectorObject(aRaiseLine.JoinConnector1).JoinedOrtholinesList.Count - 1 do
begin
if (TOrthoLine(TConnectorObject(aRaiseLine.JoinConnector1).JoinedOrtholinesList[i]).ID <> aRaiseLine.ID) and
(not TOrthoLine(TConnectorObject(aRaiseLine.JoinConnector1).JoinedOrtholinesList[i]).Deleted) then
begin
Result := False;
break;
end;
end;
if Result then
begin
for i := 0 to TConnectorObject(aRaiseLine.JoinConnector2).JoinedOrtholinesList.Count - 1 do
begin
if (TOrthoLine(TConnectorObject(aRaiseLine.JoinConnector2).JoinedOrtholinesList[i]).ID <> aRaiseLine.ID) and
(not TOrthoLine(TConnectorObject(aRaiseLine.JoinConnector2).JoinedOrtholinesList[i]).Deleted) then
begin
Result := False;
break;
end;
end;
end;
end;
begin
//åñëè òðàññà óäàëåíà -- íàõ îòñþäà
if Deleted then
exit;
// Tolik 21/05/2019 --
if GPrevFigureTraceTo <> nil then
if ID = GPrevFigureTraceTo.ID then
GPrevFigureTraceTo := nil;
if GPrevFigureSnap <> nil then
if ID = GPrevFigureSnap.ID then
GPrevFigureSnap := nil;
if GFigureSnap <> nil then
if ID = GFigureSnap.ID then
GFigureSnap := nil;
//
BeginProgress;
//Tolik -- 25/07/2017 --
DeleteObjectFromPM(Self.Id, Self.Name);
//
RaiseConn := Nil; // Tolik 18/10/2017 --
try
RemJoinConn1 := 0;
RemJoinConn2 := 0;
if Owner <> nil then //07.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
// c-ï
if FIsRaiseUpDown then
begin
ObjFromRaise := FObjectFromRaisedLine;
if ObjFromRaise <> nil then
RaiseConn := GetRaiseConn(ObjFromRaise);
if RaiseConn <> nil then
begin
if (RaiseConn.FConnRaiseType = crt_BetweenFloorUp) or (RaiseConn.FConnRaiseType = crt_BetweenFloorDown) or (RaiseConn.FConnRaiseType = crt_TrunkUp) or (RaiseConn.FConnRaiseType = crt_TrunkDown) then
begin
DeleteRaiseOtherFloor(RaiseConn);
end;
if RaiseConn.ConnectorType = ct_clear then
begin
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
end;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;
end;
end;
Deleted := True;
//Tolik
//GCadForm.FRemFigures.Add(Self);
// õç îòêóäà ïðèøëî óäàëåíèå è êòî òàêîé â ìîìåíò óäàëåíèÿ GCadForm
// ìîæåò áûòü è íå òîò, íà êîòîðîì íàõîäèòñÿ óäàëÿåìûé êîìïîíåíò
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
// Tolik 04/02/2021 --
{if Assigned(CaptionsGroup) then
CaptionsGroup.Delete;
if Assigned(NotesGroup) then
NotesGroup.Delete;
if Assigned(MultilineCaptionBox) then
TTextMod(MultilineCaptionBox).Delete;}
if Assigned(CaptionsGroup) then
begin
CaptionsGroup.Delete;
CaptionsGroup := nil;
end;
if Assigned(NotesGroup) then
begin
NotesGroup.Delete;
NotesGroup := nil;
end;
if Assigned(MultilineCaptionBox) then
begin
TTextMod(MultilineCaptionBox).Delete;
MultilineCaptionBox := nil;
end;
//
//Tolik -- FSingleBlock íà ÊÀÄå óæå íå ñèäèò, îòäåëüíî óäàëÿòü ñìûñëà íåò, åñëè óäàëÿåòñÿ îðòîëèíèÿ,
// òî óäàëèòñÿ ïðè óäàëåíèè FDrawFigure
{if Assigned(FSingleBlock) then
begin
DrawFigure.RemoveFromGrp(FSingleBlock); //28.04.2011 DrawFigure.InFigures.Remove(FSingleBlock);
FSingleBlock.Delete;
end;}
FSingleBlock := nil;
{ if Assigned(DrawFigure) then
DrawFigure.Delete;}
if Assigned(FDrawFigure) then
begin
FDrawFigure.Delete;
FDrawFigure := nil; // Tolik 04/02/2021 --
end;
// Tolik -- 22/11/2016 -- ýòî âñå íàõ íå íóæíî, ò.ê. PCad.GiuEvent ñàì ïðîâåðèò êîííåêòîð è îòïðàâèò åãî íà óäàëåíèå
// åñëè ó íåãî íå îñòàåòñÿ ïðèñîåäèíåííûõ òðàññ
{ if JoinConnector1 <> nil then
if TConnectorObject(JoinConnector1).ConnectorType = ct_Clear then
begin
if TConnectorObject(JoinConnector1).JoinedOrtholinesList.Count = 1 then
begin
if TConnectorObject(JoinConnector1).JoinedOrtholinesList[0] = Self then
begin
if not TConnectorObject(JoinConnector1).FIsHouseJoined then
begin
if TConnectorObject(JoinConnector1).FGroupObject <> nil then
TConnectorObject(JoinConnector1).FGroupObject.RemoveFromGrp(JoinConnector1); //28.04.2011 TConnectorObject(JoinConnector1).FGroupObject.InFigures.Remove(JoinConnector1);
TConnectorObject(JoinConnector1).Delete;
end;
end;
end;
end;
if JoinConnector2 <> nil then
if TConnectorObject(JoinConnector2).ConnectorType = ct_Clear then
begin
if TConnectorObject(JoinConnector2).JoinedOrtholinesList.Count = 1 then
if TConnectorObject(JoinConnector2).JoinedOrtholinesList[0] = Self then
begin
if not TConnectorObject(JoinConnector2).FIsHouseJoined then
begin
if TConnectorObject(JoinConnector2).FGroupObject <> nil then
TConnectorObject(JoinConnector2).FGroupObject.RemoveFromGrp(JoinConnector2); //28.04.2011 TConnectorObject(JoinConnector2).FGroupObject.InFigures.Remove(JoinConnector2);
TConnectorObject(JoinConnector2).Delete;
end;
end;
end; }
// óáðàòü îáüåêò èç ëèñòà ïðèâÿçàííûõ ê íåìó îáüåêòîâ
if JoinConnector1 <> nil then
begin
if not TConnectorObject(JoinConnector1).deleted then
begin
if TConnectorObject(JoinConnector1).RemJoined.IndexOf(Self) = -1 then // Tolik 26/11/2020 -- íà âñÿêèé...
TConnectorObject(JoinConnector1).RemJoined.Add(Self);
// åñëè îñòàëàñü òîëüêî àäíà òðàññà, ïðîâåðÿåì, åñòü ëè ðàéç è ìîæíî ëè åãî óäàëèòü.
// åñëè ìîæíî óäàëèòü ðàéç -- óäàëÿåì
// åñëè â äàííûé ìîìåíò óäàëÿåì íå ðàéç
if not FIsRaiseUpDown then
begin
if ((TConnectorObject(JoinConnector1).JoinedOrtholinesList.Count - TConnectorObject(JoinConnector1).RemJoined.Count) = 1) then
begin
RaiseLine := nil;
RelatedRaiseLine := Nil;
for i := 0 to TConnectorObject(JoinConnector1).JoinedOrtholinesList.Count - 1 do
begin
if (TOrthoLine(TConnectorObject(JoinConnector1).JoinedOrtholinesList[i]).FIsRaiseUpDown and
(not TOrthoLine(TConnectorObject(JoinConnector1).JoinedOrtholinesList[i]).Deleted)) then
begin
RaiseLine := TOrthoLine(TConnectorObject(JoinConnector1).JoinedOrtholinesList[i]);
Break; //// BREAK ////;
end;
end;
// åñëè ðàéç åñòü, à â ñïèñêå íà óäàëåíèå åãî íåò
if (RaiseLine <> nil) and (TConnectorObject(JoinConnector1).RemJoined.IndexOf(RaiseLine) = -1) then
begin
// Tolik -- 06/01/2017 -- òàê áóäåò ïðàâèëüíî
if TConnectorObject(JoinConnector1).JoinedOrthoLinesList.Count - TConnectorObject(JoinConnector1).RemJoined.Count = 1 then
begin
if not isTrunk(RaiseLine) then
RaiseLine.Delete;
//RaiseLine.Delete;
// CheckDeleteRaise(RaiseLine);
{if CheckCanDelRaise(RaiseLine) then
if (TConnectorObject(JoinConnector1).RemJoined.IndexOf(RaiseLine) = -1) then
(TConnectorObject(JoinConnector1).RemJoined.Add(RaiseLine));}
//RaiseLine.Delete;
//
end;
end;
end;
end
// Tolik 26/11/2020
else
begin
if isTrunk(Self) then
if TConnectorObject(JoinConnector1).RemJoined.IndexOf(Self) = -1 then
TConnectorObject(JoinConnector1).RemJoined.Add(Self);
end;
//
end;
end;
if JoinConnector2 <> nil then
begin
if not TConnectorObject(JoinConnector2).deleted then
begin
if TConnectorObject(JoinConnector2).RemJoined.IndexOf(Self) = -1 then // Tolik 26/11/2020 -- íà âñÿêèé
TConnectorObject(JoinConnector2).RemJoined.Add(Self);
// åñëè â äàííûé ìîìåíò óäàëÿåì íå ðàéç
if not FIsRaiseUpDown then
begin
if ((TConnectorObject(JoinConnector2).JoinedOrtholinesList.Count - TConnectorObject(JoinConnector2).RemJoined.Count) = 1) then
begin
RaiseLine := nil;
RelatedRaiseLine := Nil;
for i := 0 to TConnectorObject(JoinConnector2).JoinedOrtholinesList.Count - 1 do
begin
if (TOrthoLine(TConnectorObject(JoinConnector2).JoinedOrtholinesList[i]).FIsRaiseUpDown and
(not TOrthoLine(TConnectorObject(JoinConnector2).JoinedOrtholinesList[i]).Deleted)) then
begin
RaiseLine := TOrthoLine(TConnectorObject(JoinConnector2).JoinedOrtholinesList[i]);
Break; //// BREAK ////;
end;
end;
// åñëè ðàéç åñòü, à â ñïèñêå íà óäàëåíèå åãî íåò
if (RaiseLine <> nil) and (TConnectorObject(JoinConnector2).RemJoined.IndexOf(RaiseLine) = -1) then
begin
if TConnectorObject(JoinConnector2).JoinedOrthoLinesList.Count - TConnectorObject(JoinConnector2).RemJoined.Count = 1 then
begin
// åñëè ýòî ïðîñòîé ñ/ï -- óäàëèòü åãî íàõ
// Tolik -- 06/01/2017 -- òàê áóäåò ïðàâèëüíî
if not isTrunk(RaiseLine) then
RaiseLine.Delete;
//CheckDeleteRaise(RaiseLine);
{if CheckCanDelRaise(RaiseLine) then
if (TConnectorObject(JoinConnector2).RemJoined.IndexOf(RaiseLine) = -1) then
(TConnectorObject(JoinConnector2).RemJoined.Add(RaiseLine));}
// RaiseLine.Delete;
//
end;
end;
end;
end
// Tolik 26/11/2020
else
begin
if isTrunk(Self) then
if TConnectorObject(JoinConnector2).RemJoined.IndexOf(Self) = -1 then
TConnectorObject(JoinConnector2).RemJoined.Add(Self);
end;
//
end;
end;
//Tolik 29/09/20107 -- ñáðîñèòü ïåðåñå÷åíèÿ ñ òðàññàìè
if CrossList.Count > 0 then
begin
if Assigned(Self.Owner) then
if Assigned(Self.Owner.Owner) then
if TF_Cad(TPowerCad(Self.Owner).Owner).FListSettings.ShowTracesCrossPoints > 0 then
begin
CrossLinesList := TList.Create;
for i := 0 to CrossList.Count - 1 do
begin
CrossInfo := POrthoLineCrossInfo(CrossList[i]);
CrossLine := TOrthoLine(GetFigureByID(TF_Cad(TPowerCad(Self.Owner).Owner), CrossInfo.CrossLineID));
if CrossLine <> nil then
if not CrossLine.Deleted then
if CrossLinesList.IndexOf(CrossLine) = -1 then
CrossLinesList.Add(CrossLine); // ëèíèè ïåðåñå÷åíèÿ
end;
for i := 0 to CrossLinesList.Count - 1 do
begin
CrossLine := TOrthoLine(CrossLinesList[i]);
PointDeleted := False;
if CrossLine.CrossList.Count > 0 then
begin
for j := CrossLine.CrossList.Count - 1 downto 0 do
begin
CrossInfo := POrthoLineCrossInfo(CrossLine.CrossList[j]);
if CrossInfo.CrossLineID = Self.ID then
begin
CrossLine.CrossList.Remove(CrossInfo);
//FreeMem(CrossInfo); // ïàìÿòü íå çàáûâàåì îñâîáîæäàòü
Dispose(CrossInfo); // ïàìÿòü íå çàáûâàåì îñâîáîæäàòü
PointDeleted := True;
end;
end;
if PointDeleted then
CrossLine.ReCreateDrawFigureBlock;
end;
end;
CrossLinesList.free;
end;
end;
// îñâîáîäèòü ïàìÿòü, çàíÿòóþ ñïèñêîì ïåðåñå÷åíèé
While CrossList.Count > 0 do
begin
CrossInfo := POrthoLineCrossInfo(CrossList[0]);
CrossList.Remove(CrossInfo);
//FreeMem(CrossInfo); // ïàìÿòü íå çàáûâàåì îñâîáîæäàòü
Dispose(CrossInfo); // ïàìÿòü íå çàáûâàåì îñâîáîæäàò
end;
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Delete', E.Message);
end;
EndProgress;
end;
(*
procedure TOrthoLine.Delete;
var
i: integer;
RaiseConn: TConnectorObject;
ObjFromRaise: TConnectorObject;
ObjParams: TObjectParams;
begin
try
if Not Deleted then
begin
if Owner <> nil then //07.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
// c-ï
if FIsRaiseUpDown then
begin
ObjFromRaise := FObjectFromRaisedLine;
if ObjFromRaise <> nil then
RaiseConn := GetRaiseConn(ObjFromRaise);
if RaiseConn <> nil then
begin
if (RaiseConn.FConnRaiseType = crt_BetweenFloorUp) or (RaiseConn.FConnRaiseType = crt_BetweenFloorDown) or (RaiseConn.FConnRaiseType = crt_TrunkUp) or (RaiseConn.FConnRaiseType = crt_TrunkDown) then
begin
DeleteRaiseOtherFloor(RaiseConn);
end;
if RaiseConn.ConnectorType = ct_clear then
begin
RaiseConn.Name := cCadClasses_Mes12;
SetNewObjectNameInPM(RaiseConn.ID, RaiseConn.Name);
ObjParams := GetFigureParams(RaiseConn.ID);
RaiseConn.Name := ObjParams.Name;
RaiseConn.FIndex := ObjParams.MarkID;
end;
RaiseConn.FConnRaiseType := crt_None;
RaiseConn.FObjectFromRaise := nil;
RaiseConn.LockMove := False;
RaiseConn.LockModify := False;
end;
end;
Deleted := True;
//Tolik
//GCadForm.FRemFigures.Add(Self);
// õç îòêóäà ïðèøëî óäàëåíèå è êòî òàêîé â ìîìåíò óäàëåíèÿ GCadForm
// ìîæåò áûòü è íå òîò, íà êîòîðîì íàõîäèòñÿ óäàëÿåìûé êîìïîíåíò
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
if Assigned(CaptionsGroup) then
CaptionsGroup.Delete;
if Assigned(NotesGroup) then
NotesGroup.Delete;
if Assigned(MultilineCaptionBox) then
TTextMod(MultilineCaptionBox).Delete;
//Tolik -- FSingleBlock íà ÊÀÄå óæå íå ñèäèò, îòäåëüíî óäàëÿòü ñìûñëà íåò, åñëè óäàëÿåòñÿ îðòîëèíèÿ,
// òî óäàëèòñÿ ïðè óäàëåíèè FDrawFigure
{if Assigned(FSingleBlock) then
begin
DrawFigure.RemoveFromGrp(FSingleBlock); //28.04.2011 DrawFigure.InFigures.Remove(FSingleBlock);
FSingleBlock.Delete;
end;}
FSingleBlock := nil;
{ if Assigned(DrawFigure) then
DrawFigure.Delete;}
if Assigned(FDrawFigure) then
FDrawFigure.Delete;
if JoinConnector1 <> nil then
if TConnectorObject(JoinConnector1).ConnectorType = ct_Clear then
begin
if TConnectorObject(JoinConnector1).JoinedOrtholinesList.Count = 1 then
if TConnectorObject(JoinConnector1).JoinedOrtholinesList[0] = Self then
begin
if not TConnectorObject(JoinConnector1).FIsHouseJoined then
begin
if TConnectorObject(JoinConnector1).FGroupObject <> nil then
TConnectorObject(JoinConnector1).FGroupObject.RemoveFromGrp(JoinConnector1); //28.04.2011 TConnectorObject(JoinConnector1).FGroupObject.InFigures.Remove(JoinConnector1);
TConnectorObject(JoinConnector1).Delete;
end;
end;
end;
if JoinConnector2 <> nil then
if TConnectorObject(JoinConnector2).ConnectorType = ct_Clear then
begin
if TConnectorObject(JoinConnector2).JoinedOrtholinesList.Count = 1 then
if TConnectorObject(JoinConnector2).JoinedOrtholinesList[0] = Self then
begin
if not TConnectorObject(JoinConnector2).FIsHouseJoined then
begin
if TConnectorObject(JoinConnector2).FGroupObject <> nil then
TConnectorObject(JoinConnector2).FGroupObject.RemoveFromGrp(JoinConnector2); //28.04.2011 TConnectorObject(JoinConnector2).FGroupObject.InFigures.Remove(JoinConnector2);
TConnectorObject(JoinConnector2).Delete;
end;
end;
end;
// óáðàòü îáüåêò èç ëèñòà ïðèâÿçàííûõ ê íåìó îáüåêòîâ
if JoinConnector1 <> nil then
TConnectorObject(JoinConnector1).RemJoined.Add(Self);
if JoinConnector2 <> nil then
TConnectorObject(JoinConnector2).RemJoined.Add(Self);
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.Delete', E.Message);
end;
end;
*)
procedure TTextMod.Delete;
begin
try
if Not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
end;
except
on E: Exception do addExceptionToLogEx('TTextMod.Delete', E.Message);
end;
end;
//==============================================================================
//============= TTextMod =======================================================
//==============================================================================
procedure TTextMod.GetBounds(var figMaxX, figMaxY, figMinX,
figMinY: Double);
begin
inherited;
end;
function TTextMod.isPointIn(x, y: Double): Boolean;
begin
result := false;
result := inherited isPointIn(x, y);
end;
procedure TTextMod.getModPoints(ModList: TMyList);
begin
end;
procedure TTextMod.Select;
begin
end;
procedure TTextMod.WriteToStream(Stream: TStream);
begin
inherited;
end;
procedure TTextMod.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
begin
inherited;
end;
procedure TConnectorObject.RaiseProperties(CadFigList: TList);
var
i: integer;
CaptionsLHandle: Integer;
NotesLHandle: integer;
SCSLHandle: integer;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
Name: string;
mess: string;
FiguresList: TList;
l2, l4, l6: Integer;
SCSFigureGrp: TSCSFigureGrp;
Figure: TFigure;
Badfigure: Boolean; // Tolik 05/10/2018 --
ObjectFromRaiseFigure: TConnectorObject; // Tolik 05/10/2018 --
// Tolik
procedure ReRaiseProps;
var
i: integer;
CaptionsLHandle: Integer;
NotesLHandle: integer;
SCSLHandle: integer;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
Name: string;
mess: string;
FiguresList: TList;
l2, l4, l6: Integer;
SCSFigureGrp: TSCSFigureGrp;
Figure: TFigure;
begin
try
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(4);
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) or (DrawFigure = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TConnectorObject.RaiseProperties', 'ReSETDrawFigure');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := true;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
if DrawFigure <> nil then
begin
DrawFigure.FNetworkTypes := FNetworkTypes;
if FIndex = 0 then
begin
FIndex := GetFigureParams(ID).MarkID;
end;
end;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TConnectorObject.ReRaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
//
begin
try
//
// Tolik 02/09/2016 -- áûâàåò, íå óñïåâàåò óäàëèòüñÿ, à îáíîâëÿòüñÿ -- ëåçåò!
if Self.deleted then
Exit;
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := CadFigList; // GCadForm.PCad.Figures;
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(4);
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
CaptionsGroup := nil;
NotesGroup := nil;
tmpCaptionsGroup := nil;
tmpNotesCaptions := nil;
// Tolik 06/11/2018 --
if FCaptionsGroupIndex <> -1 then
begin
if ((TFigure(FiguresList[FCaptionsGroupIndex]).ClassName <> 'TRichTextMod') or
(TFigure(FiguresList[FCaptionsGroupIndex]).LayerHandle <> CaptionsLHandle)) then
begin
FCaptionsGroupIndex := -1;
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FCaptionsGroupIndex for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
end;
if FNotesGroupIndex <> -1 then
begin
if ((TFigure(FiguresList[FNotesGroupIndex]).ClassName <> 'TFigureGrpNotMod') or
(TFigure(FiguresList[FNotesGroupIndex]).LayerHandle <> NotesLHandle)) then
begin
FNotesGroupIndex := -1;
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FNotesGroupIndex for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
end;
if ((FGroupObjectIndex = 0) or (FHouseIndex = 0) or ((FObjectFromRaiseIndex = 0) and (FObjectFromRaiseIndexForGrp = -1)) or (FObjectFromRaiseIndexForGrp = 0)) then
{
if ((FGroupObjectIndex = 0) or (FHouseIndex = 0) or ((FObjectFromRaiseIndex = 0) and (FObjectFromRaiseIndexForGrp = -1)) or (FObjectFromRaiseIndexForGrp = 0)
or (FCaptionsGroupIndex = 0) or (FNotesGroupIndex = 0) ) then
}
//
begin
//beep;
// Tolik 05/10/2018 --
BadFigure := False;
if FObjectFromRaiseIndexForGrp <> -1 then
begin
if FObjectFromRaiseIndexForGrp < FiguresList.Count then
begin
if TFigure(FiguresList[FObjectFromRaiseIndexForGrp]).ClassName = 'TSCSFigureGrp' then
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList[FObjectFromRaiseIndexForGrp]);
if SCSFigureGrp <> nil then
begin
if SCSFigureGRP.LayerHandle <> SCSLHandle then
BadFigure := True;
end
else
BadFigure := True;
if BadFigure then
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FObjectFromRaiseIndexForGrp for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
if not BadFigure then
begin
if FObjectFromRaiseIndex <> -1 then
begin
if FObjectFromRaiseIndex < SCSFigureGRP.InFigures.Count then
begin
if Tfigure(SCSFigureGRP.InFigures[FObjectFromRaiseIndex]).ClassName = 'TConnectorObject' then
begin
ObjectFromRaiseFigure := TConnectorObject(SCSFigureGRP.InFigures[FObjectFromRaiseIndex]);
if ObjectFromRaiseFigure.LayerHandle <> SCSLHandle then
BadFigure := True;
end
else
BadFigure := True;
end
else
BadFigure := True;
end
else
BadFigure := True;
if BadFigure then
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FObjectFromRaiseIndex for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
BadFigure := True;
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FObjectFromRaiseIndexForGrp for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
BadFigure := True;
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FObjectFromRaiseIndexForGrp for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
if FObjectFromRaiseIndex <> -1 then
begin
if FObjectFromRaiseIndex < FiguresList.Count then
begin
if TFigure(FiguresList[FObjectFromRaiseIndex]).ClassName = 'TConnectorObject' then
begin
ObjectFromRaiseFigure := TConnectorObject(FiguresList[FObjectFromRaiseIndex]);
if ObjectFromRaiseFigure.LayerHandle <> SCSLHandle then
BadFigure := True;
end
else
BadFigure := True;
end
else
BadFigure := True;
end;
if BadFigure then
addExceptionToLogEx('TConnectorObject.RaiseProperties:', 'Incorrect FObjectFromRaiseIndex for TConnectorObject. Id =' + Inttostr(ID) + ' on ' + GCadForm.FCadListName);
end;
if BadFigure then
begin
FObjectFromRaiseIndex := -1;
//
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TConnectorObject.RaiseProperties', 'Not SET all need figure index');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
end;
end;
// FGroupObject
if FGroupObjectIndex <> - 1 then
FGroupObject := TSCSFigureGrp(FiguresList.Items[FGroupObjectIndex])
else
FGroupObject := nil;
// FHouse
if FHouseIndex <> - 1 then
begin
//10.01.2011 FHouse := THouse(FiguresList.Items[FHouseIndex])
Figure := TFigure(FiguresList.Items[FHouseIndex]);
if Figure is THouse then
FHouse := THouse(Figure)
else
begin
FHouseIndex := -1;
FHouse := nil;
end;
end
else
FHouse := nil;
//if TFigure(FiguresList.Items[FDrawFigureIndex]).ClassName <> 'TFigureGrpMod' then
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) then
begin
//Beep;
{ ÍÅËÜÇß ÑÎÇÄÀÂÀÒÜ ÍÈ×ÅÃÎ ÍÀ RaiseProperties èíà÷å ïîïëûâóò ñëåä. ôèãóðû íà òàêèõ êîíñòðóêöèÿõ FiguresList.Items[FDrawFigureIndex];
Ýòî äåëàåòñÿ â äîï.ïðîõîäå
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TConnectorObject.RaiseProperties', 'Not SET DrawFigureIndex');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := true;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
}
//Tolik
//GNeedReRaiseProperties := True;
FDrawFigure := nil;
ReRaiseProps;
end
else
begin
FDrawFigure := TFigureGrpMod(FiguresList.Items[FDrawFigureIndex]);
if FDrawFigure <> nil then
begin
if not FDrawFigure.fHasParent then
begin
FDrawFigure.fHasParent := true;
end
else
begin
{ ÍÅËÜÇß ÑÎÇÄÀÂÀÒÜ ÍÈ×ÅÃÎ ÍÀ RaiseProperties èíà÷å ïîïëûâóò ñëåä. ôèãóðû íà òàêèõ êîíñòðóêöèÿõ FiguresList.Items[FDrawFigureIndex];
Ýòî äåëàåòñÿ â äîï.ïðîõîäå
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TConnectorObject.RaiseProperties', 'Recreate DrawFigure');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := true;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
}
//Tolik
//GNeedReRaiseProperties := True;
FDrawFigure := nil;
ReRaiseProps;
end;
end;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
// ïîäíÿòü CaptionsGroup
if FCaptionsGroupIndex <> -1 then
begin
if ConnectorType <> ct_Clear then
begin
// Name := OutTextCaptions.Strings[0];
// OutTextCaptions.Clear;
// OutTextCaptions.Add(Name);
end;
tmpCaptionsGroup := TFigure(FiguresList.Items[FCaptionsGroupIndex]);
// CONVERT
if CheckFigureByClassName(tmpCaptionsGroup, cTFigureGrpNotMod) then
begin
if Not TFigureGrpNotMod(tmpCaptionsGroup).fHasParent then
begin
tmpCaptionsGroup := TFigureGrpNotMod(tmpCaptionsGroup);
TFigureGrpNotMod(tmpCaptionsGroup).fHasParent := True;
// for i := 0 to TFigureGrpNotMod(tmpCaptionsGroup).InFigures.Count - 1 do
// OutTextCaptions.Add(TTextMod(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[i]).Text);
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
if CheckFigureByClassName(tmpCaptionsGroup, cTRichTextMod) then
begin
if Not TRichTextMod(tmpCaptionsGroup).fHasParent then
begin
tmpCaptionsGroup := TRichTextMod(tmpCaptionsGroup);
TRichTextMod(tmpCaptionsGroup).fHasParent := True;
// for i := 0 to TRichTextMod(tmpCaptionsGroup).Re.Lines.Count - 1 do
// OutTextCaptions.Add(TRichTextMod(tmpCaptionsGroup).Re.Lines[i]);
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
begin
tmpCaptionsGroup := nil;
end;
if tmpCaptionsGroup <> nil then
tmpCaptionsGroup.LockModify := True;
end;
// ïîäíÿòü NotesGroup
if FNotesGroupIndex <> -1 then
begin
OutTextNotes.Clear;
NotesGroup := TFigureGrpNotMod(FiguresList.Items[FNotesGroupIndex]);
if Not NotesGroup.fHasParent then
begin
NotesGroup.fHasParent := True;
tmpNotesCaptions := TFigure(NotesGroup.InFigures[1]);
// CONVERT
if CheckFigureByClassName(tmpNotesCaptions, cTFigureGrpNotMod) then
begin
tmpNotesCaptions := TFigureGrpNotMod(tmpNotesCaptions);
for i := 0 to TFigureGrpNotMod(tmpNotesCaptions).InFigures.Count - 1 do
OutTextNotes.Add(TTextMod(TFigureGrpNotMod(tmpNotesCaptions).InFigures[i]).Text);
TFigureGrpNotMod(NotesGroup.InFigures[1]).Visible := True;
end
else
if CheckFigureByClassName(tmpNotesCaptions, cTRichTextMod) then
begin
tmpNotesCaptions := TRichTextMod(tmpNotesCaptions);
for i := 0 to TRichTextMod(tmpNotesCaptions).re.Lines.Count - 1 do
OutTextNotes.Add(TRichTextMod(tmpNotesCaptions).re.Lines[i]);
TRichTextMod(NotesGroup.InFigures[1]).Visible := True;
end
else
begin
tmpNotesCaptions := nil;
end;
// =====
TFigureGrpNotMod(NotesGroup.InFigures[0]).Visible := True;
NotesGroup.LockModify := True;
end
else
begin
NotesGroup := nil;
end;
end;
// !!!SCSFigureGroup
for i := 0 to Length(FJoinedConnectorsIndexesForGrp) - 1 do
begin
// c êàäà
if FJoinedConnectorsIndexesForGrp[i] = $FFFF then
begin
JoinedConnectorsList.Add(FiguresList.Items[FJoinedConnectorsIndexes[i]]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinedConnectorsIndexesForGrp[i]]);
if SCSFigureGrp <> nil then
JoinedConnectorsList.Add(SCSFigureGrp.InFigures.Items[FJoinedConnectorsIndexes[i]]);
end;
end;
if FObjectFromRaiseIndex = -1 then
begin
FObjectFromRaise := Nil;
end
else
begin
// FObjectFromRaise
// c êàäà
if FObjectFromRaiseIndexForGrp = -1 then
begin
FObjectFromRaise := TConnectorObject(FiguresList.Items[FObjectFromRaiseIndex]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FObjectFromRaiseIndexForGrp]);
if SCSFigureGrp <> nil then
FObjectFromRaise := TConnectorObject(SCSFigureGrp.InFigures.Items[FObjectFromRaiseIndex])
else
FObjectFromRaise := nil;
end;
LockMove := True;
LockModify := True;
end;
if ConnectorType = ct_Clear then
begin
if JoinedConnectorsList.Count > 0 then
begin
if CheckTrunkObject(TConnectorObject(JoinedConnectorsList[0])) then
begin
LockSelect := true;
LockModify := true;
LockMove := true;
end;
end;
end;
//
if DrawFigure <> nil then
begin
DrawFigure.FNetworkTypes := FNetworkTypes;
if FIndex = 0 then
begin
FIndex := GetFigureParams(ID).MarkID;
end;
end;
// FBlockGUID
if FBlockGUID = '' then
FBlockGUID := GetIconGUIDByIconID(FBlockID);
// ðàçìåð øðèôòà äëÿ ïîäïèñåé
if FCaptionsFontSize = -1 then
FCaptionsFontSize := GCadForm.FConnectorsCaptionsFontSize;
// ðàçìåð øðèôòà äëÿ âûíîñîê
if FNotesFontSize = -1 then
FNotesFontSize := GCadForm.FConnectorsNotesFontSize;
// öâåò ïîäïèñåé
if FCaptionsFontColor = -1 then
FCaptionsFontColor := GCadForm.FConnectorsCaptionsColor;
// öâåò âûíîñîê
if FNotesFontColor = -1 then
FNotesFontColor := GCadForm.FConnectorsNotesColor;
// DrawFigurePercent
if (FOriginalSizeX = -1) and (FOriginalSizeY = -1) then
begin
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
end;
if AsEndPoint then
begin
GEndPoint := Self;
GListWithEndPoint := GCadForm;
end;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TConnectorObject.RaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
// Tolik 13/06/2017 --
if CaptionsGroup <> nil then
CaptionsGroup.Visible := ShowCaptions;
if NotesGroup <> nil then
begin
if IsNoteExist(NotesGroup) then
NotesGroup.Visible := ShowNotes
else
NotesGroup.Visible := false;
end;
//
end;
procedure TConnectorObject.ReRaiseProperties;
var
i: integer;
CaptionsLHandle: Integer;
NotesLHandle: integer;
SCSLHandle: integer;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
Name: string;
mess: string;
FiguresList: TList;
l2, l4, l6: Integer;
SCSFigureGrp: TSCSFigureGrp;
Figure: TFigure;
begin
try
//
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(4);
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) or (DrawFigure = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TConnectorObject.RaiseProperties', 'ReSETDrawFigure');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := true;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
if DrawFigure <> nil then
begin
DrawFigure.FNetworkTypes := FNetworkTypes;
if FIndex = 0 then
begin
FIndex := GetFigureParams(ID).MarkID;
end;
end;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TConnectorObject.ReRaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
// Tolik (îðèãèíàë çàêîììåí÷åí ñì. íèæå)
// à çäåñü, ïîñêîëüêó âñå óæå "çÿ", ñîçäàåì âñå, ÷åãî íóæíî(çà îäèí ïðîõîä)
// (êîíöåïöèÿ ïîìåíÿëàñü, íåìíîæêî ïåðåäåëàíî ñîâñåì ...)
// FSingleBlock óäàëÿåì ñ ÊÀÄà ñîâñåì, áóäå ñèäåòü â FDrswFigure.InFigutres[0];
// ñòàðûå ïðîåêòû ïåðåñîõðàíÿòñÿ óæå ïðàâèëüíî (òàê æå)
procedure TOrthoLine.RaiseProperties(CadFigList: TList);
var
i: integer;
ConnectedConn: TConnectorObject;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
mess: string;
Join1, Join2: TFigure;
FiguresList: TList;
l2, l3, l5: Integer;
SCSLHandle: integer;
SCSFigureGrp: TSCSFigureGrp;
// Tolik
CanRaiseBlock: Boolean;
BadFigure: Boolean; // 05/11/2018
ObjectFromRaiseFigure: TconnectorObject;
CaptionsLHandle: Integer;
NotesLHandle: integer;
function CheckBadFiguresByIndexes(var aIndex: Integer; var aGRPIndex: integer; aIndexName, aGRPIndexName: string): boolean; // Tolik 05/11/2018 --
begin
Result := False;
if aGRPIndex <> -1 then
begin
if aGRPIndex < FiguresList.Count then
begin
if TFigure(FiguresList[aGRPIndex]).ClassName = 'TSCSFigureGrp' then
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList[aGRPIndex]);
if SCSFigureGrp <> nil then
begin
if SCSFigureGRP.LayerHandle <> SCSLHandle then
Result := True;
end
else
Result := True;
if Result then
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect ' + aGRPIndexName + ' for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
if not Result then
begin
if aIndex <> -1 then
begin
if aIndex < SCSFigureGRP.InFigures.Count then
begin
if Tfigure(SCSFigureGRP.InFigures[aIndex]).ClassName = 'TConnectorObject' then
begin
ObjectFromRaiseFigure := TConnectorObject(SCSFigureGRP.InFigures[aIndex]);
if ObjectFromRaiseFigure.LayerHandle <> SCSLHandle then
Result := True;
end
else
Result := True;
end
else
Result := True;
end
else
Result := True;
if Result then
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect ' + aIndexName + ' for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
Result := True;
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect ' + aGRPIndexName + ' for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
Result := True;
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect ' + aGRPIndexName + ' for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
end
else
begin
if aIndex <> -1 then
begin
if aIndex < FiguresList.Count then
begin
if TFigure(FiguresList[aIndex]).ClassName = 'TConnectorObject' then
begin
ObjectFromRaiseFigure := TConnectorObject(FiguresList[aIndex]);
if ObjectFromRaiseFigure.LayerHandle <> SCSLHandle then
Result := True;
end
else
Result := True;
end
else
Result := True;
end;
if Result then
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect ' + aIndexName + ' for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
if Result then
begin
aIndex := -1;
aGRPIndex := -1;
end;
end;
//
procedure ReRaiseProps;
var
mess: string;
//SCSLHandle: integer;
begin
try
//SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
If FSingleBlock = nil then
FSingleBlock := TFigureGrpMod.create(SCSLHandle, self.Owner);
FSingleBlock.fHasParent := True;
ReCreateDrawFigureBlock;
CanRaiseBlock := False;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TOrthoLine.ReRaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
begin
if Deleted then // Tolik 06/11/2018 --
exit;
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(3); // Tolik 06/11/2018 --
NotesLHandle := GCadForm.PCad.GetLayerHandle(5); // Tolik 06/11/2018 --
try
//
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := CadFigList; // GCadForm.PCad.Figures;
// Tolik -- åñëè ïðèøëà áèòàÿ ôèãóðà -- ïîìå÷àåì, êàê óäàëåííóþ, âûñòàâëÿåì ïðèçíàê, ÷òî ïðîåêò
// ïîäíÿò íåêîððåêòíî -- äàëüøå óæå íà óñìîòðåíèå ïîëüçîâàòåëÿ, à ìû îòñþäà âûâàëèâàåìñÿ
if (FIndex = 0) and (FNotesFontColor <= 0) then
begin
FtraceCaptionsList := Nil;
OutTextNotes := nil;
OutTextCaptions := nil;
SetLength(FActualZOrder, 0);
FDrawFigure := nil;
FSingleBlock := Nil;
NotesGroup := Nil;
CaptionsGroup := Nil;
// ïîäíÿòü ñâÿçóþùèå îáüåêòû îðòîëèíèè (÷òîáû è êîííåêòîðû îðòîëèíèè ìîãëè íàõ óäàëèòüñÿ )
if FJoinFigure1Index <> - 1 then
begin
// Join1
// c êàäà
if FJoinFigure1IndexForGrp = -1 then
begin
Join1 := TFigure(FiguresList.Items[FJoinFigure1Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure1IndexForGrp]);
if SCSFigureGrp <> nil then
Join1 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure1Index])
else
Join1 := nil;
end;
if (Join1 <> nil) and (ConnectorDetect(Join1)) then
SetJConnector1(TConnectorObject(Join1))
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
end
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
if FJoinFigure2Index <> - 1 then
begin
// Join2
// c êàäà
if FJoinFigure2IndexForGrp = -1 then
begin
Join2 := TFigure(FiguresList.Items[FJoinFigure2Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure2IndexForGrp]);
if SCSFigureGrp <> nil then
Join2 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure2Index])
else
Join2 := nil;
end;
if (Join2 <> nil) and (ConnectorDetect(Join2)) then
SetJConnector2(Join2)
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
end
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
Inc(GExceptionCount);
GProjectHasBrokenFigures := True; // ïðèçíàê íàëè÷èÿ áèòûõ ÑÊÑ ôèãóð â ïðîåêòå
Delete;
Exit;
end;
//
ConnectedConn := nil;
CaptionsGroup := nil;
NotesGroup := nil;
tmpCaptionsGroup := nil;
tmpCaptions := nil;
tmpNotesCaptions := nil;
CanRaiseBlock := True;
// äî ïîäúåìà, íà âñÿêìé ñëó÷àé, ïðîâåðèì, íå ñîçäàíî ëè ÷åãî, è âñå ëèøíåå øëåïàåì
if FSingleBlock <> nil then
begin
if FDrawFigure <> nil then
begin
if FDrawFigure.InFigures.IndexOf(FSingleBlock) <> -1 then
FDrawFigure.InFigures.Remove(FSingleBlock);
end;
FSingleBlock.Delete;
FSingleBlock := nil;
end;
if FDrawFigure <> Nil then
FDrawFigure.Delete;
FDrawfigure := nil;
//
// Tolik 6/11/2018 -- íà âñÿêèé --
if FCaptionsGroupIndex <> -1 then
begin
if ((TFigure(FiguresList[FCaptionsGroupIndex]).ClassName <> 'TFigureGrpNotMod') or
(TFigure(FiguresList[FCaptionsGroupIndex]).LayerHandle <> CaptionsLHandle)) then
begin
FCaptionsGroupIndex := -1;
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect FCaptionsGroupIndex for TOrthoLine '+ Name + ' '+InttoStr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
end;
if FNotesGroupIndex <> -1 then
begin
if ((TFigure(FiguresList[FNotesGroupIndex]).ClassName <> 'TFigureGrpNotMod') or
(TFigure(FiguresList[FNotesGroupIndex]).LayerHandle <> NotesLHandle)) then
begin
FNotesGroupIndex := -1;
addExceptionToLogEx('TOrthoLine.RaiseProperties:', 'Incorrect FNotesGroupIndex for TOrthoLine ' + Name + ' '+ Inttostr(FIndex) + ' on ' + GCadForm.FCadListName);
end;
end;
{
if ((FGroupObjectIndex = 0) or (FJoinFigure1Index = 0) or (FJoinFigure2Index = 0)
or ( FJoinFigure1IndexForGrp = 0 ) or ( FJoinFigure2IndexForGrp = 0 ) or (FObjectFromRaisedLineIndex = 0) or (FObjectFromRaisedLineIndexForGrp = 0)
or (FCaptionsGroupIndex = 0) or (FNotesGroupIndex = 0) ) then
}
if ((FGroupObjectIndex = 0) or (FJoinFigure1Index = 0) or (FJoinFigure2Index = 0) or ( FJoinFigure1IndexForGrp = 0 ) or
( FJoinFigure2IndexForGrp = 0 ) or ((FObjectFromRaisedLineIndex <> -1) and (FObjectFromRaisedLineIndexForGrp = -1)) or (FObjectFromRaisedLineIndexForGrp = 0)) then
//
begin
//beep;
// Tolik 05/10/2018 --
// FObjectFromRaisedLine check
BadFigure := CheckBadFiguresByIndexes(FObjectFromRaisedLineIndex, FObjectFromRaisedLineIndexForGrp, 'FObjectFromRaisedLineIndex', 'FObjectFromRaisedLineIndexForGrp');
if not BadFigure then
begin
BadFigure := CheckBadFiguresByIndexes(FJoinFigure1Index, FJoinFigure1IndexForGrp, 'FJoinFigure1Index', 'FJoinFigure1IndexForGrp');
end;
if not BadFigure then
begin
BadFigure := CheckBadFiguresByIndexes(FJoinFigure2Index, FJoinFigure2IndexForGrp, 'FJoinFigure2Index', 'FJoinFigure2IndexForGrp');
end;
if BadFigure then
begin
//
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET all need figure index');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
end;
end;
if ((FCount <> 1) and (FMultilineCaptionBoxIndex = 0)) then
begin
//beep;
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET all need figure index');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
end;
// FGroupObject
if FGroupObjectIndex <> - 1 then
FGroupObject := TSCSFigureGrp(FiguresList.Items[FGroupObjectIndex])
else
FGroupObject := nil;
//SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
//Tolik
// FSingleBlock
// äëÿ ñòàðûõ ïðîåêòîâ
if FSingleBlockIndex <> -10000 then
begin
if(FSingleBlockIndex = 0) or (FSingleBlockIndex = -1) then
begin
FSingleBlock := nil;
//Tolik
ReRaiseProps;
//
end
else
begin
// FSingleBlock
FSingleBlock := TFigureGrpMod(FiguresList.Items[FSingleBlockIndex]);
try
if FSingleBlock <> nil then
begin
if not FSingleBlock.fHasParent then
begin
SetLayerHandleForFigureGrp(FSingleBlock, SCSLHandle);
FSingleBlock.fHasParent := true;
end
else
begin
FSingleBlock := nil;
ReRaiseProps;
end;
end;
except
end;
end;
end;
// DrawFigure
//igor
// Tolik
// åñëè íå áûëî ïåðåñîçäàíèÿ (äëÿ ñòàðûõ ïðîåêòîâ)
if FdrawFigure = nil then
begin
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) then // áèòàÿ ôèãóðà, ïåðåñîçäàåì íàõ
begin
FDrawFigure := nil;
ReRaiseProps;
end
else
begin
FDrawFigure := TFigureGrpMod(FiguresList.Items[FDrawFigureIndex]);
if FDrawFigure <> nil then
begin
// ÔÈÃÓÐÀ ÎÒÐÈÑÎÂÊÈ
// åñëè íåïóñòàÿ è ïàðåíòà íåò - ïîäíèìàåì
if FDrawFigure.InFigures.Count <> 0 then
begin
if not FDrawFigure.fHasParent then
begin
FDrawFigure.fHasParent := true;
if FSingleBlock <> nil then // åñëè ïîäíÿëñÿ (ñòàðûé ïðîåêò)
begin
for i := 0 to FDrawFigure.InFigures.Count - 1 do
begin
if FSingleBlock.ID = TFigureGrpMod(FDrawFigure.InFigures[i]).ID then
begin
FSingleBlock.Delete; // äëÿ ñòàðûõ ïðîåêòîâ - óáèðàåì ñ ÊÀÄà
FSingleBlock := TFigureGrpMod(FDrawFigure.InFigures[i]); // òåîðåòè÷åñêè çäåñü ñèäèò ïî-ëþáîìó
CanRaiseBlock := False;
break;
end;
end;
end;
// íå ïîäíÿëñÿ (äëÿ ñòàðûõ ïðîåêòîâ)
if (FSingleBlockIndex <> -10000) and (FSingleBlock = nil) then
begin
FDrawFigure := nil; // ñáðîñ
ReRaiseProps; // ïåðåñîçäàåì (ñòàðûé ïðîåêò)
end;
end
else
// åñëè çàäàí ïàðåíò äðàâôèãóðû - ïåðåñîçäàåì
begin
FDrawFigure := nil;
ReRaiseProps;
end;
end
// åñëè ïóñòàÿ - ïåðåñîçäàåì
else
begin
FDrawFigure := nil;
ReRaiseProps;
end;
end
else // ôèãóðà îòðèñîâêè íå ïîäíÿëàñü - ïåðåñîçäàåì
ReRaiseProps;
end;
end;
// äëÿ íîâûõ (áëîê îòðèñîâêè)
if (CanRaiseBlock and (FSingleBlockIndex = -10000)) then // åñëè íå ïîäíÿò åùå, òî çäåñü áóäåò NIL
begin
if FDrawFigure <> nil then
begin
if FDrawFigure.InFigures.Count > 0 then
FSingleBlock := TFigureGrpMod(FDrawFigure.InFigures[0]); // òåîðåòè÷åñêè äîëæåí ñèäåòü çäåñü
if FSingleBlock = nil then // åñëè íå ïîäíÿëñÿ âäðóã - ïåðåñîçäàåì âìåñòå ñ ôèãóðîé îòðèñîâêè
ReRaiseProps;
end
else
ReRaiseProps;
end;
if FSingleBlock <> nil then // íà âñÿêèé (âäðóã ïðîñêî÷èë), âñå ðàâíî ñ ÊÀÄà óáèðàåì
TF_CAD(TF_CAD(FSingleBlock.Owner).Owner).PCad.Figures.Remove(FSingleBlock);
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
// ïîäíÿòü ñâÿçóþùèå îáüåêòû îðòîëèíèè
if FJoinFigure1Index <> - 1 then
begin
// Join1
// c êàäà
if FJoinFigure1IndexForGrp = -1 then
begin
Join1 := TFigure(FiguresList.Items[FJoinFigure1Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure1IndexForGrp]);
if SCSFigureGrp <> nil then
Join1 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure1Index])
else
Join1 := nil;
end;
if (Join1 <> nil) and (ConnectorDetect(Join1)) then
SetJConnector1(TConnectorObject(Join1))
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
end
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
if FJoinFigure2Index <> - 1 then
begin
// Join2
// c êàäà
if FJoinFigure2IndexForGrp = -1 then
begin
Join2 := TFigure(FiguresList.Items[FJoinFigure2Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure2IndexForGrp]);
if SCSFigureGrp <> nil then
Join2 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure2Index])
else
Join2 := nil;
end;
if (Join2 <> nil) and (ConnectorDetect(Join2)) then
SetJConnector2(Join2)
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
end
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
if FObjectFromRaisedLineIndex = -1 then
begin
FObjectFromRaisedLine := Nil;
FIsRaiseUpDown := False;
end
else
begin
// FObjectFromRaisedLineIndex
// c êàäà
if FObjectFromRaisedLineIndexForGrp = -1 then
begin
FObjectFromRaisedLine := TConnectorObject(FiguresList.Items[FObjectFromRaisedLineIndex]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FObjectFromRaisedLineIndexForGrp]);
if SCSFigureGrp <> nil then
FObjectFromRaisedLine := TConnectorObject(SCSFigureGrp.InFigures.Items[FObjectFromRaisedLineIndex])
else
FObjectFromRaisedLine := nil;
end;
FIsRaiseUpDown := True;
LockMove := True;
LockModify := True;
if JoinConnector1 <> nil then
if TConnectorObject(JoinConnector1).FConnRaiseType = crt_None then
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count > 0 then
ConnectedConn := TConnectorObject(JoinConnector1);
if JoinConnector2 <> nil then
if TConnectorObject(JoinConnector2).FConnRaiseType = crt_None then
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count > 0 then
ConnectedConn := TConnectorObject(JoinConnector2);
if ConnectedConn <> nil then
begin
ConnectedConn.LockMove := True;
ConnectedConn.LockModify := True;
end;
end;
// ïîäíÿòü CaptionsGroup
if FCaptionsGroupIndex <> -1 then
begin
tmpCaptionsGroup := TFigure(FiguresList.Items[FCaptionsGroupIndex]);
// CONVERT
if CheckFigureByClassName(tmpCaptionsGroup, cTFigureGrpNotMod) then
begin
if Not TFigureGrpNotMod(tmpCaptionsGroup).fHasParent then
begin
TFigureGrpNotMod(tmpCaptionsGroup).fHasParent := True;
tmpCaptionsGroup := TFigureGrpNotMod(tmpCaptionsGroup);
// Tolik 06/03/2017 --- åñëè íå ïîêàçûâàòü äëèíó, òî âîòêíóòü äëèíó â îïèñàíèå äëèíû
if not Self.ShowLength then
OutTextCaptions.Add(FormatFloat('0.00', Self.LineLength));
//
// Ñàìûé íîâûé ôîðìàò
if (TFigureGrpNotMod(tmpCaptionsGroup).InFigures.Count = 2) and CheckFigureByClassName(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[1], cTRichTextMod) then
begin
tmpCaptions := TRichTextMod(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[1]);
for i := 0 to TRichTextMod(tmpCaptions).Re.Lines.Count - 1 do
OutTextCaptions.Add(TRichTextMod(tmpCaptions).Re.Lines[i]);
TRichTextMod(tmpCaptions).Visible := True;
end
else
// ñàìûé ñòàðûé ôîðìàò
begin
for i := 0 to TFigureGrpNotMod(tmpCaptionsGroup).InFigures.Count - 1 do
OutTextCaptions.Add(TTextMod(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[i]).Text);
tmpCaptions := nil;
end;
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
if CheckFigureByClassName(tmpCaptionsGroup, cTRichTextMod) then
begin
if Not TRichTextMod(tmpCaptionsGroup).fHasParent then
begin
TRichTextMod(tmpCaptionsGroup).fHasParent := True;
tmpCaptionsGroup := TRichTextMod(tmpCaptionsGroup);
// Tolik 06/03/2017 --- åñëè íå ïîêàçûâàòü äëèíó, òî âîòêíóòü äëèíó â îïèñàíèå äëèíû
if not Self.ShowLength then
OutTextCaptions.Add(FormatFloat('0.00', Self.LineLength));
//
for i := 0 to TRichTextMod(tmpCaptionsGroup).Re.Lines.Count - 1 do
OutTextCaptions.Add(TRichTextMod(tmpCaptionsGroup).Re.Lines[i]);
TRichTextMod(tmpCaptionsGroup).Visible := True;
tmpCaptions := nil;
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
begin
tmpCaptionsGroup := nil;
end;
if tmpCaptionsGroup <> nil then
tmpCaptionsGroup.LockModify := True;
end;
// ïîäíÿòü NotesGroup
if FNotesGroupIndex <> -1 then
begin
NotesGroup := TFigureGrpNotMod(FiguresList.Items[FNotesGroupIndex]);
//
if Not NotesGroup.fHasParent then
begin
NotesGroup.fHasParent := True;
for i := 0 to NotesGroup.InFigures.Count - 1 do
begin
tmpNotesCaptions:= TFigure(NotesGroup.InFigures[i]);
end;
//
// CONVERT
if CheckFigureByClassName(tmpNotesCaptions, cTFigureGrpNotMod) then
begin
tmpNotesCaptions := TFigureGrpNotMod(tmpNotesCaptions);
for i := 0 to TFigureGrpNotMod(tmpNotesCaptions).InFigures.Count - 1 do
OutTextNotes.Add(TTextMod(TFigureGrpNotMod(tmpNotesCaptions).InFigures[i]).Text);
TFigureGrpNotMod(NotesGroup.InFigures[1]).Visible := True;
end
else
if CheckFigureByClassName(tmpNotesCaptions, cTRichTextMod) then
begin
tmpNotesCaptions := TRichTextMod(tmpNotesCaptions);
for i := 0 to TRichTextMod(tmpNotesCaptions).re.Lines.Count - 1 do
OutTextNotes.Add(TRichTextMod(tmpNotesCaptions).re.Lines[i]);
TRichTextMod(NotesGroup.InFigures[1]).Visible := True;
end
else
begin
tmpNotesCaptions := nil;
end;
TFigureGrpNotMod(NotesGroup.InFigures[0]).Visible := True;
NotesGroup.LockModify := True;
end
else
begin
NotesGroup := nil;
end;
end;
//Tolik -- 13/06/2017 --
if NotesGroup <> nil then
begin
if IsNoteExist(NotesGroup) then
NotesGroup.Visible := ShowNotes
else
NotesGroup.Visible := false;
end;
if CaptionsGroup <> nil then
CaptionsGroup.Visible := ShowCaptions;
//
// ïîäíÿòü CaptionBox, åñëè åñòü
if FCount <> 1 then
begin
MultilineCaptionBox := TFigure(FiguresList.Items[FMultilineCaptionBoxIndex]);
TTextMod(MultilineCaptionBox).LockMove := True;
TTextMod(MultilineCaptionBox).LockModify := True;
end;
if DrawFigure <> nil then
begin
// äëÿ DrawFigure
DrawFigure.FNetworkTypes := FNetworkTypes;
DrawFigure.Visible := IsShowBlock;
end;
if FSingleBlock <> nil then
begin
FSingleBlock.Visible := IsShowBlock;
end;
// ñáðîñèòü ôëàã ïðîñ÷åòà äëèíû ëèíèè íà MOVE
FNotRecalcLength := False;
LineLength := CalculLength;
if FIndex = 0 then
begin
FIndex := GetFigureParams(ID).MarkID;
end;
if FIsRaiseUpDown then
if LockMove then
LockMove := False;
// FBlockGUID
if FBlockGUID = '' then
FBlockGUID := GetIconGUIDByIconID(FBlockID);
// ðàçìåð øðèôòà äëÿ ïîäïèñåé
if FCaptionsFontSize = -1 then
FCaptionsFontSize := GCadForm.FLinesCaptionsFontSize;
// ðàçìåð øðèôòà äëÿ âûíîñîê
if FNotesFontSize = -1 then
FNotesFontSize := GCadForm.FLinesNotesFontSize;
// öâåò ïîäïèñåé
if FCaptionsFontColor = - 1 then
FCaptionsFontColor := GCadForm.FLinesCaptionsColor;
// öâåò âûíîñîê
if FNotesFontColor = - 1 then
FNotesFontColor := GCadForm.FLinesNotesColor;
// DrawFigurePercent
if (FOriginalSizeX = -1) and (FOriginalSizeY = -1) then
begin
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
end;
if DrawFigure <> nil then
begin
if DrawFigureH = -999999 then
DrawFigureH := CalcHDrawFigure;
end;
if CaptionsGroupH = -999999 then
CaptionsGroupH := CalcHCaptionsGroup;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TOrthoLine.RaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
// ñòàðàÿ -- íà âñÿêèé
(*
procedure TOrthoLine.RaiseProperties(CadFigList: TList);
var
i: integer;
ConnectedConn: TConnectorObject;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
mess: string;
Join1, Join2: TFigure;
FiguresList: TList;
l2, l3, l5: Integer;
SCSLHandle: integer;
SCSFigureGrp: TSCSFigureGrp;
// Tolik
CanAddBlock: Boolean;
procedure ReRaiseProps;
var
i: integer;
ConnectedConn: TConnectorObject;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
mess: string;
Join1, Join2: TFigure;
FiguresList: TList;
l2, l3, l5: Integer;
SCSLHandle: integer;
SCSFigureGrp: TSCSFigureGrp;
begin
try
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
// DrawFigure
//igor
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) or (DrawFigure = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'ReSetDrawFigure');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := True;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
if(FSingleBlockIndex = 0) or (FSingleBlockIndex = -1) or (FSingleBlock = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'ResSetSingleBlock');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FSingleBlock := TFigureGrpMod.create(SCSLHandle, self.Owner);
FSingleBlock.fHasParent := True;
////GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FSingleBlock, False);
// Tolik
// äóáëü
FDrawFigure.AddFigure(FSingleBlock);
/////FDrawFigure.AddFigure(TFigureGrpMod(FSingleBlock.Duplicate));
//
ReCreateDrawFigureBlock
end;
if DrawFigure <> nil then
begin
// äëÿ DrawFigure
DrawFigure.FNetworkTypes := FNetworkTypes;
DrawFigure.Visible := IsShowBlock;
end;
if FSingleBlock <> nil then
begin
FSingleBlock.Visible := IsShowBlock;
end;
if DrawFigure <> nil then
begin
if DrawFigureH = -999999 then
DrawFigureH := CalcHDrawFigure;
end;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TOrthoLine.ReRaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
begin
try
//
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := CadFigList; // GCadForm.PCad.Figures;
ConnectedConn := nil;
CaptionsGroup := nil;
NotesGroup := nil;
tmpCaptionsGroup := nil;
tmpCaptions := nil;
tmpNotesCaptions := nil;
if ((FGroupObjectIndex = 0) or (FJoinFigure1Index = 0) or (FJoinFigure2Index = 0)
or ( FJoinFigure1IndexForGrp = 0 ) or ( FJoinFigure2IndexForGrp = 0 ) or (FObjectFromRaisedLineIndex = 0) or (FObjectFromRaisedLineIndexForGrp = 0)
or (FCaptionsGroupIndex = 0) or (FNotesGroupIndex = 0) ) then
begin
//beep;
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET all need figure index');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
end;
if ((FCount <> 1) and (FMultilineCaptionBoxIndex = 0)) then
begin
//beep;
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET all need figure index');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
end;
// FGroupObject
if FGroupObjectIndex <> - 1 then
FGroupObject := TSCSFigureGrp(FiguresList.Items[FGroupObjectIndex])
else
FGroupObject := nil;
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
// DrawFigure
//igor
//if TFigure(FiguresList.Items[FDrawFigureIndex]).ClassName <> 'TFigureGrpMod' then
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) then
begin
{ ÍÅËÜÇß ÑÎÇÄÀÂÀÒÜ ÍÈ×ÅÃÎ ÍÀ RaiseProperties èíà÷å ïîïëûâóò ñëåä. ôèãóðû íà òàêèõ êîíñòðóêöèÿõ FiguresList.Items[FDrawFigureIndex];
Ýòî äåëàåòñÿ â äîï.ïðîõîäå
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET DrawFigureIndex');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
//Beep;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
//MoveTextBox(FDrawFigure, ActualPoints[1], ActualPoints[2], False);
FDrawFigure.LockModify := True;
}
//Tolik
//GNeedReRaiseProperties := True;
//
FDrawFigure := nil;
//Tolik
ReRaiseProps;
//
end
else
begin
FDrawFigure := TFigureGrpMod(FiguresList.Items[FDrawFigureIndex]);
if FDrawFigure <> nil then
begin
if not FDrawFigure.fHasParent then
begin
FDrawFigure.fHasParent := true;
end
else
begin
//Tolik
//GNeedReRaiseProperties := True;
//
FDrawFigure := nil;
//Tolik
ReRaiseProps;
//
end;
end;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
if(FSingleBlockIndex = 0) or (FSingleBlockIndex = -1) then
begin
{ ÍÅËÜÇß ÑÎÇÄÀÂÀÒÜ ÍÈ×ÅÃÎ ÍÀ RaiseProperties èíà÷å ïîïëûâóò ñëåä. ôèãóðû íà òàêèõ êîíñòðóêöèÿõ FiguresList.Items[FDrawFigureIndex];
Ýòî äåëàåòñÿ â äîï.ïðîõîäå
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'Not SET SingleBlockIndex');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
FSingleBlock := TFigureGrpMod.create(SCSLHandle, self.Owner);
//FSingleBlock.fHasParent := True;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FSingleBlock, False);
FDrawFigure.AddFigure(FSingleBlock);
ReCreateDrawFigureBlock
}
//Tolik
//GNeedReRaiseProperties := True;
//
FSingleBlock := nil;
//Tolik
ReRaiseProps;
//
end
else
begin
// FSingleBlock
FSingleBlock := TFigureGrpMod(FiguresList.Items[FSingleBlockIndex]);
try
if FSingleBlock <> nil then
begin
if not FSingleBlock.fHasParent then
begin
SetLayerHandleForFigureGrp(FSingleBlock, SCSLHandle);
FSingleBlock.fHasParent := true;
// Tolik
// if FDrawFigure <> FSingleBlock then -- çäåñü òàê íå äåëàòü â ñèëó îñîáåííîñòåé âçàèìîîòíîøåíèÿ äàííûõ ôèãóð
if (FDrawFigure.ID <> FSingleBlock.ID) and (FDrawFigure.Name <> FSingleBlock.Name) then
//
// if (FDrawFigure <> nil) and (FSingleBlock <> nil) then ---> ëèøíåå, òàê êàê (FSingleBlock <> nil) - ïîðîã
// âõîæäåíèÿ â ýòó ÷àñòü ïðîãðàììû, à FDrawFigure â êðàéíåì ñëó÷àå, ïåðåñîçäàñòñÿ âûøå, åñëè íå ïîäíÿëàñü
//Tolik
begin
// FDrawFigure.AddFigure(FSingleBlock);
// òàê áûëî, íî ýòî ïðèâîäèò ê òîìó, ÷òî êîãäà äàâôèãóðà ïîäíèìåòñÿ óæå ñ áëîêîì, âòîðîé áëîê äîáàâèòñÿ
// â ñïèñîê(FDrawFigure.inFigures) òîæå, ïðè÷åì ñðàâíåíèå áëîêîâ íè÷åãî íå äàñò, òàê êàê ñîçäàíèå ïðîèñõîäèò
// îòäåëüíî, à ïðèñâîåíèå ñâîéñòâ - ïðè ïîäúåìå ñî ñòðèìà, òàê ÷òî äàæå äâà îäèíàêîâûõ îáúåêòà áóäóò îòëè÷àòüñÿ
// (õåíäëàìè), õîòÿ è èìåþò îäèí è
// òîò æå íàáîð ñâîéñòâ, âî èçáåæàíèå ñòàâèì ïðîâåðêó
{CanAddBlock := True;
for i := 0 to FDrawFigure.InFigures.Count - 1 do
begin
if ((TFigure(FDrawFigure.InFigures[i]).ID = TFigure(FSingleBlock).ID) and
(TFigure(FDrawFigure.InFigures[i]).Name = TFigure(FSingleBlock).Name)) then
begin
CanAddBlock := False;
break;
end;
end;
if CanAddBlock then}
// ñàì áëîê - ýòî øàáëîí, ïîýòîìó ïî íåìó ñîçäàåì äóáëü è çàñîâûâàåì â äðàâôèãóðó
if FDrawFigure.InFigures.Count = 0 then
FDrawFigure.AddFigure(TFigureGrpMod(FSingleBlock.Duplicate));
end;
//
// if (FDrawFigure <> nil)
// if FDrawFigure.InFigures.Count > 0 then
// FDrawFigure.InFigures[0] := FSingleBlock;
end
else
begin
{ ÍÅËÜÇß ÑÎÇÄÀÂÀÒÜ ÍÈ×ÅÃÎ ÍÀ RaiseProperties èíà÷å ïîïëûâóò ñëåä. ôèãóðû íà òàêèõ êîíñòðóêöèÿõ FiguresList.Items[FDrawFigureIndex];
Ýòî äåëàåòñÿ â äîï.ïðîõîäå
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'SingleBlock recreate');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FSingleBlock := TFigureGrpMod.create(SCSLHandle, self.Owner);
FSingleBlock.fHasParent := True;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FSingleBlock, False);
FDrawFigure.AddFigure(FSingleBlock);
ReCreateDrawFigureBlock
}
//Tolik
//GNeedReRaiseProperties := True;
//
FSingleBlock := nil;
//Tolik
ReRaiseProps;
//
end;
end;
except
end;
end;
// ïîäíÿòü ñâÿçóþùèå îáüåêòû îðòîëèíèè
if FJoinFigure1Index <> - 1 then
begin
// Join1
// c êàäà
if FJoinFigure1IndexForGrp = -1 then
begin
Join1 := TFigure(FiguresList.Items[FJoinFigure1Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure1IndexForGrp]);
if SCSFigureGrp <> nil then
Join1 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure1Index])
else
Join1 := nil;
end;
if (Join1 <> nil) and (ConnectorDetect(Join1)) then
SetJConnector1(TConnectorObject(Join1))
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
end
else
begin
JoinConnector1 := TConnectorObject.Create(ActualPoints[1].x, ActualPoints[1].y, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector1).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector1), False);
SetJConnector1(TConnectorObject(JoinConnector1));
end;
if FJoinFigure2Index <> - 1 then
begin
// Join2
// c êàäà
if FJoinFigure2IndexForGrp = -1 then
begin
Join2 := TFigure(FiguresList.Items[FJoinFigure2Index]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FJoinFigure2IndexForGrp]);
if SCSFigureGrp <> nil then
Join2 := TFigure(SCSFigureGrp.InFigures.Items[FJoinFigure2Index])
else
Join2 := nil;
end;
if (Join2 <> nil) and (ConnectorDetect(Join2)) then
SetJConnector2(Join2)
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
end
else
begin
JoinConnector2 := TConnectorObject.Create(ActualPoints[2].x, ActualPoints[2].y, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
TConnectorObject(JoinConnector2).ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), TConnectorObject(JoinConnector2), False);
SetJConnector2(TConnectorObject(JoinConnector2));
end;
if FObjectFromRaisedLineIndex = -1 then
begin
FObjectFromRaisedLine := Nil;
FIsRaiseUpDown := False;
end
else
begin
// FObjectFromRaisedLineIndex
// c êàäà
if FJoinFigure1IndexForGrp = -1 then
begin
FObjectFromRaisedLine := TConnectorObject(FiguresList.Items[FObjectFromRaisedLineIndex]);
end
else
// ñ ãðóïïû
begin
SCSFigureGrp := TSCSFigureGrp(FiguresList.Items[FObjectFromRaisedLineIndexForGrp]);
if SCSFigureGrp <> nil then
FObjectFromRaisedLine := TConnectorObject(SCSFigureGrp.InFigures.Items[FObjectFromRaisedLineIndex])
else
FObjectFromRaisedLine := nil;
end;
FIsRaiseUpDown := True;
LockMove := True;
LockModify := True;
if JoinConnector1 <> nil then
if TConnectorObject(JoinConnector1).FConnRaiseType = crt_None then
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count > 0 then
ConnectedConn := TConnectorObject(JoinConnector1);
if JoinConnector2 <> nil then
if TConnectorObject(JoinConnector2).FConnRaiseType = crt_None then
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count > 0 then
ConnectedConn := TConnectorObject(JoinConnector2);
if ConnectedConn <> nil then
begin
ConnectedConn.LockMove := True;
ConnectedConn.LockModify := True;
end;
end;
// ïîäíÿòü CaptionsGroup
if FCaptionsGroupIndex <> -1 then
begin
tmpCaptionsGroup := TFigure(FiguresList.Items[FCaptionsGroupIndex]);
// CONVERT
if CheckFigureByClassName(tmpCaptionsGroup, cTFigureGrpNotMod) then
begin
if Not TFigureGrpNotMod(tmpCaptionsGroup).fHasParent then
begin
TFigureGrpNotMod(tmpCaptionsGroup).fHasParent := True;
tmpCaptionsGroup := TFigureGrpNotMod(tmpCaptionsGroup);
// Ñàìûé íîâûé ôîðìàò
if (TFigureGrpNotMod(tmpCaptionsGroup).InFigures.Count = 2) and CheckFigureByClassName(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[1], cTRichTextMod) then
begin
tmpCaptions := TRichTextMod(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[1]);
for i := 0 to TRichTextMod(tmpCaptions).Re.Lines.Count - 1 do
OutTextCaptions.Add(TRichTextMod(tmpCaptions).Re.Lines[i]);
TRichTextMod(tmpCaptions).Visible := True;
end
else
// ñàìûé ñòàðûé ôîðìàò
begin
for i := 0 to TFigureGrpNotMod(tmpCaptionsGroup).InFigures.Count - 1 do
OutTextCaptions.Add(TTextMod(TFigureGrpNotMod(tmpCaptionsGroup).InFigures[i]).Text);
tmpCaptions := nil;
end;
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
if CheckFigureByClassName(tmpCaptionsGroup, cTRichTextMod) then
begin
if Not TRichTextMod(tmpCaptionsGroup).fHasParent then
begin
TRichTextMod(tmpCaptionsGroup).fHasParent := True;
tmpCaptionsGroup := TRichTextMod(tmpCaptionsGroup);
for i := 0 to TRichTextMod(tmpCaptionsGroup).Re.Lines.Count - 1 do
OutTextCaptions.Add(TRichTextMod(tmpCaptionsGroup).Re.Lines[i]);
TRichTextMod(tmpCaptionsGroup).Visible := True;
tmpCaptions := nil;
end
else
begin
tmpCaptionsGroup := nil;
end;
end
else
begin
tmpCaptionsGroup := nil;
end;
if tmpCaptionsGroup <> nil then
tmpCaptionsGroup.LockModify := True;
end;
// ïîäíÿòü NotesGroup
if FNotesGroupIndex <> -1 then
begin
NotesGroup := TFigureGrpNotMod(FiguresList.Items[FNotesGroupIndex]);
//
if Not NotesGroup.fHasParent then
begin
NotesGroup.fHasParent := True;
for i := 0 to NotesGroup.InFigures.Count - 1 do
begin
tmpNotesCaptions:= TFigure(NotesGroup.InFigures[i]);
end;
//
// CONVERT
if CheckFigureByClassName(tmpNotesCaptions, cTFigureGrpNotMod) then
begin
tmpNotesCaptions := TFigureGrpNotMod(tmpNotesCaptions);
for i := 0 to TFigureGrpNotMod(tmpNotesCaptions).InFigures.Count - 1 do
OutTextNotes.Add(TTextMod(TFigureGrpNotMod(tmpNotesCaptions).InFigures[i]).Text);
TFigureGrpNotMod(NotesGroup.InFigures[1]).Visible := True;
end
else
if CheckFigureByClassName(tmpNotesCaptions, cTRichTextMod) then
begin
tmpNotesCaptions := TRichTextMod(tmpNotesCaptions);
for i := 0 to TRichTextMod(tmpNotesCaptions).re.Lines.Count - 1 do
OutTextNotes.Add(TRichTextMod(tmpNotesCaptions).re.Lines[i]);
TRichTextMod(NotesGroup.InFigures[1]).Visible := True;
end
else
begin
tmpNotesCaptions := nil;
end;
TFigureGrpNotMod(NotesGroup.InFigures[0]).Visible := True;
NotesGroup.LockModify := True;
end
else
begin
NotesGroup := nil;
end;
end;
// ïîäíÿòü CaptionBox, åñëè åñòü
if FCount <> 1 then
begin
MultilineCaptionBox := TFigure(FiguresList.Items[FMultilineCaptionBoxIndex]);
TTextMod(MultilineCaptionBox).LockMove := True;
TTextMod(MultilineCaptionBox).LockModify := True;
end;
if DrawFigure <> nil then
begin
// äëÿ DrawFigure
DrawFigure.FNetworkTypes := FNetworkTypes;
DrawFigure.Visible := IsShowBlock;
end;
if FSingleBlock <> nil then
begin
FSingleBlock.Visible := IsShowBlock;
end;
// ñáðîñèòü ôëàã ïðîñ÷åòà äëèíû ëèíèè íà MOVE
FNotRecalcLength := False;
LineLength := CalculLength;
if FIndex = 0 then
begin
FIndex := GetFigureParams(ID).MarkID;
end;
if FIsRaiseUpDown then
if LockMove then
LockMove := False;
// FBlockGUID
if FBlockGUID = '' then
FBlockGUID := GetIconGUIDByIconID(FBlockID);
// ðàçìåð øðèôòà äëÿ ïîäïèñåé
if FCaptionsFontSize = -1 then
FCaptionsFontSize := GCadForm.FLinesCaptionsFontSize;
// ðàçìåð øðèôòà äëÿ âûíîñîê
if FNotesFontSize = -1 then
FNotesFontSize := GCadForm.FLinesNotesFontSize;
// öâåò ïîäïèñåé
if FCaptionsFontColor = - 1 then
FCaptionsFontColor := GCadForm.FLinesCaptionsColor;
// öâåò âûíîñîê
if FNotesFontColor = - 1 then
FNotesFontColor := GCadForm.FLinesNotesColor;
// DrawFigurePercent
if (FOriginalSizeX = -1) and (FOriginalSizeY = -1) then
begin
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
end;
if DrawFigure <> nil then
begin
if DrawFigureH = -999999 then
DrawFigureH := CalcHDrawFigure;
end;
if CaptionsGroupH = -999999 then
CaptionsGroupH := CalcHCaptionsGroup;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TOrthoLine.RaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
*)
// Tolik -- 23/11/2015 -- ýòå ïðîöåäóðà óæå íå þçàåòñÿ, íî, íà âñÿêèé, ïîäðèõòîâàë
procedure TOrthoLine.ReRaiseProperties;
var
i: integer;
ConnectedConn: TConnectorObject;
NetTypes: TObjectNetworkTypes;
NotesCaptions: TRichTextMod;
mess: string;
Join1, Join2: TFigure;
FiguresList: TList;
l2, l3, l5: Integer;
SCSLHandle: integer;
SCSFigureGrp: TSCSFigureGrp;
begin
try
//
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
SCSLHandle := GCadForm.PCad.GetLayerHandle(2);
// DrawFigure
//igor
if (FDrawFigureIndex = 0) or (FDrawFigureIndex = -1) or (DrawFigure = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'ReSetDrawFigure');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FDrawFigure := TFigureGrpMod.create(SCSLHandle, Self.Owner);
FDrawFigure.fHasParent := True;
GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FDrawFigure, False);
FDrawFigure.LockModify := True;
end;
try
if FDrawFigure <> nil then
SetLayerHandleForFigureGrp(FDrawFigure, SCSLHandle);
except
end;
if(FSingleBlockIndex = 0) or (FSingleBlockIndex = -1) or (FSingleBlock = nil) then
begin
GShowMessTextInAdmBuild := False;
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
addExceptionToLogEx('TOrthoLine.RaiseProperties', 'ResSetSingleBlock');
GListRaiseWithErrors := True;
GShowMessTextInAdmBuild := True;
GExceptionCount := GExceptionCount - 1;
FSingleBlock := TFigureGrpMod.create(SCSLHandle, self.Owner);
FSingleBlock.fHasParent := True;
// 23/11/2015
//GCadForm.PCad.AddCustomFigure (GLN(SCSLHandle), FSingleBlock, False);
//Tolik
//FDrawFigure.AddFigure(FSingleBlock);
//FDrawFigure.AddFigure(TFigureGrpMod(FSingleBlock.Duplicate));
//
ReCreateDrawFigureBlock
end;
if DrawFigure <> nil then
begin
// äëÿ DrawFigure
DrawFigure.FNetworkTypes := FNetworkTypes;
DrawFigure.Visible := IsShowBlock;
end;
if FSingleBlock <> nil then
begin
FSingleBlock.Visible := IsShowBlock;
end;
if DrawFigure <> nil then
begin
if DrawFigureH = -999999 then
DrawFigureH := CalcHDrawFigure;
end;
// LayerCheck
l2 := GCadForm.PCad.GetLayerHandle(2);
if DrawFigure <> nil then
if DrawFigure.LayerHandle <> l2 then
DrawFigure.LayerHandle := l2;
except
on E: Exception do
begin
mess := cCadClasses_Mes13 + Name + IntToStr(FIndex) + cCadClasses_Mes14;
ShowMessageByType(0, smtNone, mess, '', 0);
addExceptionToLogEx('TOrthoLine.ReRaiseProperties', E.Message);
GListRaiseWithErrors := True;
end;
end;
end;
procedure TConnectorObject.Select;
begin
try
// Åñëè ïóñòîé ñîåäèíèòåëü íå âèäèìûé, òî îòîáðàæàåì òîëüêî åñëè íàæàò Shift èëè Ctrl
if Not FIsDraw and (ConnectorType = ct_Clear) then
if (Not(ssShift in GGlobalShiftState)) {and (Not(ssCtrl in GGlobalShiftState))} then
begin
//DeSelect;
Exit; ///// EXIT ///// //05.04.2011
end;
if not FIsHouseJoined then
inherited;
if FIsApproach then
begin
if DrawFigure <> nil then
begin
DrawFigure.fFromApproach := Self;
DrawFigure.fFromHouse := FHouse;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.Select', E.Message);
end;
end;
procedure TOrthoLine.SetLineLength(const Value: Double);
begin
try
if UserLength = -1 then
FLength := Value
else
FLength := UserLength;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetLineLength', E.Message);
end;
end;
{ TFigureGrpNotMod }
procedure TFigureGrpNotMod.Delete;
begin
try
if Not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpNotMod.Delete', E.Message);
end;
end;
function TFigureGrpNotMod.Duplicate: TFigure;
var
i: integer;
TempFig: TFigure;
begin
try
Result := nil;
Result := TFigureGrpNotMod.Create(LayerHandle, Owner);
for i := 0 to InFigures.Count - 1 do
begin
TempFig := TFigure(InFigures[i]).Duplicate;
TempFig.Style := ord(psClear);
TFigureGrpNotMod(Result).AddFigure(TempFig);
Result.Style := ord(psClear);
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpNotMod.Duplicate', E.Message);
end;
end;
procedure TFigureGrpNotMod.GetBounds(var figMaxX, figMaxY, figMinX,
figMinY: Double);
begin
try
inherited GetBounds(figMaxX, figMaxY, figMinX, figMinY);
except
on E: Exception do addExceptionToLogEx('TFigureGrpNotMod.GetBounds', E.Message);
end;
end;
procedure TFigureGrpNotMod.select;
begin
inherited;
end;
procedure TFigureGrpNotMod.GetModPoints(ModList: TMyList);
begin
inherited;
end;
function TFigureGrpNotMod.IsPointIn(x, y: Double): Boolean;
begin
Result := false;
Result := inherited isPointIn(x, y);
end;
procedure TFigureGrpNotMod.Move(deltax, deltay: Double);
var
i: integer;
SCSObject: TFigure;
Line: TOrthoLine;
LNbr: Integer;
mp: TModPoint;
Button: TMouseButton;
begin
try
// Shadow
if GShadowObject = Self then
begin
inherited;
exit;
end;
if ssShift in GGlobalShiftState then
begin
inherited;
end
else
begin
if GCadForm.PCad.SelectedCount > 1 then
begin
inherited;
exit;
end;
// From SCS object
LNbr := GCadForm.PCad.ActiveLayer;
if (LNbr <> 5) and (LNbr <> 6) then
begin
inherited;
// Caption Line Move
if DrawStyle = mydsNormal then
begin
if LNbr = 3 then
begin
Line := Nil;
for i := 0 to GCadForm.PCad.FigureCount - 1 do
begin
if CheckFigureByClassName(TFigure(GCadForm.PCad.Figures[i]), cTOrthoLine) then
begin
if TOrthoLine(GCadForm.PCad.Figures[i]).CaptionsGroup <> nil then
// if TOrthoLine(GCadForm.PCad.Figures[i]).CaptionsGroup.ID = ID then
if TOrthoLine(GCadForm.PCad.Figures[i]).CaptionsGroup = Self then
begin
Line := TOrthoLine(GCadForm.PCad.Figures[i]);
break;
end;
end;
end;
if Line <> nil then
// Tolik -- 04/12/2015
// Line.CaptionsGroupH := Line.CalcHCaptionsGroup; -- òàê áûëî
// åñëè ïîëüçîâàòåëü ïåðåìåñòèë ïîäïèñü ëèíèè, òî âûñòàâèòü âûðàâíèâàíèå äëÿ ïîäïèñè ëèíèè â ÀÂÒÎ
Line.CaptionsGroupH := Line.CalcHCaptionsGroup;
Line.FCaptionsViewType := cv_Auto;
//
end;
end;
Exit;
end;
if DrawStyle = mydsNormal then
begin
if (deltax <> 0) or (deltay <> 0) then
begin
SCSObject := Nil;
for i := 0 to GCadForm.PCad.FigureCount - 1 do
begin
if CheckFigureByClassName(TFigure(GCadForm.PCad.Figures[i]), cTConnectorObject) then
begin
if TConnectorObject(GCadForm.PCad.Figures[i]).NotesGroup <> nil then
// if TConnectorObject(GCadForm.PCad.Figures[i]).NotesGroup.ID = ID then
if TConnectorObject(GCadForm.PCad.Figures[i]).NotesGroup = Self then
begin
SCSObject := TConnectorObject(GCadForm.PCad.Figures[i]);
break;
end;
end
else if CheckFigureByClassName(TFigure(GCadForm.PCad.Figures[i]), cTOrthoLine) then
begin
if TOrthoLine(GCadForm.PCad.Figures[i]).NotesGroup <> nil then
// if TOrthoLine(GCadForm.PCad.Figures[i]).NotesGroup.ID = ID then
if TOrthoLine(GCadForm.PCad.Figures[i]).NotesGroup = Self then
begin
SCSObject := TOrthoLine(GCadForm.PCad.Figures[i]);
break;
end;
end;
end;
if SCSObject <> nil then
begin
if CheckFigureByClassName(SCSObject, cTConnectorObject) then
ModifyConnNoteAfterMove(TConnectorObject(SCSObject), deltax, deltay)
else if CheckFigureByClassName(SCSObject, cTOrthoLine) then
ModifyLineNoteAfterMove(TOrthoLine(SCSObject), deltax, deltay);
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpNotMod.Move', E.Message);
end;
end;
procedure TFigureGrpNotMod.WriteToStream(Stream: TStream);
begin
if Self <> GShadowObject then
inherited;
end;
procedure TFigureGrpNotMod.SetPropertyFromStream(xCode: Byte;
data: Pointer; size: Integer);
begin
inherited;
fHasParent := false;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TFigureGrpMod.WriteToStream(Stream: TStream);
begin
inherited;
end;
procedure TFigureGrpMod.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
begin
inherited;
fHasParent := false;
end;
//procedure TOrthoLine.SetJConnector1(jc: TFigure);
procedure TOrthoLine.SetJConnector1(jc: TFigure; CanChangeActuals: Boolean = True);
begin
try
JoinConnector1 := jc;
// Tolik -- 14/04/2017 -- -- ïðîâåðêà íóæíà, âî èçáåæàíèå...áûëè ïðåöåíäåíòû....
if TConnectorObject(jc).JoinedOrtholinesList.IndexOf(Self) = -1 then
//
TConnectorObject(jc).JoinedOrtholinesList.Add(Self);
// Tolik -- 20/04/2017 --
if CanChangeActuals then
begin
Self.SetActual(1,TConnectorObject(jc).ActualPoints[1]);
Self.ActualZOrder[1] := TConnectorObject(jc).ActualZOrder[1];
end;
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetJConnector1', E.Message);
end;
end;
procedure TOrthoLine.SetJConnector2(jc: TFigure; CanChangeActuals: Boolean = True);
begin
try
JoinConnector2 := jc;
// Tolik -- 14/04/2017 -- ïðîâåðêà íóæíà, âî èçáåæàíèå...áûëè ïðåöåíäåíòû....
if TConnectorObject(jc).JoinedOrtholinesList.IndexOf(Self) = -1 then
//
TConnectorObject(jc).JoinedOrtholinesList.Add(Self);
// Tolik -- 20/04/2017 --
if CanChangeActuals then
begin
Self.SetActual(2, TConnectorObject(jc).ActualPoints[1]);
Self.ActualZOrder[2] := TConnectorObject(jc).ActualZOrder[1];
end;
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetJConnector2', E.Message);
end;
end;
procedure TConnectorObject.DrawRaiseUp(ADEngine: TPCDrawEngine; AObjectFromRaise: TConnectorObject);
var
CrossPoint1, CrossPoint2: TDoublePoint;
BasisPoints: TDoublePoint;
Points: TDoublePointArr;
PenStyle: TPenStyle;
RaiseLine: TOrthoLine;
isDrawRaise: Boolean;
RaizeKoeff: Double;
Brush: Tbrush; // Tolik 17/03/2021 --
//Tolik -- ÷òîáû íå ïîäú¸áûâàëà îòðèñîâêà ðàéçà
function getRaiseDrawPoint: TDoublePoint;
var p1, p2: TDoublePoint;
Conn1, Conn2: TConnectorObject;
begin
Result.x := 0;
Result.y := 0;
Result.z := 0;
Conn1 := TConnectorObject(RaiseLine.JoinConnector1);
Conn2 := TConnectorObject(RaiseLine.JoinConnector2);
if Conn1.JoinedConnectorsList.Count > 0 then
Conn1 := TConnectorObject(Conn1.JoinedConnectorsList[0]);
if Conn2.JoinedConnectorsList.Count > 0 then
Conn2 := TConnectorObject(Conn2.JoinedConnectorsList[0]);
p1 := GetBasisPointByObjFromRaise(Conn1);
p2 := GetBasisPointByObjFromRaise(Conn2);
//òî÷êà, êîòîðàÿ ïðàâåå
if CompareValue(p1.x, p2.x) = 1 then
Result := p1
else
Result := p2;
end;
//
begin
// Tolik 17/03/2021 --
Brush := ADEngine.Canvas.Brush; // Tolik 17/03/2021 --
ADEngine.Canvas.Brush.Style := bsSolid;
ADEngine.Canvas.Brush.Color := clBlack;
//
try
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_TrunkDown) or (FConnRaiseType = crt_TrunkUp) then
isDrawRaise := True
else
isDrawRaise := GCadForm.FShowRaise;
if isDrawRaise then
begin
RaizeKoeff := 1;
PenStyle := ADEngine.Canvas.Pen.Style;
ADEngine.Canvas.Pen.Style := psSolid;
RaiseLine := GetRaiseLine(Self);
if ((RaiseLine <> nil) and (not RaiseLine.Deleted)) then // Tolik 17/12/2020 --
begin
RaizeKoeff := RaiseLine.FDrawFigurePercent / 100;
if RaiseLine.Selected then
begin
ADEngine.Canvas.Pen.Color := clRed;
ADEngine.Canvas.Brush.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2*RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
end
else
if RaiseLine.isSnap then
begin
ADEngine.Canvas.Pen.Color := clRed;
ADEngine.Canvas.Brush.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2*RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
end
else
if RaiseLine.isTraceShow then
begin
ADEngine.Canvas.Pen.Color := clRed;
ADEngine.Canvas.Brush.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2*RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
end
else
if RaiseLine.InsideCabinet then
begin
ADEngine.Canvas.Pen.Color := $1f7ffa;
ADEngine.Canvas.Brush.Color := $1f7ffa;
//ADEngine.Canvas.Pen.Width := Round(2 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
end
else
begin
ADEngine.Canvas.Pen.Color := RaiseLine.FTraceColor;
ADEngine.Canvas.Brush.Color := RaiseLine.FTraceColor;
//ADEngine.Canvas.Pen.Width := Round(1*RaizeKoeff);
ADEngine.Canvas.Pen.Width := 1;
end;
end
else
begin
ADEngine.Canvas.Pen.Color := clBlack;
ADEngine.Canvas.Brush.Color := clBlack;
//ADEngine.Canvas.Pen.Width := Round(1*RaizeKoeff);
ADEngine.Canvas.Pen.Width := 1;
end;
//27.04.2013
//if AObjectFromRaise.DrawFigure = nil then
//begin
// BasisPoints.x := AObjectFromRaise.ActualPoints[1].x + AObjectFromRaise.GrpSizeX / 2;
// BasisPoints.y := AObjectFromRaise.ActualPoints[1].y - AObjectFromRaise.GrpSizeY / 2;
//end
//else
//begin
// if AObjectFromRaise.DrawFigure.InFigures.Count = 0 then
// begin
// BasisPoints.x := AObjectFromRaise.ActualPoints[1].x + AObjectFromRaise.GrpSizeX / 2;
// BasisPoints.y := AObjectFromRaise.ActualPoints[1].y - AObjectFromRaise.GrpSizeY / 2;
// end
// else
// begin
// BasisPoints.x := AObjectFromRaise.DrawFigure.CenterPoint.x + AObjectFromRaise.GrpSizeX / 2 - 0.5;
// BasisPoints.y := AObjectFromRaise.DrawFigure.CenterPoint.y - AObjectFromRaise.GrpSizeY / 2 + 0.5;
// end;
//end;
// Tolik 10/04/2018 --
//BasisPoints := GetBasisPointByObjFromRaise(AObjectFromRaise);//27.04.2013
BasisPoints := getRaiseDrawPoint;
//
// Ëèíèÿ ñ-ï (ðèñóåòñÿ òàêæå ïîä ñòðåëêîé)
CrossPoint1.x := BasisPoints.x;
CrossPoint1.y := BasisPoints.y;
//CrossPoint2.x := BasisPoints.x + Round(4*RaizeKoeff);
//CrossPoint2.y := BasisPoints.y - Round(4*RaizeKoeff);
CrossPoint2.x := BasisPoints.x + Round4(4 * RaizeKoeff);
CrossPoint2.y := BasisPoints.y - Round4(4 * RaizeKoeff);
ADEngine.drawline(CrossPoint1, CrossPoint2);
// ñòðåëêà ñ-ï
SetLength(Points, 4);
// îáû÷íûé
if FConnRaiseType = crt_OnFloor then
begin
ADEngine.Canvas.Pen.Color := clBlack;
ADEngine.Canvas.Brush.Color := clBlack;
end
// ìåæýòàæíûé
else
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_BetweenFloorUp) then
begin
ADEngine.Canvas.Pen.Color := clBlue;
ADEngine.Canvas.Brush.Color := clBlue;
end
// ìàãèñòðàëü
else
if (FConnRaiseType = crt_TrunkDown) or (FConnRaiseType = crt_TrunkUp) then
begin
ADEngine.Canvas.Pen.Color := clGreen;
ADEngine.Canvas.Brush.Color := clGreen;
end;
//Points[0] := DoublePoint(BasisPoints.x + Round(2*RaizeKoeff), BasisPoints.y - Round(3*RaizeKoeff));
//Points[1] := DoublePoint(BasisPoints.x + Round(4*RaizeKoeff), BasisPoints.y - Round(4*RaizeKoeff));
//Points[2] := DoublePoint(BasisPoints.x + Round(3*RaizeKoeff), BasisPoints.y - Round(2*RaizeKoeff));
//Points[3] := DoublePoint(BasisPoints.x + Round(2*RaizeKoeff), BasisPoints.y - Round(3*RaizeKoeff));
Points[0] := DoublePoint(BasisPoints.x + Round4(2 * RaizeKoeff), BasisPoints.y - Round4(3 * RaizeKoeff));
Points[1] := DoublePoint(BasisPoints.x + Round4(4 * RaizeKoeff), BasisPoints.y - Round4(4 * RaizeKoeff));
Points[2] := DoublePoint(BasisPoints.x + Round4(3 * RaizeKoeff), BasisPoints.y - Round4(2 * RaizeKoeff));
Points[3] := DoublePoint(BasisPoints.x + Round4(2 * RaizeKoeff), BasisPoints.y - Round4(3 * RaizeKoeff));
ADEngine.drawpolyline(Points, True);
ADEngine.Canvas.Pen.Style := PenStyle;
end;
//Tolik
SetLength(Points,0);
//
except
on E: Exception do addExceptionToLogEx('TConnectorObject.DrawRaiseUp', E.Message);
end;
ADEngine.Canvas.Brush := Brush; // Tolik 17/03/2021 --
end;
procedure TConnectorObject.DrawRaiseDown(ADEngine: TPCDrawEngine; AObjectFromRaise: TConnectorObject);
var
CrossPoint1, CrossPoint2: TDoublePoint;
BasisPoints: TDoublePoint;
Points: TDoublePointArr;
PenStyle: TPenStyle;
RaiseLine: TOrthoLine;
isDrawRaise: Boolean;
RaizeKoeff: Double;
Brs: TBrush; // Tolik 17/03/2021 --
begin
Brs := ADEngine.Canvas.Brush; // Tolik 17/03/2021 --
try
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_BetweenFloorUp) or (FConnRaiseType = crt_TrunkDown) or (FConnRaiseType = crt_TrunkUp) then
isDrawRaise := True
else
isDrawRaise := GCadForm.FShowRaise;
if isDrawRaise then
begin
RaizeKoeff := 1;
PenStyle := ADEngine.Canvas.Pen.Style;
// Tolik 17/03/2021 --
ADEngine.Canvas.Brush.Style := bsSolid;
ADEngine.Canvas.Brush.Color := clBlack;
//
ADEngine.Canvas.Pen.Style := psSolid;
RaiseLine := GetRaiseLine(Self);
//if RaiseLine <> nil then
if ((RaiseLine <> nil) and (not RaiseLine.Deleted)) then
begin
RaizeKoeff := RaiseLine.FDrawFigurePercent / 100;
if RaiseLine.Selected then
begin
ADEngine.Canvas.Pen.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
ADEngine.Canvas.Brush.Color := clRed;
end
else
if RaiseLine.isSnap then
begin
ADEngine.Canvas.Pen.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
ADEngine.Canvas.Brush.Color := clRed;
end
else
if RaiseLine.isTraceShow then
begin
ADEngine.Canvas.Pen.Color := clRed;
//ADEngine.Canvas.Pen.Width := Round(2 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
ADEngine.Canvas.Brush.Color := clRed;
end
else
if RaiseLine.InsideCabinet then
begin
ADEngine.Canvas.Pen.Color := $1f7ffa;
//ADEngine.Canvas.Pen.Width := Round(2 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
ADEngine.Canvas.Brush.Color := $1f7ffa;
end
else
begin
ADEngine.Canvas.Pen.Color := RaiseLine.FTraceColor;
//ADEngine.Canvas.Pen.Width := Round(1 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 1;
ADEngine.Canvas.Brush.Color := RaiseLine.FTraceColor;
end;
end
else
begin
ADEngine.Canvas.Pen.Color := clBlack;
//ADEngine.Canvas.Pen.Width := Round(1 * RaizeKoeff);
ADEngine.Canvas.Pen.Width := 2;
ADEngine.Canvas.Brush.Color := clBlack;
end;
//27.04.2013
//if AObjectFromRaise.DrawFigure = nil then
//begin
// BasisPoints.x := AObjectFromRaise.ActualPoints[1].x + AObjectFromRaise.GrpSizeX / 2;
// BasisPoints.y := AObjectFromRaise.ActualPoints[1].y - AObjectFromRaise.GrpSizeY / 2;
//end
//else
//begin
// if AObjectFromRaise.DrawFigure.InFigures.Count = 0 then
// begin
// BasisPoints.x := AObjectFromRaise.ActualPoints[1].x + AObjectFromRaise.GrpSizeX / 2;
// BasisPoints.y := AObjectFromRaise.ActualPoints[1].y - AObjectFromRaise.GrpSizeY / 2;
// end
// else
// begin
// BasisPoints.x := AObjectFromRaise.DrawFigure.CenterPoint.x + AObjectFromRaise.GrpSizeX / 2 - 0.5;
// BasisPoints.y := AObjectFromRaise.DrawFigure.CenterPoint.y - AObjectFromRaise.GrpSizeY / 2 + 0.5;
// end;
//end;
BasisPoints := GetBasisPointByObjFromRaise(AObjectFromRaise);//27.04.2013
// Ëèíèÿ ñ-ï (ðèñóåòñÿ òàêæå ïîä ñòðåëêîé)
CrossPoint1.x := BasisPoints.x;
CrossPoint1.y := BasisPoints.y;
CrossPoint2.x := BasisPoints.x + Round4(4 * RaizeKoeff);
CrossPoint2.y := BasisPoints.y - Round4(4 * RaizeKoeff);
ADEngine.drawline(CrossPoint1, CrossPoint2);
// ñòðåëêà ñ-ï
SetLength(Points, 4);
// îáû÷íûé
if FConnRaiseType = crt_OnFloor then
begin
ADEngine.Canvas.Pen.Color := clBlack;
ADEngine.Canvas.Brush.Color := clBlack;
end
// ìåæýòàæíûé
else
if (FConnRaiseType = crt_BetweenFloorDown) or (FConnRaiseType = crt_BetweenFloorUp) then
begin
ADEngine.Canvas.Pen.Color := clBlue;
ADEngine.Canvas.Brush.Color := clBlue;
end
// ìàãèñòðàëü
else
if (FConnRaiseType = crt_TrunkDown) or (FConnRaiseType = crt_TrunkUp) then
begin
ADEngine.Canvas.Pen.Color := clGreen;
ADEngine.Canvas.Brush.Color := clGreen;
end;
Points[0] := DoublePoint(BasisPoints.x + Round4(1 * RaizeKoeff), BasisPoints.y - Round4(2 * RaizeKoeff));
Points[1] := DoublePoint(BasisPoints.x, BasisPoints.y);
Points[2] := DoublePoint(BasisPoints.x + Round4(2 * RaizeKoeff), BasisPoints.y - Round4(1 * RaizeKoeff));
Points[3] := DoublePoint(BasisPoints.x + Round4(1 * RaizeKoeff), BasisPoints.y - Round4(2 * RaizeKoeff));
ADEngine.drawpolyline(Points, True);
ADEngine.Canvas.Pen.Style := PenStyle;
end;
//Tolik
SetLength(Points, 0);
//
except
on E: Exception do addExceptionToLogEx('TConnectorObject.DrawRaiseDown', E.Message);
end;
ADEngine.Canvas.Brush := brs; // Tolik 17/03/2021 --
end;
procedure TOrthoLine.DrawTraceStyle(ADEngine: TPCDrawEngine);
begin
try
if GCadForm.FKeepLineTypesRules then
begin
// ADEngine.Canvas.Pen.Color := clBlack;
if FLineType = ts_UnderFalseFloor then
begin
ADEngine.Canvas.Pen.Style := psDash;
ADEngine.Canvas.Pen.Width := 1;
end;
if FLineType = ts_ClearTrace then
begin
ADEngine.canvas.Pen.Style := psDashDot; //psSolid{FTraceStyle};
//ADEngine.canvas.Pen.Color := clGray;
ADEngine.Canvas.Pen.Width := 1{FTraceWidth};
end;
if FLineType = ts_Until10 then
begin
ADEngine.canvas.Pen.Style := psSolid;
ADEngine.Canvas.Pen.Width := 1;
end;
if FLineType = ts_Until10InCorob then
begin
ADEngine.canvas.Pen.Style := psSolid;
// Âíåøíèå ÑÊÑ
if GCadForm.FShowLineCaptionsType = skExternalSCS then
ADEngine.Canvas.Pen.Width := 1
else
ADEngine.Canvas.Pen.Width := 2;
end;
if FLineType = ts_Over10 then
begin
ADEngine.canvas.Pen.Style := psSolid;
// Âíåøíèå ÑÊÑ
if GCadForm.FShowLineCaptionsType = skExternalSCS then
ADEngine.Canvas.Pen.Width := 1
else
ADEngine.Canvas.Pen.Width := 3;
end;
if FIsRaiseUpDown then
begin
ADEngine.canvas.Pen.Style := psClear;
ADEngine.Canvas.Pen.Width := 1;
end;
if GCadForm.FShowLineCaptionsType = skExternalSCS then
begin
if FObjectType = 1 then
begin
if GCadForm.FPrintType = pt_Black then
begin
ADEngine.Canvas.Pen.Style := psDash;
ADEngine.Canvas.Pen.Color := clBlack;
ADEngine.Canvas.Pen.Width := 2;
end;
if GCadForm.FPrintType = pt_Color then
begin
ADEngine.Canvas.Pen.Style := psDash;
ADEngine.Canvas.Pen.Color := clRed;
ADEngine.Canvas.Pen.Width := 1;
end;
end;
end;
end
else
begin
// ADEngine.Canvas.Pen.Color := FTraceColor;
ADEngine.Canvas.Pen.Style := FTraceStyle;
ADEngine.Canvas.Pen.Width := FTraceWidth;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.DrawTraceStyle', E.Message);
end;
end;
procedure TFigureGrpNotMod.draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
var
adim2: double;
aZoomScale: integer;
begin
try
if Visible then
inherited;
if GIsDrawShadow then
begin
if Self = GShadowObject then
begin
adim2 := dim2;
aZoomScale := 0;
if (GCadForm.PCad <> nil) then
aZoomScale := GCadForm.PCad.ZoomScale;
if (aZoomScale > 100) then
adim2 := adim2 / (aZoomScale / 100);
//Tolik 23/09/2021 --
{DEngine.DrawRect(ShadowCP.x - adim2, ShadowCP.y - adim2, ShadowCP.x + adim2, ShadowCP.y + adim2,
clGray, 2, ord(psSolid), clGray, ord(bsClear));}
DEngine.DrawRect(ShadowCP.x - adim2, ShadowCP.y - adim2, ShadowCP.x + adim2, ShadowCP.y + adim2,
$00E8731A, 2, ord(psSolid), $00E8731A, ord(bsClear));
//
GCadForm.PCad.Repaint;
//Çà÷åì òóò Update åñëè îí âûïîëíÿåòñÿ â Repaint - Ìèòÿé Ä.Â
// GCadForm.PCad.Update;
end;
end;
except
on E: Exception do addExceptionToLogEx('TFigureGrpNotMod.draw', E.Message);
end;
end;
procedure TFigureGrpMod.draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
var
IsDraw: Boolean;
begin
//31.10.2011 try
if Visible then
begin
inherited;
end;
//31.10.2011 except
//31.10.2011 on E: Exception do addExceptionToLogEx('TFigureGrpMod.draw', E.Message);
//31.10.2011 end;
end;
procedure TOrthoLine.SetDrawFigure(const Value: TFigureGrpMod);
var
deltax, deltay: Double;
BlockBnd: TDoubleRect;
DrawFigureBnd: TDoubleRect;
cp: TDoublePoint;
BlockDelta: double;
DrawFigureKoeff: Double;
RaiseConn: TConnectorObject;
BasisPoint, CrossPoint1, CrossPoint2: TDoublePoint;
begin
//Tolik
if Value <> nil then
begin
//
try
if ((FSingleBlock <> nil) and (DrawFigure <> nil)) then // íà âñÿêèé
begin
DrawFigure.RemoveFromGrp(FSingleBlock); //28.04.2011 DrawFigure.InFigures.Remove(FSingleBlock);
end;
if FSingleBlock <> nil then
begin
if FSingleBlock.ID <> Value.ID then
begin
RemoveInFigureGrp(FSingleBlock);
// Tolik òåîðåòè÷åñêè äîëæíî ðàáîòàòü, íî â ñëó÷àå òðàáëîâ, ëó÷øå þçàòü DELETE
if FSingleBlock.Owner <> nil then // 09/11/2015
if TPowerCad(FSingleBlock.Owner).Figures.IndexOF(FSingleBlock) <> -1 then
TPowerCad(FSingleBlock.Owner).Figures.Remove(FSingleBlock);
FreeAndNil(FSingleBlock);
// FSingleBlock.Delete;
end;
// FsingleBlock íà ÊÀÄå óæå êàê îòäåëüíîé ôèãóðû íåò
// GCadForm.PCad.Figures.Remove(FSingleBlock);
end;
if DrawFigure <> nil then
begin
//Tolik
//RemoveInFigureGrp(DrawFigure);
//GCadForm.PCad.Figures.Remove(DrawFigure);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Âûøå ñäåëàí ðåìóâ FSingleBlock èç FdrawFigure, èíà÷å RemoveInFigureGrp(DrawFigure) ñäåëàåò
// FreeAndNil äëÿ FSingleBlock è ïîòîì, óæå íà âîçíèêíîâåíèè ñîáûòèÿ óäàëåíèÿ FSingleBlock îí óæå ïîëó÷èòñÿ
// íåïîíÿòíî ÷òî, òàê êàê ïàìÿòü - óæå éîê...(ìîæåò áûòü çàíÿòà êåì-íèáóäü äðóãèì, à ññûëêà ó íàñ åñòü è ïîëó÷èì õåðíþ)
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
GCadForm.PCad.Figures.Remove(DrawFigure);
if FDrawFigure.ID <> Value.ID then
begin
RemoveInFigureGrp(DrawFigure);
// òåîðåòè÷åñêè äîëæíî ðàáîòàòü, íî â ñëó÷àå òðàáëîâ, ëó÷øå þçàòü DELETE
FreeAndNil(FDrawFigure);
// FDrawFigure.Delete;
end;
//
end;
// Ñîçäàòü íîâûé äóáëèêàò
//Tolik
//FSingleBlock := TFigureGrpMod.create(LayerHandle, Owner);
//
FSingleBlock := TFigureGrpMod(Value);
////FSingleBlock := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), FSingleBlock, False));
FDrawFigure := GetAllBlocks(FSingleBlock);
if FSingleBlock.InFigures.Count = 0 then
begin
BlockBnd := FSingleBlock.GetBoundRect;
end
else
begin
BlockBnd := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
end;
DrawFigureBnd := DrawFigure.GetBoundRect;
GrpSizeX := DrawFigureBnd.Right - DrawFigureBnd.Left;
GrpSizeY := BlockBnd.Bottom - BlockBnd.Top;
FOriginalSizeX := {GrpSizeX}BlockBnd.Right - BlockBnd.Left;
FOriginalSizeY := GrpSizeY;
BlockDelta := 0.2 / 2 * (FSingleBlock.InFigures.Count - 1);
//27.04.2013 Äëÿ ñ-ï óìåíüøàåì ÓÃÎ â äâà ðàçà
if FIsRaiseUpDown then
begin
DrawFigureKoeff := FDrawFigurePercent/100;
FDrawFigure.Scale(0.5 * DrawFigureKoeff, 0.5 * DrawFigureKoeff, FDrawFigure.CenterPoint);
//deltax := deltax - 4;
//deltay := deltay - 4;
//DrawFigure.move(4*DrawFigureKoeff, -4.5*DrawFigureKoeff);
//4, ïîòîìó ÷òî ñòðåëêà ñ-ï ðèñóåòñÿ ñî ñäâèãîì íà 4, âî âòîðîì ïàòàìåòðå äîáàâëÿåì ïîëîâèíó âûñîòû ÓÃÎ, ÷òîáû áûëî ïî öåíòðó
//DrawFigure.move(4*DrawFigureKoeff, -1*(4.25*DrawFigureKoeff + (Abs(GrpSizeY)/2) ));
//RaiseConn := GetRaiseByRaiseLine(Self);
//if RaiseConn <> nil then
// RaiseConn := GetRaiseConn(RaiseConn);
//DrawFigure.move(4*DrawFigureKoeff, -1*(4*DrawFigureKoeff ));
if FObjectFromRaisedLine <> nil then
begin
BasisPoint := GetBasisPointByObjFromRaise(FObjectFromRaisedLine);
//if FObjectFromRaisedLine.DrawFigure.InFigures.Count > 0 then
begin
BasisPoint.x := BasisPoint.x - 1;
BasisPoint.y := BasisPoint.y + 1;
end;
end
else
begin
BasisPoint.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
BasisPoint.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
end;
CrossPoint1.x := BasisPoint.x;
CrossPoint1.y := BasisPoint.y;
CrossPoint2.x := BasisPoint.x + Round(4*DrawFigureKoeff);
CrossPoint2.y := BasisPoint.y - Round(4*DrawFigureKoeff);
DrawFigure.ActualPoints[1] := DoublePoint((DrawFigureBnd.Left + DrawFigureBnd.Right) / 2,
(BlockBnd.Top + BlockBnd.Bottom) / 2);
deltax := BasisPoint.x - DrawFigure.ActualPoints[1].x;
deltay := BasisPoint.y - DrawFigure.ActualPoints[1].y;
deltax := deltax + 2.7*DrawFigureKoeff;
deltay := deltay - 2.7*DrawFigureKoeff;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False));
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
MoveTextBox(DrawFigure, CrossPoint1, CrossPoint2, True);
end
else
begin
cp.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
cp.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
DrawFigure.ActualPoints[1] := DoublePoint((DrawFigureBnd.Left + DrawFigureBnd.Right) / 2 - GrpSizeX / 2,
(BlockBnd.Top + BlockBnd.Bottom) / 2 - GrpSizeY / 2);
deltax := cp.x - GrpSizeX / 2 - DrawFigure.ActualPoints[1].x;
deltay := cp.y - GrpSizeY / 2 - DrawFigure.ActualPoints[1].y;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False));
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
MoveTextBox(DrawFigure, ActualPoints[1], ActualPoints[2], True);
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetDrawFigure', E.Message);
end;
end;
end;
procedure TOrthoLine.SetOrthoLineType(const Value: TOrthoLineType);
var
i: integer;
deltax, deltay: Double;
Bnd: TDoubleRect;
cp: TDoublePoint;
begin
try
GTestSingleBlock := FSingleBlock;
if FSingleBlock <> nil then
begin
RemoveInFigureGrp(FSingleBlock);
GCadForm.PCad.Figures.Remove(FSingleBlock);
// FreeAndNil(FSingleBlock);
end;
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
// FreeAndNil(FDrawFigure);
end;
FOrthoLineType := Value;
// Ñîçäàòü íîâûé äóáëèêàò
FDrawFigure := TFigureGrpMod.create(LayerHandle, Owner);
FSingleBlock := GetOrthoLineImg(FOrthoLineType);
//FSingleBlock := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), FSingleBlock, False));
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), FSingleBlock, False);
FDrawFigure := GetAllBlocks(FSingleBlock);
// Tolik -- 23/11/2015
// óáèðàåì ñ ÊÀÄà
GCadForm.PCad.Figures.Remove(FSingleBlock);
//
if DrawFigure <> nil then
Bnd := DrawFigure.GetBoundRect;
GrpSizeX := Bnd.Right - Bnd.Left;
GrpSizeY := Bnd.Bottom - Bnd.Top;
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
if (GCadForm.PCad <> nil) AND (DrawStyle <> dsTrace) then
begin
cp.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
cp.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
Bnd := DrawFigure.GetBoundRect;
GrpSizeX := Bnd.Right - Bnd.Left;
GrpSizeY := Bnd.Bottom - Bnd.Top;
FOriginalSizeX := GrpSizeX;
FOriginalSizeY := GrpSizeY;
DrawFigure.ActualPoints[1] := DoublePoint((Bnd.Left + Bnd.Right) / 2 - GrpSizeX / 2,
(Bnd.Top + Bnd.Bottom) / 2 - GrpSizeY / 2);
deltax := cp.x - GrpSizeX / 2 - DrawFigure.ActualPoints[1].x;
deltay := cp.y - GrpSizeY / 2 - DrawFigure.ActualPoints[1].y;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False));
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
MoveTextBox(DrawFigure, ActualPoints[1], ActualPoints[2], True);
end
else
begin
if FSingleBlock <> nil then
begin
RemoveInFigureGrp(FSingleBlock);
GCadForm.PCad.Figures.Remove(FSingleBlock);
end;
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.SetOrthoLineType', E.Message);
end;
end;
function TOrthoLine.GetAllBlocks(ADuplicateBlock: TFigureGrpMod): TFigureGrpMod;
var
i: integer;
tmpFigureGrp: TFigureGrpMod;
Step: Double;
NewStep: Double;
Bnd: TDoubleRect;
LLength: Double;
BlkLength: Double;
BlkCount: Integer;
//Tolik
j: Integer;
// Tolik 06/09/2017 --
// íå äîáàâëÿòü áëîêè íà îáîçíà÷åíèÿ ïåðåñå÷åíèÿ òðàññ
(* function CheckCanAddBlock(aBlock: TfigureGrpMod): Boolean;
var MaxX, MaxY, MinX, MinY: Double;
PointInfo: POrthoLineCrossInfo;
i: Integer;
FirstLinePoint: TDoublePoint;
dist1, dist2, dist3: Double;
begin
Result := True;
if Self.CrossList.Count = 0 then
exit;
{dist1 := Sqrt(sqr(Self.JoinConnector1.AP1.x) + sqr(Self.JoinConnector1.AP1.y));
dist2 := Sqrt(sqr(Self.JoinConnector2.AP1.x) + sqr(Self.JoinConnector2.AP1.y));
//íà÷àëüíàÿ òî÷êà îðòîëèíèè
if CompareValue(dist1, dist2) = -1 then
FirstLinePoint := Self.AP1
else
FirstLinePoint := Self.AP2;
}
if CompareValue(Ap1.x, Ap2.x) = -1 then
FirstLinePoint := Ap1
else
FirstLinePoint := Ap2;
aBlock.GetBounds(MaxX, MaxY, MinX, MinY);
for i := 0 to CrossList.Count - 1 do
begin
PointInfo := POrthoLineCrossInfo(CrossList[i]);
// if PointNear(DoublePoint(MaxX, MaxY), PointInfo.StartPoint, 5) then
dist1 := Sqrt(Sqr(Minx - FirstLinePoint.x) + Sqr(MinY - FirstLinePoint.y));
dist2 := Sqrt(Sqr(MaxX - FirstLinePoint.x) + Sqr(MaxY - FirstLinePoint.y));
dist3 := Sqrt(Sqr(PointInfo.StartPoint.x - FirstLinePoint.x) + Sqr(PointInfo.StartPoint.y - FirstLinePoint.y));
// dist1 := Sqrt(Sqr((Minx + MaxX)/2 - FirstLinePoint.x) + Sqr((MinY + MaxY)/2 - FirstLinePoint.y));
if CompareValue(ABS(dist1 - dist3{PointInfo.disttoFirstPoint}), 10) = -1 then
begin
Result := False;
break;
end
else
//if PointNear(DoublePoint(MinX, MinY), PointInfo.StartPoint, 5) then
if CompareValue(ABS(Dist2 - Dist3{PointInfo.disttoFirstPoint}), 10) = -1 then
begin
Result := False;
break;
end;
end;
end;
*)
begin
try
//Tolik
////ADuplicateBlock.Visible := True;
//
Result := nil;
Result := TFigureGrpMod.create(LayerHandle, GCadForm.PCad);
Bnd := FSingleBlock.GetBoundRect;
BlkLength := Bnd.Right - Bnd.Left;
if Not FIsRaiseUpDown then //22.04.2013
begin
// calc block and length sizes
LLength := SQRT(SQR(ActualPoints[1].x - ActualPoints[2].x) + SQR(ActualPoints[1].y - ActualPoints[2].y));
Step := BlockStep;
try
BlkCount := round((LLength - Step) / (BlkLength + Step));
except
BlkCount := 0;
end;
if BlkCount > 0 then
begin
// calc block count
ADuplicateBlock.Visible := True;
Result.AddFigure(ADuplicateBlock);
//Tolik
NewStep := (LLength - BlkLength * BlkCount) / (BlkCount + 1);
//
for i := 1 to BlkCount - 1 do
begin
tmpFigureGrp := TFigureGrpMod(ADuplicateBlock.Duplicate);
//Tolik
tmpFigureGrp.move((NewStep + BlkLength) * i, 0);
//tmpFigureGrp.move((Step + BlkLength) * i, 0);
//
tmpFigureGrp.Visible := True;
// Tolik 06/09/20107 --
Result.AddFigure(tmpFigureGrp);
{ if CheckCanAddBlock(tmpFigureGrp) then
Result.AddFigure(tmpFigureGrp)
else
tmpFigureGrp.Free;}
end;
end
else
begin
ADuplicateBlock.Visible := False;
Result.AddFigure(ADuplicateBlock);
end;
end
else
begin
{tmpFigureGrp := TFigureGrpMod(ADuplicateBlock.Duplicate);
//tmpFigureGrp.move((NewStep + BlkLength) * i, 0);
tmpFigureGrp.move(BlkLength, 0);
tmpFigureGrp.Visible := True;
Result.AddFigure(tmpFigureGrp);}
ADuplicateBlock.Visible := True;
Result.AddFigure(ADuplicateBlock);
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetAllBlocks', E.Message);
end;
{if Result <> nil then
if CrossList.Count > 0 then
CheckDrawFigure(Result);}
////ADuplicateBlock.Visible := False;
end;
Procedure TOrthoLine.CheckDrawFigure(aFigure: TFigureGrpMod);
var MaxX, MaxY, MinX, MinY: Double;
PointInfo: POrthoLineCrossInfo;
j, i: Integer;
FirstLinePoint: TDoublePoint;
dist1, dist2, dist3: Double;
aBlock: TFigureGrpMod;
CanRemoveBlock: Boolean;
begin
try
if Self.CrossList.Count = 0 then
exit;
dist1 := Sqrt(sqr(Self.JoinConnector1.AP1.x) + sqr(Self.JoinConnector1.AP1.y));
dist2 := Sqrt(sqr(Self.JoinConnector2.AP1.x) + sqr(Self.JoinConnector2.AP1.y));
//ñáðîñèòü íåâèäèìûå áëîêè äëÿ ïåðåðàñ÷åòà
for j := 0 to aFigure.InFigures.Count - 1 do
begin
aBlock := TFigureGrpMod(aFigure.InFigures[j]);
aBlock.Visible := True;
end;
//íà÷àëüíàÿ òî÷êà îðòîëèíèè
FirstLinePoint := AP1;
if CompareValue(dist2, dist1) = -1 then
FirstLinePoint := Self.AP2;
CanRemoveBlock := True;
While CanRemoveBlock do
begin
CanRemoveBlock := False;
for j := 0 to aFigure.InFigures.Count - 1 do
begin
aBlock := TFigureGrpMod(aFigure.InFigures[j]);
if aBlock.Visible then
begin
{ if CompareValue(dist1, dist2) = -1 then
FirstLinePoint := Self.AP1
else
FirstLinePoint := Self.AP2;}
{if CompareValue(Ap1.x, Ap2.x) = -1 then
FirstLinePoint := Ap1
else
FirstLinePoint := Ap2; }
aBlock.GetBounds(MaxX, MaxY, MinX, MinY);
for i := 0 to CrossList.Count - 1 do
begin
PointInfo := POrthoLineCrossInfo(CrossList[i]);
dist1 := Sqrt(Sqr((Minx + MaxX)/2 - FirstLinePoint.x) + Sqr((MinY + MaxY)/2 - FirstLinePoint.y)); // îò öåíòðà áëîêà
dist2 := Sqrt(Sqr(MaxX - MinX) + Sqr(MaxY - MinY))/2; // ïîë áëîêà
dist3 := Sqrt(Sqr(PointInfo.StartPoint.x - FirstLinePoint.x) + Sqr(PointInfo.StartPoint.y - FirstLinePoint.y));
if CompareValue(ABS(dist1 - dist3), Dist2 + 1) < 1 then
begin
CanRemoveBlock := True;
break;
end;
end;
if CanRemoveBlock then
begin
aBlock.Visible := False;
break;
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CheckDrawFigure', E.Message);
end;
end;
//
procedure TOrthoLine.ReCreateDrawFigureBlock;
var
i: integer;
deltax, deltay: Double;
Bnd: TDoubleRect;
cp, Fcp: TDoublePoint;
DrawFigureBnd: TDoubleRect;
BlockBnd: TDoubleRect;
BlockDelta: double;
InFigure: TFigureGrpMod;
//Tolik
DeltaXX, DeltaYY: Double;
P1, P2: TDoublePoint;
begin
try
if Self.deleted then
exit;
GTestSingleBlock := FSingleBlock;
// Tolik
// if FSingleBlock <> nil then
if ((FSingleBlock <> nil) and (DrawFigure <> nil)) then // íà âñÿêèé
begin
DrawFigure.RemoveFromGrp(FSingleBlock); //28.04.2011 DrawFigure.InFigures.Remove(FSingleBlock);
end;
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
//Tolik 09/11/2015
// GCadForm.PCad.Figures.Remove(DrawFigure);
TPowerCad(DrawFigure.Owner).Figures.Remove(DrawFigure);
//
end;
if FSingleBlock <> nil then
begin
FSingleBlock.Visible := True;
FSingleBlock.Rotate(0 - FDrawFigureAngle, FSingleBlock.CenterPoint);
if ((FDrawFigure <> nil) and (FDrawFigure.ID <> FSingleBlock.ID) ) then
FreeAndNil(FDrawFigure);
// FDrawfigure.Delete;
FSingleBlock.Visible := False;
end
else
if (FDrawFigure <> nil) then
FreeAndNil(FDrawFigure);
// FDrawfigure.Delete;
// Ñîçäàòü íîâûé äóáëèêàò
// FDrawFigure := TFigureGrpMod.create(LayerHandle, Owner);
//
FDrawFigure := GetAllBlocks(FSingleBlock);
if (GCadForm.PCad <> nil) AND (DrawStyle <> dsTrace) then
begin
cp.x := (ActualPoints[1].x + ActualPoints[2].x) / 2;
cp.y := (ActualPoints[1].y + ActualPoints[2].y) / 2;
// Çàäàòü òî÷êè äëÿ îòðèñîâêè ïðÿìîóãîëüíèêà, âåðõíþþ ëåâóþ è íèæíþþ ïðàâóþ
if FSingleBlock.InFigures.Count = 0 then
begin
BlockBnd := FSingleBlock.GetBoundRect;
end
else
begin
BlockBnd := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
end;
DrawFigureBnd := DrawFigure.GetBoundRect;
GrpSizeX := DrawFigureBnd.Right - DrawFigureBnd.Left;
GrpSizeY := BlockBnd.Bottom - BlockBnd.Top;
BlockDelta := 0.2 / 2 * (FSingleBlock.InFigures.Count - 1);
DrawFigure.ActualPoints[1] := DoublePoint((DrawFigureBnd.Left + DrawFigureBnd.Right) / 2 - GrpSizeX / 2,
(BlockBnd.Top + BlockBnd.Bottom) / 2 - GrpSizeY / 2);
deltax := cp.x - GrpSizeX / 2 - DrawFigure.ActualPoints[1].x;
deltay := cp.y - GrpSizeY / 2 - DrawFigure.ActualPoints[1].y;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False));
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False);
DrawFigure.move(deltax, deltay);
DrawFigure.LockModify := True;
MoveTextBox(DrawFigure, ActualPoints[1], ActualPoints[2], True); // ïîâîðà÷èâàåò ôèãóðó îòðèñîâêè
// Tolik 09/11/2017 --
if CrossList.Count > 0 then
CheckDrawFigure(DrawFigure);
//
end
else
begin
if FSingleBlock <> nil then
begin
DrawFigure.RemoveFromGrp(FSingleBlock); //28.04.2011 DrawFigure.InFigures.Remove(FSingleBlock);
end;
if DrawFigure <> nil then
begin
RemoveInFigureGrp(DrawFigure);
GCadForm.PCad.Figures.Remove(DrawFigure);
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.ReCreateDrawFigureBlock', E.Message);
end;
end;
function TOrthoLine.CreateNotesRowGroup(ANotesRowsType: TNotesRowsType; aDeltaLineX: Double = -1; aDeltaLineY: Double = -1): TFigureGrpNotMod;
var
Row1: TLine;
Row2: TLine;
Row3: TLine;
BasisPoint: TDoublePoint;
Point1, Point2: TDoublePoint;
BasePoint: TDoublePoint;
GetPoints1: TDoublePoint;
GetPoints2: TDoublePoint;
Koef: Double;
AngleDeg: Double;
NotesLHandle: integer;
DeltaLineX: Double;
DeltaLineY: Double;
ObjectFromRaise: TConnectorObject;
PointObject: TConnectorObject;
begin
try
Result := nil;
if Self.deleted then
exit;
NotesLHandle := GCadForm.PCad.GetLayerHandle(5);
// calc base points
if ActualPoints[1].x > ActualPoints[2].x then
Koef := 0.7
else
Koef := 0.3;
if FIsRaiseUpDown then
begin
ObjectFromRaise := nil;
// 1
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector1).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector1).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
// 2
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
begin
if TConnectorObject(JoinConnector2).FConnRaiseType <> crt_None then
ObjectFromRaise := TConnectorObject(JoinConnector2).FObjectFromRaise;
end
else
begin
PointObject := TConnectorObject(TConnectorObject(JoinConnector2).JoinedConnectorsList[0]);
if PointObject.FConnRaiseType <> crt_None then
ObjectFromRaise := PointObject.FObjectFromRaise;
end;
if ObjectFromRaise = nil then
ObjectFromRaise := FObjectFromRaisedLine;
// Tolik -- 09/11/2016-- Äëÿ áèòîé ôèãóðû !!! -- íå óäàëÿòü ýòîò êóñîê !!!
if not CheckFigureByClassName(ObjectFromRaise, cTConnectorObject) then
begin
Self.Deleted := True;
exit;
end;
if ObjectFromRaise.DrawFigure.InFigures.Count = 0 then
begin
BasisPoint.x := ObjectFromRaise.ActualPoints[1].x + ObjectFromRaise.GrpSizeX / 2;
BasisPoint.y := ObjectFromRaise.ActualPoints[1].y - ObjectFromRaise.GrpSizeY / 2;
end
else
begin
BasisPoint.x := ObjectFromRaise.DrawFigure.CenterPoint.x + ObjectFromRaise.GrpSizeX / 2 - 0.5;
BasisPoint.y := ObjectFromRaise.DrawFigure.CenterPoint.y - ObjectFromRaise.GrpSizeY / 2 + 0.5;
end;
Point1.x := BasisPoint.x;
Point1.y := BasisPoint.y;
Point2.x := BasisPoint.x + 4;
Point2.y := BasisPoint.y - 4;
BasePoint.x := (Point1.x + Point2.x) / 2;
BasePoint.y := (Point1.y + Point2.y) / 2;
AngleDeg := 0;
end
else
begin
BasePoint.x := ActualPoints[1].x + Koef * (ActualPoints[2].x - ActualPoints[1].x);
BasePoint.y := ActualPoints[1].y + Koef * (ActualPoints[2].y - ActualPoints[1].y);
AngleDeg := GetAngle(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
end;
//
if aDeltaLineX = - 1 then
begin
DeltaLineX := (4 * Sin (45 * pi / 180));
end
else
begin
DeltaLineX := aDeltaLineX;
end;
if aDeltaLineY = - 1 then
begin
DeltaLineY := (4 * Cos (45 * pi / 180));
end
else
begin
DeltaLineY := aDeltaLineY;
end;
//
if ANotesRowsType = nr_AutoSide then
begin
if (AngleDeg > 0) and (AngleDeg < 90) then
ANotesRowsType := nr_UpRightSide
else
if (AngleDeg > 90) and (AngleDeg < 180) then
ANotesRowsType := nr_UpLeftSide
else
if (AngleDeg > 180) and (AngleDeg < 270) then
ANotesRowsType := nr_UpRightSide
else
if (AngleDeg > 270) and (AngleDeg < 360) then
ANotesRowsType := nr_UpLeftSide
else
if (AngleDeg = 0) or (AngleDeg = 90) or (AngleDeg = 180) or (AngleDeg = 270) or (AngleDeg = 360) then
ANotesRowsType := nr_UpLeftSide;
FNotesRowsType := ANotesRowsType;
end;
if ANotesRowsType = nr_UpLeftSide then
begin
GetPoints1.x := BasePoint.x - (2 * Sin (20 * pi / 180));
GetPoints1.y := BasePoint.y - (2 * Cos (20 * pi / 180));
GetPoints2.x := BasePoint.x + (2 * Sin (20 * pi / 180));
GetPoints2.y := BasePoint.y + (2 * Cos (20 * pi / 180));
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x - DeltaLineX;
GetPoints2.y := BasePoint.y - DeltaLineY;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x - 7;
GetPoints2.y := GetPoints2.y;
Row3 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_DownLeftSide then
begin
GetPoints1.x := BasePoint.x + (2 * Sin (20 * pi / 180));
GetPoints1.y := BasePoint.y - (2 * Cos (20 * pi / 180));
GetPoints2.x := BasePoint.x - (2 * Sin (20 * pi / 180));
GetPoints2.y := BasePoint.y + (2 * Cos (20 * pi / 180));
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x - DeltaLineX;
GetPoints2.y := BasePoint.y + DeltaLineY;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x - 7;
GetPoints2.y := GetPoints2.y;
Row3 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_UpRightSide then
begin
GetPoints1.x := BasePoint.x + (2 * Sin (20 * pi / 180));
GetPoints1.y := BasePoint.y - (2 * Cos (20 * pi / 180));
GetPoints2.x := BasePoint.x - (2 * Sin (20 * pi / 180));
GetPoints2.y := BasePoint.y + (2 * Cos (20 * pi / 180));
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x + DeltaLineX;
GetPoints2.y := BasePoint.y - DeltaLineY;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x + 7;
GetPoints2.y := GetPoints2.y;
Row3 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_DownRightSide then
begin
GetPoints1.x := BasePoint.x - (2 * Sin (20 * pi / 180));
GetPoints1.y := BasePoint.y - (2 * Cos (20 * pi / 180));
GetPoints2.x := BasePoint.x + (2 * Sin (20 * pi / 180));
GetPoints2.y := BasePoint.y + (2 * Cos (20 * pi / 180));
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x + DeltaLineX;
GetPoints2.y := BasePoint.y + DeltaLineY;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x + 7;
GetPoints2.y := GetPoints2.y;
Row3 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
Result := TFigureGrpNotMod.create(NotesLHandle, Owner);
Result.AddFigure(Row1);
Result.AddFigure(Row2);
Result.AddFigure(Row3);
Result.Visible := True;
Result.Radius := -3;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CreateNotesRowGroup', E.Message);
end;
end;
function TConnectorObject.CreateNotesRowGroup(ANotesRowsType: TNotesRowsType; aDeltaLineX: Double = -1; aDeltaLineY: Double = -1): TFigureGrpNotMod;
var
Row1: TLine;
Row2: TLine;
BasePoint: TDoublePoint;
GetPoints1: TDoublePoint;
GetPoints2: TDoublePoint;
AngleDeg: Double;
NotesLHandle: integer;
DeltaLineX, DeltaLineY: Double;
begin
try
Result := nil;
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
//
if aDeltaLineX = -1 then
DeltaLineX := (4 * Sin (45 * pi / 180))
else
DeltaLineX := aDeltaLineX;
if aDeltaLineY = -1 then
DeltaLineY := (4 * Cos (45 * pi / 180))
else
DeltaLineY := aDeltaLineY;
//
if ANotesRowsType = nr_AutoSide then
begin
ANotesRowsType := nr_DownLeftSide;
FNotesRowsType := ANotesRowsType;
end;
if ANotesRowsType = nr_UpLeftSide then
begin
// ***
if DrawFigure.InFigures.Count > 0 then
begin
BasePoint.x := DrawFigure.CenterPoint.x - GrpSizeX / 2 + 0.5;
BasePoint.y := DrawFigure.CenterPoint.y - GrpSizeY / 2 + 0.5;
end
else
begin
BasePoint.x := ActualPoints[1].x - GrpSizeX / 2 + 0.5;
BasePoint.y := ActualPoints[1].y - GrpSizeY / 2 + 0.5;
end;
//
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x - DeltaLineX;
GetPoints2.y := BasePoint.y - DeltaLineY;
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x - 7;
GetPoints2.y := GetPoints2.y;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_DownLeftSide then
begin
// ***
if DrawFigure.InFigures.Count > 0 then
begin
BasePoint.x := DrawFigure.CenterPoint.x - GrpSizeX / 2 + 0.5;
BasePoint.y := DrawFigure.CenterPoint.y + GrpSizeY / 2 - 0.5;
end
else
begin
BasePoint.x := ActualPoints[1].x - GrpSizeX / 2 + 0.5;
BasePoint.y := ActualPoints[1].y + GrpSizeY / 2 - 0.5;
end;
//
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x - DeltaLineX;
GetPoints2.y := BasePoint.y + DeltaLineY;
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x - 7;
GetPoints2.y := GetPoints2.y;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_UpRightSide then
begin
// ***
if DrawFigure.InFigures.Count > 0 then
begin
BasePoint.x := DrawFigure.CenterPoint.x + GrpSizeX / 2 - 0.5;
BasePoint.y := DrawFigure.CenterPoint.y - GrpSizeY / 2 + 0.5;
end
else
begin
BasePoint.x := ActualPoints[1].x + GrpSizeX / 2 - 0.5;
BasePoint.y := ActualPoints[1].y - GrpSizeY / 2 + 0.5;
end;
//
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x + DeltaLineX;
GetPoints2.y := BasePoint.y - DeltaLineY;
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x + 7;
GetPoints2.y := GetPoints2.y;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
if ANotesRowsType = nr_DownRightSide then
begin
// ***
if DrawFigure.InFigures.Count > 0 then
begin
BasePoint.x := DrawFigure.CenterPoint.x + GrpSizeX / 2 - 0.5;
BasePoint.y := DrawFigure.CenterPoint.y + GrpSizeY / 2 - 0.5;
end
else
begin
BasePoint.x := ActualPoints[1].x + GrpSizeX / 2 - 0.5;
BasePoint.y := ActualPoints[1].y + GrpSizeY / 2 - 0.5;
end;
//
GetPoints1.x := BasePoint.x;
GetPoints1.y := BasePoint.y;
GetPoints2.x := BasePoint.x + DeltaLineX;
GetPoints2.y := BasePoint.y + DeltaLineY;
Row1 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
GetPoints1.x := GetPoints2.x;
GetPoints1.y := GetPoints2.y;
GetPoints2.x := GetPoints2.x + 7;
GetPoints2.y := GetPoints2.y;
Row2 := TLine.create(GetPoints1.x, GetPoints1.y, GetPoints2.x, GetPoints2.y,
1, ord(psSolid), clBlack, 0, NotesLHandle, mydsNormal, Owner);
end;
Result := TFigureGrpNotMod.create(NotesLHandle, Owner);
Result.AddFigure(Row1);
Result.AddFigure(Row2);
Result.Visible := True;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateNotesRowGroup', E.Message);
end;
end;
procedure TConnectorObject.ReCreateNotesGroup(aNeedReCreate: Boolean = False);
var
i: integer;
NotesRows: TFigureGrpNotMod;
NotesCaptions: TRichTextMod;
NotesRowsPoints: TDoublePoint;
NotesLHandle: Integer;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
NotesStrings: TStrings;
FRecreate: Boolean;
GetResLine: TLine;
GetDeltaLineX, GetDeltaLineY: Double;
begin
try
if Self.deleted then
exit;
if aNeedReCreate then
FRecreate := True
else
begin
if ConnectorType = ct_Clear then
Exit;
if NotesGroup <> nil then
begin
NotesCaptions := TRichTextMod(NotesGroup.InFigures[1]);
NotesStrings := NotesCaptions.re.Lines;
end
else
NotesStrings := nil;
FRecreate := IsStringListsDifferent(OutTextNotes, NotesStrings);
end;
if FRecreate then
begin
NotesLHandle := GCadForm.PCad.GetLayerHandle(6);
// óäàëèòü TextBoxesGroup
if NotesGroup <> nil then
begin
NotesRows := TFigureGrpNotMod(TFigureGrp(NotesGroup.InFigures[0]));
GetResLine := TLine(NotesRows.InFigures[0]);
GetDeltaLineX := abs(GetResLine.ActualPoints[1].x - GetResLine.ActualPoints[2].x);
GetDeltaLineY := abs(GetResLine.ActualPoints[1].y - GetResLine.ActualPoints[2].y);
end
else
begin
GetDeltaLineX := -1;
GetDeltaLineY := -1;
end;
if NotesGroup <> nil then
begin
RemoveInFigureGrp(NotesGroup);
GCadForm.PCad.Figures.Remove(NotesGroup);
FreeAndNil(NotesGroup);
end;
{!!!} //11.10.2011 }RefreshCAD(GCadForm.PCad);
NotesRows := CreateNotesRowGroup(FNotesRowsType, GetDeltaLineX, GetDeltaLineY);
NotesRows.Visible := True;
{NotesCaptions := TRichTextMod.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Note);
NotesCaptions.RE.Lines.Clear;
NotesCaptions.RE.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
for i := 0 to OutTextNotes.Count - 1 do
NotesCaptions.re.Lines.Add(OutTextNotes[i]);
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
xCanvas := TMetafileCanvas.Create(NotesCaptions.Metafile, 0);
xCanvas.Font.Name := NotesCaptions.re.Font.Name;
xCanvas.Font.Size := NotesCaptions.re.Font.Size;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * NotesCaptions.re.Lines.Count + 1;
w := 0;
for i := 0 to NotesCaptions.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(NotesCaptions.Re.Lines[i]) then
w := xCanvas.TextWidth(NotesCaptions.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ÏÅÐÅÑÎÇÄÀÒÜ Ñ ÍÎÂÛÌÈ ÑÂÎÉÑÒÂÀÌÈ
if NotesCaptions <> nil then
begin
FreeAndNil(NotesCaptions);
end;{}
GetTextSize(FNotesFontSize, [], FNotesFontName, '', OutTextNotes, h, w);
NotesCaptions := TRichTextMod.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
NotesLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Note);
NotesCaptions.RE.Lines.Clear;
NotesCaptions.RE.Font.Size := FNotesFontSize;
NotesCaptions.re.Font.Name := FNotesFontName;
NotesCaptions.re.Font.Color := FNotesFontColor;
for i := 0 to OutTextNotes.Count - 1 do
begin
OutTextNotes[i] := FastReplace(OutTextNotes[i],#13#10,' ');
NotesCaptions.re.Lines.Add(OutTextNotes[i]);
end;
// ñäâèã ïîä NotesRowsPoints
NotesRowsPoints.x := (TLine(NotesRows.InFigures[1]).ActualPoints[1].x + TLine(NotesRows.InFigures[1]).ActualPoints[2].x) / 2;
NotesRowsPoints.y := (TLine(NotesRows.InFigures[1]).ActualPoints[1].y + TLine(NotesRows.InFigures[1]).ActualPoints[2].y) / 2;
NotesCaptions.Move(NotesRowsPoints.x - NotesCaptions.CenterPoint.x,
NotesRowsPoints.y - NotesCaptions.CenterPoint.y - (h - 1) / 2);
NotesCaptions.Visible := True;
NotesGroup := TFigureGrpNotMod.create(NotesLHandle, Owner);
NotesGroup.AddFigure(NotesRows);
NotesGroup.AddFigure(NotesCaptions);
NotesGroup.LockModify := True;
GCadForm.PCad.AddCustomFigure (GLN(NotesLHandle), NotesGroup, False);
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.ReCreateNotesGroup', E.Message);
end;
end;
procedure TConnectorObject.ReCreateCaptionsGroup(aNeedReCreate: Boolean; aReturnToPos: Boolean);
var
i: integer;
CaptionsLHandle: integer;
Bnd: TDoubleRect;
CapSizeX, CapSizeY: Double;
AConnAngle: Double;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
CapStrings: TStrings;
FRecreate: Boolean;
SavedCaptionPos: TDoublePoint;
BetweenCurr: TDoublePoint;
BetweenSaved: TDoublePoint;
deltaCurr, deltaSaved: Double;
a1: double;
OutTextStrings: TStringList;
begin
if Self.deleted then
exit;
//Tolik
OutTextStrings := nil;
try
if aNeedReCreate then
FRecreate := True
else
begin
if ConnectorType = ct_Clear then
Exit;
if CaptionsGroup <> nil then
CapStrings := CaptionsGroup.re.Lines
else
CapStrings := nil;
FRecreate := IsStringListsDifferent(OutTextCaptions, CapStrings);
end;
if CaptionsGroup <> nil then
SavedCaptionPos := CaptionsGroup.CenterPoint;
if FRecreate then
begin
CaptionsLHandle := GCadForm.PCad.GetLayerHandle(4);
if CaptionsGroup <> nil then
begin
GCadForm.PCad.Figures.Remove(CaptionsGroup);
FreeAndNil(CaptionsGroup);
end;
OutTextStrings := TStringList.Create;
if GCadForm.FShowObjectCaptionsType = st_Short then
begin
if OutTextCaptions.Count > 0 then
OutTextStrings.Add(OutTextCaptions[0]);
end
else
if GCadForm.FShowObjectCaptionsType = st_Full then
begin
for i := 1 to OutTextCaptions.Count - 1 do
OutTextStrings.Add(OutTextCaptions[i]);
end;
{//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
CaptionsGroup := TRichTextMod.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Caption);
CaptionsGroup.RE.Lines.Clear;
CaptionsGroup.RE.Font.Size := FCaptionsFontSize;
CaptionsGroup.re.Font.Name := FCaptionsFontName;
CaptionsGroup.re.Font.Color := FCaptionsFontColor;
//11.10.2011
//
//if GCadForm.FShowObjectCaptionsType = st_Short then
//begin
// if OutTextCaptions.Count > 0 then
// CaptionsGroup.re.Lines.Add(OutTextCaptions[0]);
//end
//else
//if GCadForm.FShowObjectCaptionsType = st_Full then
//begin
// for i := 1 to OutTextCaptions.Count - 1 do
// CaptionsGroup.re.Lines.Add(OutTextCaptions[i]);
//end;
//
for i := 1 to OutTextStrings.Count - 1 do
CaptionsGroup.re.Lines.Add(OutTextStrings[i]); //11.10.2011
// ÏÎËÓ×ÈÒÜ ÑÂÎÉÑÒÂÀ
xCanvas := TMetafileCanvas.Create(CaptionsGroup.Metafile, 0);
xCanvas.Font.Name := CaptionsGroup.re.Font.Name;
xCanvas.Font.Size := CaptionsGroup.re.Font.Size;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * CaptionsGroup.re.Lines.Count + 1;
w := 0;
for i := 0 to CaptionsGroup.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(CaptionsGroup.Re.Lines[i]) then
w := xCanvas.TextWidth(CaptionsGroup.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ÏÅÐÅÑÎÇÄÀÒÜ Ñ ÍÎÂÛÌÈ ÑÂÎÉÑÒÂÀÌÈ
if CaptionsGroup <> nil then
begin
FreeAndNil(CaptionsGroup);
end; }
GetTextSize(FCaptionsFontSize, [], FCaptionsFontName, '', OutTextStrings, h, w);
//
CaptionsGroup := TRichTextMod.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clBlack,
CaptionsLHandle, mydsNormal, GCadForm.PCad, rot_Conn, rnt_Caption);
CaptionsGroup.RE.Lines.Clear;
CaptionsGroup.RE.Font.Size := FCaptionsFontSize;
CaptionsGroup.re.Font.Name := FCaptionsFontName;
CaptionsGroup.re.Font.Color := FCaptionsFontColor;
//11.10.2011
//if GCadForm.FShowObjectCaptionsType = st_Short then
//begin
// if OutTextCaptions.Count > 0 then
// CaptionsGroup.re.Lines.Add(OutTextCaptions[0]);
//end
//else
//if GCadForm.FShowObjectCaptionsType = st_Full then
//begin
// for i := 1 to OutTextCaptions.Count - 1 do
// CaptionsGroup.re.Lines.Add(OutTextCaptions[i]);
//end;
//ShowMessage('Start bug');
for i := 0 to OutTextStrings.Count - 1 do
begin
OutTextStrings[i] := FastReplace(OutTextStrings[i],#13#10,' ');
CaptionsGroup.re.Lines.Add(OutTextStrings[i]); //11.10.2011
end;
//ShowMessage('End bug');
GCadForm.PCad.AddCustomFigure(GLN (CaptionsLHandle), CaptionsGroup, False);
// Tolik -- 12/11/2016 --
//OutTextStrings.Free;
FreeAndNil(OutTextStrings);
//
end
else
// *** NEW ***
begin
a1 := GetLineAngle(CaptionsGroup.ap1, CaptionsGroup.ap2);
a1 := DegToRad(a1);
CaptionsGroup.Rotate(-a1);
end;
// ***
if DrawFigure.InFigures.Count > 0 then
begin
CaptionsGroup.Move(RoundTo((DrawFigure.CenterPoint.x - CaptionsGroup.CenterPoint.x), -2),
RoundTo((DrawFigure.CenterPoint.y - CaptionsGroup.CenterPoint.y), -2));
end
else
begin
CaptionsGroup.Move(ActualPoints[1].x - CaptionsGroup.CenterPoint.x,
ActualPoints[1].y - CaptionsGroup.CenterPoint.y);
end;
//
Bnd := CaptionsGroup.GetBoundRect;
CapSizeX := Bnd.Right - Bnd.Left;
CapSizeY := Bnd.Bottom - Bnd.Top;
AConnAngle := round(FDrawFigureAngle * 180 / pi);
// ReplaceAfterRotate
if FCaptionsViewType = cv_Right then
AConnAngle := 0;
if FCaptionsViewType = cv_Down then
AConnAngle := 90;
if FCaptionsViewType = cv_Left then
AConnAngle := 180;
if FCaptionsViewType = cv_Up then
AConnAngle := 270;
if (AConnAngle >= 0) and (AConnAngle <= 45) then
begin
CaptionsGroup.Move(CapSizeX / 2 + GrpSizeX / 2 + 1, 0);
end
else
if (AConnAngle > 45) and (AConnAngle < 135) then
begin
CaptionsGroup.Move(0, CapSizeX / 2 + GrpSizeX / 2 + 1);
CaptionsGroup.Rotate(- (90 * pi / 180), CaptionsGroup.CenterPoint);
end
else
if (AConnAngle >= 135) and (AConnAngle <= 225) then
begin
CaptionsGroup.Move( - CapSizeX / 2 - GrpSizeX / 2 - 1, 0);
end
else
if (AConnAngle > 225) and (AConnAngle < 315) then
begin
CaptionsGroup.Move(0, - CapSizeX / 2 - GrpSizeX / 2 - 1);
CaptionsGroup.Rotate(- (90 * pi / 180), CaptionsGroup.CenterPoint);
end
else
if (AConnAngle >= 315) and (AConnAngle <= 360) then
begin
CaptionsGroup.Move(CapSizeX / 2 + GrpSizeX / 2 + 1, 0);
end;
// âåðíóòü ïîçèöèþ ïîäïèñè ïåðåä ìîäèôèêàöèåé
if aReturnToPos then
begin
BetweenCurr.x := abs(DrawFigure.CenterPoint.x - CaptionsGroup.CenterPoint.x);
BetweenCurr.y := abs(DrawFigure.CenterPoint.y - CaptionsGroup.CenterPoint.y);
BetweenSaved.x := abs(DrawFigure.CenterPoint.x - SavedCaptionPos.x);
BetweenSaved.y := abs(DrawFigure.CenterPoint.y - SavedCaptionPos.y);
deltaCurr := SQRT(SQR(BetweenCurr.x) + SQR(BetweenCurr.y));
deltaSaved := SQRT(SQR(BetweenSaved.x) + SQR(BetweenSaved.y));
if deltaSaved > deltaCurr then
CaptionsGroup.Move(SavedCaptionPos.x - CaptionsGroup.CenterPoint.x, SavedCaptionPos.y - CaptionsGroup.CenterPoint.y);
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.ReCreateCaptionsGroup', E.Message);
end;
end;
procedure TFrame.RaiseProperties;
begin
try
except
on E: Exception do addExceptionToLogEx('TFrame.RaiseProperties', E.Message);
end;
end;
constructor TFrame.create(LHandle: Integer; aOwner: TComponent);
begin
inherited;
end;
function TFigureGrpNotMod.Edit: Boolean;
var
i: Integer;
FFigure: TFigure;
tempstr: string;
ParentLine: TOrthoLine;
Height: double;
begin
Result := False;
// äâîéíîé êëèê íà ïîäïèñè òðàññû - ðåäêàòîð âûñîòû
if GCadForm.FShowLineCaptionsType = skDetail then
begin
ParentLine := nil;
for i := 0 to GCadForm.PCad.FigureCount - 1 do
begin
FFigure := TFigure(GCadForm.PCad.Figures[i]);
if CheckFigureByClassName(FFigure, cTOrthoLine) then
if TOrthoLine(FFigure).CaptionsGroup <> nil then
// if TOrthoLine(FFigure).CaptionsGroup.ID = ID then
if TOrthoLine(FFigure).CaptionsGroup = Self then
begin
ParentLine := TOrthoLine(FFigure);
Break;
end;
end;
if (ParentLine <> nil) and (not ParentLine.FIsRaiseUpDown) then
begin
tempstr := FormatFloat(ffMask, MetreToUOM(ParentLine.ActualZOrder[1]));
if InputQuery(cCadClasses_Mes28, cCadClasses_Mes29, tempstr) then
begin
try
StrToFloat_My(tempstr);
except
ShowMessage(cSizePos_Mes1);
Exit;
end;
// âûøå êîìíàòû
if StrToFloat_My(tempstr) > MetreToUOM(GCadForm.FRoomHeight) then
begin
tempstr := FormatFloat(ffMask, MetreToUOM(GCadForm.FRoomHeight));
end;
// îáðàáîòàòü
if tempstr <> '' then
begin
Height := StrToFloat_My(tempstr);
Height := UOMToMetre(Height);
// *UNDO*
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
RaiseLineOnHeight(ParentLine, Height, nil);
RefreshCAD(GCadForm.PCad);
{$IF Defined(ES_GRAPH_SC)}
GCadForm.CurrentLayer := 8;
{$else}
GCadForm.CurrentLayer := 2;
{$ifend}
// *UNDO*
GCadForm.FCanSaveForUndo := True;
end;
end;
end;
end;
end;
procedure TFigureGrpNotMod.GetBoundsWithoutGrpSize(var figMaxX, figMaxY,
figMinX, figMinY: Double);
begin
GetBounds(figMaxX, figMaxY, figMinX, figMinY);
end;
{ TSCSHDimLine }
class function TSCSHDimLine.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
var
x3, y3: double;
begin
try
Result := nil;
Result := TSCSHDimLine.Create(LHandle, mydsNormal, aOwner);
result.ActualPoints[1] := Shadow.ap1;
result.ActualPoints[2] := Shadow.ap2;
y3 := Shadow.ap3.y;
x3 := (Shadow.ap1.x + Shadow.ap2.x) / 2;
result.ActualPoints[3] := DoublePoint(x3,y3);
TSCSHDimLine(result).LStyle := TSCSHDimLine(Shadow).Lstyle;
if GCadForm.FDimLinesType = dlt_None then
TSCSHDimLine(result).EndType := etClear;
if GCadForm.FDimLinesType = dlt_Row then
TSCSHDimLine(result).EndType := etRow;
if GCadForm.FDimLinesType = dlt_Stroke then
TSCSHDimLine(result).EndType := etNick;
TSCSHDimLine(Result).FValue := -1;
//TSCSHDimLine(Result).Edit;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.CreateFromShadow', E.Message);
end;
end;
Function TSCSHDimLine.ShadowClick(ClickIndex:Integer;x,y:Double):Boolean;
begin
result := false;
ActualPoints[ClickIndex] := DoublePoint(x,y);
if ClickIndex = 2 then
begin
ActualPoints[3] := DoublePoint(ActualPoints[2].x, ActualPoints[2].y);
if ActualPoints[2].y = ActualPoints[1].y then
begin
ActualPoints[2] := DoublePoint(ActualPoints[2].x, ActualPoints[1].y + 5);
ActualPoints[1] := DoublePoint(ActualPoints[1].x, ActualPoints[1].y + 5);
end
else
ActualPoints[2] := DoublePoint(ActualPoints[2].x, ActualPoints[1].y);
result := true;
end;
end;
function TSCSHDimLine.ShadowTrace(ClickIndex:Integer; x, y:Double): Boolean;
begin
if ClickIndex = 1 then
begin
ActualPoints[2] := DoublePoint(x,y);
ActualPoints[3] := DoublePoint(x,y);
if abs(ActualPoints[1].x-ActualPoints[2].x) < 10 then Lstyle := hlsRight
else LStyle := hlsInner;
end else if ClickIndex = 2 then begin
ActualPoints[3] := DoublePoint(x,y);
end;
result := true;
end;
class function TSCSHDimLine.CreateShadow(x, y: Double): TFigure;
begin
result := TSCSHDimLine.Create(0,dsTrace,nil);
result.ActualPoints[1] := DoublePoint(x,y);
result.ActualPoints[2] := DoublePoint(x,y);
result.ActualPoints[3] := DoublePoint(x,y);
result.color := clLime;
TSCSHDimLine(result).Lstyle := hlsInner;
end;
procedure TSCSHDimLine.Draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
begin
inherited;
end;
// Tolik 11/08/2021 -- ñòàðàÿ çàêîììåí÷åíà - ñì íèæå ....
//function TSCSHDimLine.Edit: Boolean;
Function TSCSHDimLine.Edit: Boolean;
var
oldVal, newVal: Double;
xAction: TUndoAction;
ActionVal: integer;
s: TMemoryStream;
koef: Double; // Tolik 31/10/2022 -
List: TSCSList;
begin
try
Result := False;
if GuserScaleVal = 0 then
begin
F_DimLineDialog.Caption := cCadClasses_Mes15;
F_DimLineDialog.lbMessage.Caption := cCadClasses_Mes16;
if FValue = -1 then
FValue := GetValue;
// Tolik 13/10/2020 --
//F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?' + DecimalSeparator + '\d?\d?';
F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?\d?\d?\d?' + DecimalSeparator + '\d?\d?\d?';
//F_DimLineDialog.edDimValue.Text := FormatFloat(ffMask, MetreToUOM(FValue));
F_DimLineDialog.edDimValue.Text := FormatFloat('0.000', MetreToUOM(FValue));
//
if F_DimLineDialog.ShowModal = mrOk then
begin
// *UNDO*
// Tolik -- 03/02/2017 -- ýòà õåðíÿ íå ðàáîòàåò, à ïîòîì íåëüçÿ îòìåíèòü ìàñòàáèðîâàíèå...
// òàê ÷òî ñîððè ...
{ if Assigned(Self.Owner) then //Tolik -- 15/10/2020 -- êàê ðàç ðàáîòàåò...à âîò Undo -- â äàííîì ñëó÷àå õåðíÿ...
if Self.Owner.Owner = GCadForm then
GCadForm.PCad.RecordModifyUndo(Self);}
// äëÿ óíäî âñå-òàêè çàïèøåì
{if Assigned(GCadForm) then
begin
if GCadForm.FCanSaveForUndo then
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False; // 15/10/2020 --
end;}
// Tolik 15/10/2020
if assigned(Self.Owner) then
if Self.Owner is TPowerCad then
if TPowerCad(Self.Owner).RecordUndo then
begin
xAction := TUndoAction.Create(uaDimLine);
xAction.List.Add(Self);
// Tolik 15/10/2020
//xAction.Params.Add(Pointer(0));
//xAction.Params.Add(Pointer(ActionVal));
s := TMemoryStream.Create;
WriteToStream(s);
xAction.Params.Add(s);
GCadForm.PCad.InsertUndoAction(xAction);
end;
//
newVal := StrToFloat_My(F_DimLineDialog.edDimValue.Text);
newVal := UOMToMetre(newVal);
// Tolik 13/10/2020 --
//DLabel := FormatFloat(ffMask, newVal);
DLabel := FormatFloat('0.000', newVal);
//
AutoText := True;
Modified := True;
Result := True;
//Tolik 02/02/2024
if FValue = -1 then
FValue := GetValue;
//
oldVal := FValue;
koef := NewVal/OldVal; // Tolik 31/10/2022 --
ReScaleHCAD(oldVal, newVal);
FValue := newVal;
if Assigned(Self.Owner) then
begin
if Self.Owner.Owner = GCadForm then
ReScaleAllDimLines;
TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep := RoundN(TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep*koef, 7);
List := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_Cad(Self.Owner.Owner).FCADListID);
if List <> nil then
List.Setting.CADRuleStep := TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep;
end;
end;
end
else
begin
newVal := GuserScaleVal;
GuserScaleVal := 0;
GisUserDimLine := false;
DLabel := FormatFloat('0.000', newVal);
FSCS_Main.tbSelectExpert.Click;
//
AutoText := True;
Modified := True;
Result := True;
//Tolik 02/02/2024 --
if FValue = -1 then
FValue := GetValue;
//
oldVal := FValue;
koef := NewVal/oldVal;
ReScaleHCAD(oldVal, newVal);
FValue := newVal;
if Assigned(Self.Owner) then
begin
if Self.Owner.Owner = GCadForm then
ReScaleAllDimLines;
TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep := RoundN(TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep*koef, 7);
List := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_Cad(Self.Owner.Owner).FCADListID);
if List <> nil then
List.Setting.CADRuleStep := TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep;
end;
end;
except
on E: Exception do
begin
GisUserDimLine := False;
GuserScaleVal := 0;
addExceptionToLogEx('TSCSHDimLine.Edit', E.Message);
end;
end;
end;
(*
function TSCSHDimLine.Edit: Boolean;
var
oldVal, newVal: Double;
xAction: TUndoAction;
ActionVal: integer;
s: TMemoryStream;
begin
try
Result := False;
F_DimLineDialog.Caption := cCadClasses_Mes15;
F_DimLineDialog.lbMessage.Caption := cCadClasses_Mes16;
if FValue = -1 then
FValue := GetValue;
// Tolik 13/10/2020 --
//F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?' + DecimalSeparator + '\d?\d?';
F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?\d?\d?\d?' + DecimalSeparator + '\d?\d?\d?';
//F_DimLineDialog.edDimValue.Text := FormatFloat(ffMask, MetreToUOM(FValue));
F_DimLineDialog.edDimValue.Text := FormatFloat('0.000', MetreToUOM(FValue));
//
if F_DimLineDialog.ShowModal = mrOk then
begin
// *UNDO*
// Tolik -- 03/02/2017 -- ýòà õåðíÿ íå ðàáîòàåò, à ïîòîì íåëüçÿ îòìåíèòü ìàñòàáèðîâàíèå...
// òàê ÷òî ñîððè ...
{ if Assigned(Self.Owner) then //Tolik -- 15/10/2020 -- êàê ðàç ðàáîòàåò...à âîò Undo -- â äàííîì ñëó÷àå õåðíÿ...
if Self.Owner.Owner = GCadForm then
GCadForm.PCad.RecordModifyUndo(Self);}
// äëÿ óíäî âñå-òàêè çàïèøåì
{if Assigned(GCadForm) then
begin
if GCadForm.FCanSaveForUndo then
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False; // 15/10/2020 --
end;}
// Tolik 15/10/2020
if assigned(Self.Owner) then
if Self.Owner is TPowerCad then
if TPowerCad(Self.Owner).RecordUndo then
begin
xAction := TUndoAction.Create(uaDimLine);
xAction.List.Add(Self);
// Tolik 15/10/2020
//xAction.Params.Add(Pointer(0));
//xAction.Params.Add(Pointer(ActionVal));
s := TMemoryStream.Create;
WriteToStream(s);
xAction.Params.Add(s);
GCadForm.PCad.InsertUndoAction(xAction);
end;
//
newVal := StrToFloat_My(F_DimLineDialog.edDimValue.Text);
newVal := UOMToMetre(newVal);
// Tolik 13/10/2020 --
//DLabel := FormatFloat(ffMask, newVal);
DLabel := FormatFloat('0.000', newVal);
//
AutoText := True;
Modified := True;
Result := True;
oldVal := FValue;
ReScaleHCAD(oldVal, newVal);
FValue := newVal;
if Assigned(Self.Owner) then
if Self.Owner.Owner = GCadForm then
ReScaleAllDimLines;
end;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.Edit', E.Message);
end;
end;
*)
function TSCSHDimLine.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): boolean;
begin
try
Result := False;
inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
FValue := GetValue;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.EndModification', E.Message);
end;
end;
//Tolik 14/07/2023 -- åñëè òàê þçàòü, òî òóò MapScale îò÷åíü äàæå îòëè÷àåòñÿ îò òîãî, ÷òî íà êàäå â äàíí³é ìîìåíò...õåðíÿ ïîëó÷àåòñÿ...
{
function TSCSHDimLine.GetValue: Double;
begin
try
Result := 0;
Result := (abs(ap1.x - ap2.x) * MapScale) / 1000;
//Result := round(Result * 100) / 100;
Result := round(Result * 1000) / 1000;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.GetValue', E.Message);
end;
end;
}
function TSCSHDimLine.GetValue: Double;
begin
try
Result := 0;
//Result := (abs(ap1.x - ap2.x) * MapScale) / 1000;
Result := (abs(ap1.x - ap2.x) * TPowerCad(Owner).MapScale) / 1000; // òàê ïðàâèëüíî...
//Result := round(Result * 100) / 100;
Result := round(Result * 1000) / 1000;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.GetValue', E.Message);
end;
end;
//
procedure TSCSHDimLine.ReScaleHCAD(aOldValue, aNewValue: Double);
begin
try
if compareValue(ap1.x, ap2.x) = 0 then // Tolik 16/10/2020 -- ÷òîáû íå áûëî ñèñòåìíîé îøèáêè äåëåíèÿ íà íîëü
exit; // åñëè ïîëüçîâàòëüå êàêèì-ëèáî îáðàçîì âûñòàâèò ðàçìåð ëèíèè â íîëü
//MapScale := aNewValue * MapScale / aOldValue;
//Tolik 25/11/2021 --
//MapScale := aNewValue * 1000 / RoundN(abs(ap1.x - ap2.x), 4); // 05.11.2012 Igor - äëÿ êîððåêòíîãî ðàñ÷åòà ìàñøòàáà {TODO}
MapScale := RoundN(aNewValue * 1000 / RoundN(abs(ap1.x - ap2.x), 4), 7); // 05.11.2012 Igor - äëÿ êîððåêòíîãî ðàñ÷åòà ìàñøòàáà {TODO}
//
//GCadForm.PCad.MapScale := MapScale;
if Assigned(Self.Owner) then
TPowerCad(Self.Owner).MapScale := MapScale;
{if Assigned(Self.Owner) then
begin
if Assigned(Self.Owner.Owner) then
begin
if TF_CAD(TPowerCad(Self.Owner).Owner).FCanSaveForUndo then
begin
TF_CAD(TPowerCad(Self.Owner).Owner).SaveForUndo(uat_None, True, False);
TF_CAD(TPowerCad(Self.Owner).Owner).FCanSaveForUndo := False;
end;
end;
TPowerCad(Self.Owner).MapScale := MapScale;
end;
}
//
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.ReScaleHCAD', E.Message);
end;
end;
procedure TSCSHDimLine.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
xDbl: Double;
begin
try
inherited;
case xCode of
221: FValue := pDouble(data)^;
end;
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.SetPropertyFromStream', E.Message);
end;
end;
procedure TSCSHDimLine.WriteToStream(Stream: TStream);
var
xDbl: Double;
begin
try
inherited;
xDbl := FValue;
WriteField(221, Stream, xDbl, sizeof(xDbl));
except
on E: Exception do addExceptionToLogEx('TSCSHDimLine.WriteToStream', E.Message);
end;
end;
{ TSCSVDimLine }
class function TSCSVDimLine.CreateFromShadow(aOwner: TComponent; LHandle: Integer; Shadow: TFigure): TFigure;
var
x3, y3: double;
begin
try
Result := nil;
Result := TSCSVDimLine.Create(LHandle, mydsNormal, aOwner);
result.ActualPoints[1] := Shadow.ap1;
result.ActualPoints[2] := Shadow.ap2;
x3 := Shadow.ap3.x;
y3 := (Shadow.ap1.y + Shadow.ap2.y) / 2;
result.ActualPoints[3] := DoublePoint(x3, y3);
TSCSVDimLine(result).LStyle := TSCSVDimLine(Shadow).Lstyle;
if GCadForm.FDimLinesType = dlt_None then
TSCSVDimLine(result).EndType := etClear;
if GCadForm.FDimLinesType = dlt_Row then
TSCSVDimLine(result).EndType := etRow;
if GCadForm.FDimLinesType = dlt_Stroke then
TSCSVDimLine(result).EndType := etNick;
TSCSVDimLine(Result).FValue := -1;
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.CreateFromShadow', E.Message);
end;
end;
Function TSCSVDimLine.ShadowClick(ClickIndex:Integer;x,y:Double):Boolean;
begin
result := false;
ActualPoints[ClickIndex] := DoublePoint(x,y);
if ClickIndex = 2 then
begin
ActualPoints[3] := DoublePoint(ActualPoints[2].x, ActualPoints[2].y);
if ActualPoints[2].x = ActualPoints[1].x then
begin
ActualPoints[2] := DoublePoint(ActualPoints[2].x + 5, ActualPoints[2].y);
ActualPoints[1] := DoublePoint(ActualPoints[1].x + 5, ActualPoints[1].y);
end
else
ActualPoints[2] := DoublePoint(ActualPoints[1].x, ActualPoints[2].y);
result := true;
end;
end;
function TSCSVDimLine.ShadowTrace(ClickIndex:Integer; x, y:Double): Boolean;
begin
if ClickIndex = 1 then
begin
ActualPoints[2] := DoublePoint(x,y);
ActualPoints[3] := DoublePoint(x,y);
end
else
if ClickIndex = 2 then
begin
ActualPoints[3] := DoublePoint(x,y);
end;
if abs(ActualPoints[1].y-ActualPoints[2].y) < 10 then
LStyle := vlsTop
else
Lstyle := vlsInner;
result := true;
end;
class function TSCSVDimLine.CreateShadow(x, y: Double): TFigure;
begin
result := TSCSVDimLine.Create(0,dsTrace,nil);
result.ActualPoints[1] := DoublePoint(x,y);
result.ActualPoints[2] := DoublePoint(x,y);
result.ActualPoints[3] := DoublePoint(x,y);
result.color := clLime;
end;
procedure TSCSVDimLine.Draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
begin
inherited;
end;
function TSCSVDimLine.Edit: Boolean;
var
oldVal, newVal: Double;
xAction: TUndoAction;
s: TMemoryStream;
koef: double;
List: TSCSList;
begin
try
Result := False;
F_DimLineDialog.Caption := cCadClasses_Mes17;
F_DimLineDialog.lbMessage.Caption := cCadClasses_Mes18;
if FValue = -1 then
FValue := GetValue;
// Tolik 13/10/2020 -- òðè çíàêà ïåðåä çàïÿòîé - ñëèøêîì ìàëî...èíîãäà ïîëà÷àåòñÿ íàåáêà èç-çà òîãî, ÷òî ðåàëüíûé
// ðàçìåð íå "âëàçèò â ìàñêó"...òîãäà îáðåçàåòñÿ ÷îñëî, ÷òî íå åñòü ãóò... îñîáåííî, åñëè ýòî áóäóò ñàíòèìåòðû, íàïðèìåð...
// èëè âîîáùå, ìèëëèìåòðû....
F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?\d?\d?\d?' + DecimalSeparator + '\d?\d?\d?';
//F_DimLineDialog.edDimValue.Properties.EditMask := '\d?\d?\d?' + DecimalSeparator + '\d?\d?';
//
//Tolik 13/10/2020 -*- ÷òîá áûëî 3 çíàêà ïîñëå çàïÿòîé...
//F_DimLineDialog.edDimValue.Text := FormatFloat(ffMask, MetreToUOM(FValue));
F_DimLineDialog.edDimValue.Text := FormatFloat('0.000', MetreToUOM(FValue));
//
if F_DimLineDialog.ShowModal = mrOk then
begin
// *UNDO*
// Tolik 15/10/2020 --
{if Assigned(Self.Owner) then
if Self.Owner.Owner = GCadForm then
GCadForm.PCad.RecordModifyUndo(Self);}
// Tolik 15/10/2020
if assigned(Self.Owner) then
if Self.Owner is TPowerCad then
if TPowerCad(Self.Owner).RecordUndo then
begin
xAction := TUndoAction.Create(uaDimLine);
xAction.List.Add(Self);
s := TMemoryStream.Create;
WriteToStream(s);
xAction.Params.Add(s);
GCadForm.PCad.InsertUndoAction(xAction);
end;
//
// xAction := TUndoAction.Create(uaDimLine);
// xAction.List.Add(Self);
// xAction.Params.Add(Pointer(0));
// GCadForm.PCad.InsertUndoAction(xAction);
newVal := StrToFloat_My(F_DimLineDialog.edDimValue.Text);
newVal := UOMToMetre(newVal);
// Tolik 13/10/2020 --
//DLabel := FormatFloat(ffMask, newVal);
DLabel := FormatFloat('0.000', newVal);
//
AutoText := True;
Modified := True;
Result := True;
//Tolik 02/02/2024 --
if FValue = -1 then
FValue := GetValue;
//
oldVal := FValue;
koef := newVal/oldVal;
ReScaleVCAD(oldVal, newVal);
FValue := newVal;
if Assigned(Self.Owner) then
begin
if Self.Owner.Owner = GCadForm then
ReScaleAllDimLines;
TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep := RoundN(TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep*koef, 7);
List := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_Cad(Self.Owner.Owner).FCADListID);
if List <> nil then
List.Setting.CADRuleStep := TF_Cad(Self.Owner.Owner).FListSettings.CADRuleStep;
end;
end;
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.Edit', E.Message);
end;
end;
function TSCSVDimLine.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): boolean;
begin
try
Result := False;
inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
FValue := GetValue;
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.EndModification', E.Message);
end;
end;
//Tolik 14/07/2023 --
{
function TSCSVDimLine.GetValue: Double;
begin
try
Result := 0;
Result := (abs(ap1.y - ap2.y) * MapScale) / 1000;
//Result := Round(Result * 100) / 100;
Result := Round(Result * 1000) / 1000;
//
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.GetValue', E.Message);
end;
end;
}
function TSCSVDimLine.GetValue: Double;
begin
try
Result := 0;
//Result := (abs(ap1.y - ap2.y) * MapScale) / 1000;
Result := (abs(ap1.y - ap2.y) * TPowerCad(Owner).MapScale) / 1000;
//Result := Round(Result * 100) / 100;
Result := Round(Result * 1000) / 1000;
//
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.GetValue', E.Message);
end;
end;
//
procedure TSCSVDimLine.ReScaleVCAD(aOldValue, aNewValue: Double);
begin
try
if compareValue(ap1.y, ap2.y) = 0 then // Tolik 16/10/2020 -- ÷òîáû íå áûëî ñèñòåìíîé îøèáêè äåëåíèÿ íà íîëü
exit; // åñëè ïîëüçîâàòëüå êàêèì-ëèáî îáðàçîì âûñòàâèò ðàçìåð ëèíèè â íîëü
//MapScale := aNewValue * MapScale / aOldValue;
//25/11/2021 -- Tolik -- íåìíîæêî îêðóãëèì äî 7 çíàêîâ.
//MapScale := aNewValue * 1000 / RoundN(abs(ap1.y - ap2.y), 4); // 05.11.2012 Igor - äëÿ êîððåêòíîãî ðàñ÷åòà ìàñøòàáà {TODO}
//MapScale := aNewValue * 1000 / RoundN(abs(ap1.y - ap2.y), 4); // 05.11.2012 Igor - äëÿ êîððåêòíîãî ðàñ÷åòà ìàñøòàáà {TODO}
MapScale := RoundN(aNewValue * 1000 / RoundN(abs(ap1.y - ap2.y), 4), 7); // 05.11.2012 Igor - äëÿ êîððåêòíîãî ðàñ÷åòà ìàñøòàáà {TODO}
//
//GCadForm.PCad.MapScale := MapScale;
if Assigned(Self.Owner) then
TPowerCad(Self.Owner).MapScale := MapScale;
{
//Tolik -- try UNDO 13/10/2020
if Assigned(Self.Owner) then
begin
if Assigned(Self.Owner.Owner) then
begin
if TF_CAD(TPowerCad(Self.Owner).Owner).FCanSaveForUndo then
begin
TF_CAD(TPowerCad(Self.Owner).Owner).SaveForUndo(uat_None, True, False);
TF_CAD(TPowerCad(Self.Owner).Owner).FCanSaveForUndo := False;
end;
end;
TPowerCad(Self.Owner).MapScale := MapScale;
end;
}
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.ReScaleVCAD', E.Message);
end;
end;
procedure TSCSVDimLine.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
xDbl: Double;
begin
try
inherited;
case xCode of
221: FValue := pDouble(data)^;
end;
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.SetPropertyFromStream', E.Message);
end;
end;
procedure TSCSVDimLine.WriteToStream(Stream: TStream);
var
xDbl: Double;
begin
try
inherited;
xDbl := FValue;
WriteField(221, Stream, xDbl, sizeof(xDbl));
except
on E: Exception do addExceptionToLogEx('TSCSVDimLine.WriteToStream', E.Message);
end;
end;
procedure TFrame.Move(deltax, deltay: double);
var
i: Integer;
Figure: TFigure;
begin
try
inherited;
{//17.11.2011
if GCadForm.FFrameProjectName <> nil then
if not GCadForm.FFrameProjectName.Selected then
GCadForm.FFrameProjectName.Move(deltax, deltay);
if GCadForm.FFrameListName <> nil then
if not GCadForm.FFrameListName.Selected then
GCadForm.FFrameListName.Move(deltax, deltay);
if GCadForm.FFrameCodeName <> nil then
if not GCadForm.FFrameCodeName.Selected then
GCadForm.FFrameCodeName.Move(deltax, deltay);
if GCadForm.FFrameIndexName <> nil then
if not GCadForm.FFrameIndexName.Selected then
GCadForm.FFrameIndexName.Move(deltax, deltay);}
for i := 0 to GCadForm.FFrameObjects.Count - 1 do
begin
Figure := TFigure(GCadForm.FFrameObjects.Objects[i]);
if Figure <> nil then
if not Figure.Selected then
Figure.Move(deltax, deltay);
end;
except
on E: Exception do addExceptionToLogEx('TFrame.Move', E.Message);
end;
end;
destructor TFrame.Destroy;
begin
try
inherited;
except
on E: Exception do addExceptionToLogEx('TFrame.Destroy', E.Message);
end;
end;
{ TRichTextMod }
constructor TRichTextMod.create(aX1, aY1, aX2, aY2: Double; w, s, c, abrs, abrc, LHandle: Integer; aDrawStyle: TDrawStyle; aOwner: TComponent;
aObjectType: TRtfObjectType; aNoteType: TRtfNoteType; aAlignment: Integer = 0; AText: Boolean=true);
//Tolik
var FCanvas: TCanvas;
//
begin
try
inherited create(aX1, aY1, aX2, aY2, w, s, c, abrs, abrc, LHandle, aDrawStyle, aOwner, AText);
fHasParent := True;
Re.Font.Color := clBlack;
if aObjectType = rot_Line then
begin
if aNoteType = rnt_Caption then
begin
Re.Font.Color := GCadForm.FLinesCaptionsColor;
Re.Font.Size := GCadForm.FLinesCaptionsFontSize;
end;
if aNoteType = rnt_Note then
begin
Re.Font.Color := GCadForm.FLinesNotesColor;
Re.Font.Size := GCadForm.FLinesNotesFontSize;
end;
end;
if aObjectType = rot_Conn then
begin
if aNoteType = rnt_Caption then
begin
Re.Font.Color := GCadForm.FConnectorsCaptionsColor;
Re.Font.Size := GCadForm.FConnectorsCaptionsFontSize;
end;
if aNoteType = rnt_Note then
begin
Re.Font.Color := GCadForm.FConnectorsNotesColor;
Re.Font.Size := GCadForm.FConnectorsNotesFontSize;
end;
end;
Re.Font.Style := [];
LockModify := True;
Re.Alignment := TAlignment(aAlignment);
except
on E: Exception do addExceptionToLogEx('TRichTextMod.create', E.Message);
end;
end;
procedure TRichTextMod.Delete;
begin
try
if not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
end;
except
on E: Exception do addExceptionToLogEx('TRichTextMod.Delete', E.Message);
end;
end;
procedure TRichTextMod.draw(DEngine: TPCDrawEngine; isGrayed: Boolean);
begin
//try
if Visible then
inherited;
//except
// on E: Exception do addExceptionToLogEx('TRichTextMod.draw', E.Message);
//end;
end;
function TRichTextMod.edit: Boolean;
var
i: integer;
EditForm: TfrmRichEdit;
xStream: TMemorystream;
tempstr: string;
begin
try
result := false;
exit;
inherited edit;
if assigned(Lines) then
begin
EditForm := TFrmRichEdit.Create(owner);
EditForm.Caption := cCadClasses_Mes19;
xStream := TmemoryStream.Create;
Lines.SaveToStream(xStream);
xStream.Position := 0;
EditForm.RichEdit1.Lines.LoadFromStream(xStream);
xStream.Free;
if EditForm.ShowModal = mrOk then
begin
Lines.Clear;
for i := 0 to EditForm.RichEdit1.Lines.Count - 1 do
begin
tempstr := EditForm.RichEdit1.Lines[i];
Lines.Add(tempstr);
end;
end;
editform.free;
result := true;
end;
except
on E: Exception do addExceptionToLogEx('TRichTextMod.edit', E.Message);
end;
end;
procedure TRichTextMod.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
begin
inherited;
fHasParent := False;
end;
procedure TRichTextMod.WriteToStream(Stream: TStream);
begin
inherited;
end;
function TOrthoLine.CreateDuplicate: TOrthoLine;
var
i: integer;
FBlock: TFigure;
tempstr: string;
x1, x2, y1, y2, z1, z2: double;
ObjParams: TObjectParams;
JoinConn1, JoinConn2: TConnectorObject;
ObjFromRaise: TConnectorObject;
// Tolik
OldAP1, OldAP2: TDoublePoint;
NewAP1, NewAP2: TDoublePoint;
ResPoints: TDoublePoint;
BoundRect: TRect;
deltax, deltay: Double;
//
begin
try
Result := nil;
x1 := GLastTracedLinePoints1.x;
x2 := GLastTracedLinePoints2.x;
y1 := GLastTracedLinePoints1.y;
y2 := GLastTracedLinePoints2.y;
z1 := ActualZOrder[1];
z2 := ActualZOrder[2];
Result := TOrthoLine.Create(x1, y1, z1, x2, y2, z2, FTraceWidth, ord(FTraceStyle), FTraceColor, ord(RowStyle), LayerHandle, mydsNormal, GCadForm.PCad, True, False);
Result.OrthoLineType := OrthoLineType;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), Result, False);
// Tolik 20/11/2015
//Result.Name := cCadClasses_Mes20;
Result.Name := Self.Name; // çàáûëè ïðî ñïóñêè/ïîúåìáû
//
SetNewObjectNameInPM(Result.ID, Result.Name);
ObjParams := GetFigureParams(Result.ID);
Result.Name := ObjParams.Name;
Result.FIndex := ObjParams.MarkID;
JoinConn1 := TConnectorObject.Create(x1, y1, ActualZOrder[1], LayerHandle, mydsNormal, GCadForm.PCad);
JoinConn1.ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), JoinConn1, False);
JoinConn2 := TConnectorObject.Create(x2, y2, ActualZOrder[2], LayerHandle, mydsNormal, GCadForm.PCad);
JoinConn2.ConnectorType := ct_Clear;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), JoinConn2, False);
Result.SetJConnector1(JoinConn1);
Result.SetJConnector2(JoinConn2);
// Result.JoinConnector1.LockModify := JoinConnector1.LockModify;
// Result.JoinConnector1.LockMove := JoinConnector1.LockMove;
// Result.JoinConnector1.LockSelect := JoinConnector1.LockSelect;
// Result.JoinConnector2.LockModify := JoinConnector2.LockModify;
// Result.JoinConnector2.LockMove := JoinConnector2.LockMove;
// Result.JoinConnector2.LockSelect := JoinConnector2.LockSelect;
Result.JoinConnector1.LockModify := False;
Result.JoinConnector1.LockMove := False;
Result.JoinConnector1.LockSelect := False;
Result.JoinConnector2.LockModify := False;
Result.JoinConnector2.LockMove := False;
Result.JoinConnector2.LockSelect := False;
// ïðèñâîåíèå ïðèçíàêîâ ñ-ï
if FIsRaiseUpDown then
begin
// FConnRaiseType
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
JoinConn1.FConnRaiseType := TConnectorObject(JoinConnector1).FConnRaiseType
else
JoinConn1.FConnRaiseType := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]).FConnRaiseType;
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
JoinConn2.FConnRaiseType := TConnectorObject(JoinConnector2).FConnRaiseType
else
JoinConn2.FConnRaiseType := TConnectorObject(TConnectorObject(JoinConnector2).JoinedConnectorsList[0]).FConnRaiseType;
// FObjectFromRaise
if JoinConn1.FConnRaiseType <> crt_None then
JoinConn1.FObjectFromRaise := JoinConn2
else
JoinConn1.FObjectFromRaise := nil;
if JoinConn2.FConnRaiseType <> crt_None then
JoinConn2.FObjectFromRaise := JoinConn1
else
JoinConn2.FObjectFromRaise := nil;
Result.FObjectFromRaisedLine := nil;
// FObjectFromRaisedLine
if FObjectFromRaisedLine <> nil then
begin
ObjFromRaise := FObjectFromRaisedLine;
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
begin
if JoinConnector1 = ObjFromRaise then
Result.FObjectFromRaisedLine := JoinConn1;
end
else
begin
if TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]) = ObjFromRaise then
Result.FObjectFromRaisedLine := JoinConn1;
end;
if TConnectorObject(JoinConnector2).JoinedConnectorsList.Count = 0 then
begin
if JoinConnector2 = ObjFromRaise then
Result.FObjectFromRaisedLine := JoinConn2;
end
else
begin
if TConnectorObject(TConnectorObject(JoinConnector2).JoinedConnectorsList[0]) = ObjFromRaise then
Result.FObjectFromRaisedLine := JoinConn2;
end;
end;
Result.JoinConnector1.LockModify := JoinConnector1.LockModify;
Result.JoinConnector1.LockMove := JoinConnector1.LockMove;
Result.JoinConnector1.LockSelect := JoinConnector1.LockSelect;
Result.JoinConnector2.LockModify := JoinConnector2.LockModify;
Result.JoinConnector2.LockMove := JoinConnector2.LockMove;
Result.JoinConnector2.LockSelect := JoinConnector2.LockSelect;
end;
///
Result.isSnap := isSnap;
Result.isTraceShow := isTraceShow;
Result.IsShowBlock := IsShowBlock;
Result.FIsRaiseUpDown := FIsRaiseUpDown;
Result.FIsVertical := FIsVertical;
Result.ShowLength := ShowLength;
Result.ShowCaptions := ShowCaptions;
Result.ShowNotes := ShowNotes;
Result.IsLengthAboveLimit := IsLengthAboveLimit;
Result.FNotRecalcLength := FNotRecalcLength;
// ñâ-âà èçìåíåíííûõ ïîëåé
Result.FIsNameChanged := FIsNameChanged;
Result.FIsCaptionsChanged := FIsCaptionsChanged;
Result.FIsNotesChanged := FIsNameChanged;
Result.FIsBlockChanged := FIsBlockChanged;
Result.FCount := FCount;
Result.FBlockID := FBlockID;
Result.FObjectType := FObjectType;
Result.FBlockGUID := FBlockGUID;
Result.FTraceWidth := FTraceWidth;
Result.BlockStep := BlockStep;
Result.FGap := FGap;
Result.UserLength := UserLength;
Result.CalculLength := CalculLength;
Result.FDrawFigureAngle := FDrawFigureAngle;
Result.SaveCaption := SaveCaption;
Result.tmpCaptionsGroup := tmpCaptionsGroup;
Result.tmpNotesCaptions := tmpNotesCaptions;
Result.FCableFullnessSide1 := FCableFullnessSide1;
Result.FCableFullnessSide2 := FCableFullnessSide2;
Result.FCableChannelFullness := FCableChannelFullness;
Result.FCableChannelClosedSide1 := FCableChannelClosedSide1;
Result.FCableChannelClosedSide2 := FCableChannelClosedSide2;
Result.FLineType := FLineType;
Result.FLineRaiseType := FLineRaiseType;
Result.FNetworkTypes := FNetworkTypes;
Result.FNotesRowsType := FNotesRowsType;
Result.FCaptionsViewType := FCaptionsViewType;
// âèä îòîáðàæåíèÿ òðàññ
Result.FTraceColor := FTraceColor;
Result.FTraceStyle := FTraceStyle;
Result.ActualZOrder[1] := ActualZOrder[1];
Result.ActualZOrder[2] := ActualZOrder[2];
Result.LineLength := LineLength;
Result.FCabinetID := FCabinetID;
Result.FConnectingLine := FConnectingLine;
Result.FConnectingPos := FConnectingPos;
Result.FCaptionsFontBold := FCaptionsFontBold;
Result.FCaptionsFontSize := FCaptionsFontSize;
Result.FNotesFontSize := FNotesFontSize;
Result.FExistOtherObjectType := FExistOtherObjectType;
Result.FSingleBlockDelta := FSingleBlockDelta;
Result.FOriginalSizeX := FOriginalSizeX;
Result.FOriginalSizeY := FOriginalSizeY;
Result.FDrawFigurePercent := FDrawFigurePercent;
// dupl CaptionsGroup
Result.OutTextCaptions.Clear;
for i := 0 to OutTextCaptions.Count - 1 do
begin
tempstr := OutTextCaptions.Strings[i];
Result.OutTextCaptions.Add(tempstr);
end;
// dupl NotesGroup
Result.OutTextNotes.Clear;
for i := 0 to OutTextNotes.Count - 1 do
begin
tempstr := OutTextNotes.Strings[i];
Result.OutTextNotes.Add(tempstr);
end;
DublicateObjectComponents(ID, Result.ID);
// ïåðåäàòü óñë. îáîçíà÷åíèå
for i := 0 to FSingleBlock.InFigures.Count - 1 do
begin
FBlock := TFigure(FSingleBlock.InFigures[i]).Duplicate;
Result.FSingleBlock.AddFigure(FBlock);
end;
Result.ReCreateDrawFigureBlock;
Result.ReCreateCaptionsGroup(false, false);
Result.ReCreateNotesGroup;
Result.LockModify := LockModify;
Result.LockMove := LockMove;
Result.LockSelect := LockSelect;
Result.tmpDrawShadow := False;
Result.Move(0.01, 0.01);
Result.Move(-0.01, -0.01);
// Tolik
// deltax := Self.CaptionsGroup.ActualPoints[1].x - Result.CaptionsGroup.ActualPoints[1].x;
// deltay := Self.CaptionsGroup.ActualPoints[1].y - Result.CaptionsGroup.ActualPoints[1].y;
// dupl CaptionsGroup
{ Result.OutTextCaptions.Clear;
Result.CaptionsGroup.Move(deltax, deltay);
for i := 0 to OutTextCaptions.Count - 1 do
begin
tempstr := OutTextCaptions.Strings[i];
Result.OutTextCaptions.Add(tempstr);
end;
Result.ReCreateCaptionsGroup(false, false);}
//
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CreateDuplicate', E.Message);
end;
end;
function TConnectorObject.CreateDuplicate(x, y: double): TConnectorObject;
var
i: integer;
tempstr: string;
z: double;
ObjParams: TObjectParams;
DrawDeltaX, DrawDeltaY: Double;
begin
try
Result := nil;
z := ActualZOrder[1];
Result := TConnectorObject.Create(x, y, z, LayerHandle, mydsNormal, GCadForm.PCad);
Result.ConnectorType := ConnectorType;
GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), Result, False);
Result.Name := cCadClasses_Mes21;
SetNewObjectNameInPM(Result.ID, Result.Name);
ObjParams := GetFigureParams(Result.ID);
Result.Name := ObjParams.Name;
Result.FIndex := ObjParams.MarkID;
// Properties
Result.isPrevSnap := isPrevSnap;
Result.isSnap := isSnap;
Result.AsEndPoint := False; //AsEndPoint;
Result.ShowCaptions := ShowCaptions;
Result.ShowNotes := ShowNotes;
Result.FCornerTypeChangedByUser := FCornerTypeChangedByUser;
// ñâ-âà èçìåíåíííûõ ïîëåé
Result.FIsNameChanged := FIsNameChanged;
Result.FIsCaptionsChanged := FIsCaptionsChanged;
Result.FIsNotesChanged := FIsNotesChanged;
Result.FIsBlockChanged := FIsBlockChanged;
// äëÿ ìåæýòàæíûõ ïåðåõîäîâ
Result.FBlockID := FBlockID;
Result.FObjectType := FObjectType;
Result.FBlockGUID := FBlockGUID;
// ñâ-âî äëÿ øêàôà, ïðèâÿçêà ê ëèñòó
Result.FLHandle := FLHandle;
Result.FDrawFigureAngle := FDrawFigureAngle;
Result.tmpCaptionsGroup := tmpCaptionsGroup;
Result.tmpNotesCaptions := tmpNotesCaptions;
Result.FConnFullness := FConnFullness;
// äëÿ ïîäúåìîâ
Result.FNetworkTypes := FNetworkTypes;
Result.FNotesRowsType := FNotesRowsType;
Result.FCaptionsViewType := FCaptionsViewType;
// òèï óãîëêà äëÿ êîííåêòîðà
Result.FCornerType := FCornerType;
Result.ActualZOrder[1] := ActualZOrder[1];
Result.DrawFigure := TFigureGrpMod(DrawFigure.Duplicate);
// Tolik 20/10/2016 --
{ DrawDeltaX := DrawFigure.ActualPoints[1].x - Result.ActualPoints[1].x;
DrawDeltaY := DrawFigure.ActualPoints[1].y - Result.ActualPoints[1].y;
Result.DrawFigure.move(-DrawDeltaX, -DrawDeltaY); }
//
Result.FCabinetID := FCabinetID;
Result.FTrunkName := FTrunkName;
Result.FDisableTracing := FDisableTracing;
Result.FMirrored := FMirrored;
Result.FCaptionsFontSize := FCaptionsFontSize;
Result.FNotesFontSize := FNotesFontSize;
Result.FOriginalSizeX := FOriginalSizeX;
Result.FOriginalSizeY := FOriginalSizeY;
Result.FDrawFigurePercent := FDrawFigurePercent;
// dupl CaptionsGroup
Result.OutTextCaptions.Clear;
for i := 0 to OutTextCaptions.Count - 1 do
begin
tempstr := OutTextCaptions.Strings[i];
Result.OutTextCaptions.Add(tempstr);
end;
// dupl NotesGroup
Result.OutTextNotes.Clear;
for i := 0 to OutTextNotes.Count - 1 do
begin
tempstr := OutTextNotes.Strings[i];
Result.OutTextNotes.Add(tempstr);
end;
// äóáëèðîâàòü âñå êîìïëåêòóþùèå â ÏÌ
DublicateObjectComponents(ID, Result.ID);
Result.ReCreateNotesGroup;
Result.ReCreateCaptionsGroup(false, false);
if Result.DrawFigure <> nil then
begin
AutoShiftObject(Result);
end;
Result.LockModify := LockModify;
Result.LockMove := LockMove;
Result.LockSelect := LockSelect;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateDuplicate', E.Message);
end;
end;
function TConnectorObject.CreateCrossATSDuplicate(x, y: double): TConnectorObject;
var
DupConn: TConnectorObject;
DupLine: TOrthoLine;
i, j: Integer;
Line: TOrthoLine;
Traces: TList;
MovedConnsList: TList;
deltax, deltay: Double;
begin
try
Result := nil;
DupConn := CreateDuplicate(x, y);
Traces := GetAllConnectingTraces(Self);
deltax := DupConn.ActualPoints[1].x - ActualPoints[1].x;
deltay := DupConn.ActualPoints[1].y - ActualPoints[1].y;
MovedConnsList := TList.Create;
for i := 0 to Traces.Count - 1 do
begin
Line := TOrthoLine(Traces[i]);
GLastTracedLinePoints1 := Line.ActualPoints[1];
GLastTracedLinePoints2 := Line.ActualPoints[2];
DupLine := Line.CreateDuplicate;
if CheckNoFigureInList(DupLine.JoinConnector1, MovedConnsList) then
begin
DupLine.JoinConnector1.Move(deltax, deltay);
MovedConnsList.Add(DupLine.JoinConnector1);
end;
if CheckNoFigureInList(DupLine.JoinConnector2, MovedConnsList) then
begin
DupLine.JoinConnector2.Move(deltax, deltay);
MovedConnsList.Add(DupLine.JoinConnector2);
end;
//Tolik --
//SnapConnectorToPointObject(TConnectorObject(DupLine.JoinConnector2), DupConn);
CheckingSnapPointObjectToConnector(DupConn, TConnectorObject(DupLine.JoinConnector2), False, True);
//
DupLine.JoinConnector2.LockSelect := True;
DupLine.JoinConnector2.LockMove := True;
DupLine.JoinConnector2.LockModify := True;
GLastTracedLinePoints1 := DoublePoint(-10000, -10000);
GLastTracedLinePoints2 := DoublePoint(-10000, -10000);
end;
Result := DupConn;
FreeAndNil(MovedConnsList);
FreeAndNil(Traces);
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateCrossATSDuplicate', E.Message);
end;
end;
function TConnectorObject.CreateDistribCabDuplicate(x, y: double): TConnectorObject;
var
i, j: Integer;
DupConn: TConnectorObject;
DupLine: TOrthoLine;
Line: TOrthoLine;
Traces: TList;
MovedConnsList: TList;
deltax, deltay: Double;
begin
try
Result := nil;
// Exit;
DupConn := CreateDuplicate(x, y);
Traces := GetAllConnectingTraces(Self);
deltax := DupConn.ActualPoints[1].x - ActualPoints[1].x;
deltay := DupConn.ActualPoints[1].y - ActualPoints[1].y;
MovedConnsList := TList.Create;
for i := 0 to Traces.Count - 1 do
begin
Line := TOrthoLine(Traces[i]);
GLastTracedLinePoints1 := Line.ActualPoints[1];
GLastTracedLinePoints2 := Line.ActualPoints[2];
DupLine := Line.CreateDuplicate;
if CheckNoFigureInList(DupLine.JoinConnector1, MovedConnsList) then
begin
DupLine.JoinConnector1.Move(deltax, deltay);
MovedConnsList.Add(DupLine.JoinConnector1);
end;
if CheckNoFigureInList(DupLine.JoinConnector2, MovedConnsList) then
begin
DupLine.JoinConnector2.Move(deltax, deltay);
MovedConnsList.Add(DupLine.JoinConnector2);
end;
// Tolik 03/04/2018 --
//SnapConnectorToPointObject(TConnectorObject(DupLine.JoinConnector2), DupConn);
CheckingSnapPointObjectToConnector(DupConn, TConnectorObject(DupLine.JoinConnector2), False, True);
//
DupLine.JoinConnector2.LockSelect := True;
DupLine.JoinConnector2.LockMove := True;
DupLine.JoinConnector2.LockModify := True;
GLastTracedLinePoints1 := DoublePoint(-10000, -10000);
GLastTracedLinePoints2 := DoublePoint(-10000, -10000);
end;
Result := DupConn;
FreeAndNil(MovedConnsList);
FreeAndNil(Traces);
except
on E: Exception do addExceptionToLogEx('TConnectorObject.CreateDistribCabDuplicate', E.Message);
end;
end;
{ TPlanObject }
constructor TPlanObject.create(LHandle: Integer; aOwner: TComponent);
begin
try
inherited create(LHandle, aOwner);
JoinedConnectors := TList.Create;
SetLength(FJoinedConnectorsIndexes, 0);
FSCSID := -1;
FMoveWithConnector := True;
except
on E: Exception do addExceptionToLogEx('TPlanObject.create', E.Message);
end;
end;
//Tolik 23/02/2018 --
destructor TPlanObject.Destroy;
var i, j: Integer;
JoinConn: TPlanConnector;
begin
try
for i := 0 to JoinedConnectors.Count - 1 do
begin
JoinConn := TPlanConnector(JoinedConnectors[i]);
JoinConn.JoinedPlanObject := nil;
JoinConn.LockModify := False;
JoinConn.LockMove := False;
JoinConn.LockSelect := False;
end;
except
on E: Exception do addExceptionToLogEx('TPlanObject.Delete', E.Message);
end;
//Tolik
SetLength(FJoinedConnectorsIndexes,0);
JoinedConnectors.Clear;
JoinedConnectors.Free;
JoinedConnectors := Nil;
inherited;
end;
procedure TPlanObject.Delete;
var
i, j: Integer;
JoinConn: TPlanConnector;
begin
try
if not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
for i := 0 to JoinedConnectors.Count - 1 do
begin
JoinConn := TPlanConnector(JoinedConnectors[i]);
JoinConn.JoinedPlanObject := nil;
JoinConn.LockModify := False;
JoinConn.LockMove := False;
JoinConn.LockSelect := False;
end;
end;
except
on E: Exception do addExceptionToLogEx('TPlanObject.Delete', E.Message);
end;
//Tolik
SetLength(FJoinedConnectorsIndexes,0);
JoinedConnectors.Clear;
// Tolik 07/06/2021 - - ýòî çäåñü íèççÿ!!!!
//JoinedConnectors.Free;
end;
function TPlanObject.Edit: Boolean;
var
Caption: TRichText;
i, k: Integer;
CaptionsList: TStringList;
LHandle: Integer;
Block: TBlock;
BlockBnd: TDoubleRect;
BlockX, BlockY: double;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
BlockCP: TDoublePoint;
begin
try
Result := false;
Caption := nil;
if CheckFigureByClassName(TFigure(InFigures[0]), 'TRichText') then
begin
Caption := TRichText(InFigures[0]);
Block := TBlock(InFigures[1]);
end
else if CheckFigureByClassName(TFigure(InFigures[1]), 'TRichText') then
begin
Caption := TRichText(InFigures[1]);
Block := TBlock(InFigures[0]);
end;
if Caption <> nil then
begin
Caption.edit;
end;
// Correct caption
CaptionsList := TStringList.Create;
for i := 0 to Caption.re.Lines.Count - 1 do
CaptionsList.Add(Caption.re.Lines[i]);
RemoveFromGrp(Caption); //28.04.2011 InFigures.Remove(Caption);
FreeAndNil(Caption);
BlockBnd := Block.GetBoundRect;
BlockX := abs(BlockBnd.Left - BlockBnd.Right);
BlockY := abs(BlockBnd.Top - BlockBnd.Bottom);
for k := 14 downto 1 do
begin
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{Caption := TRichText.create(-100, -100, -100, -100,
1, ord(psSolid), clBlack, ord(bsClear), clBlack, LHandle, mydsNormal, GCadForm.PCad);
Caption.re.Font.Size := k;
Caption.RE.Lines.Clear;
for i := 0 to CaptionsList.Count - 1 do
Caption.re.Lines.Add(CaptionsList[i]);
GCadForm.PCad.AddCustomFigure(1, Caption, False);
RefreshCAD(GCadForm.PCad);
// ïîëó÷èòü ñâîéñòâà
xCanvas := TMetafileCanvas.Create(Caption.Metafile, 0);
xCanvas.Font.Name := Caption.re.Font.Name;
xCanvas.Font.Size := Caption.re.Font.Size;
GetTextMetrics(xCanvas.Handle, TM);
h := TM.tmHeight / 4 * Caption.re.Lines.Count + 1;
w := 0;
for i := 0 to Caption.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(Caption.Re.Lines[i]) then
w := xCanvas.TextWidth(Caption.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
FreeAndNil(xCanvas);
// ïåðåñîçäàòü ñ íîâûìè ñâîéñòâàìè
if Caption <> nil then
begin
GCadForm.PCad.Figures.Remove(Caption);
FreeAndNil(Caption);
end;}
GetTextSize(k, [], GCadForm.PCad.Font.Name, '', CaptionsList, h, w); //11.10.2011 øèðèíà w íå íóæíà
if (k = 1) or (w < BlockX) and (h < BlockY) then
begin
Caption := TRichText.create(-100, -100, -100 + w, -100 + h,
1, ord(psSolid), clBlack, ord(bsClear), clBlack, LHandle, mydsNormal, GCadForm.PCad);
Caption.re.Font.Size := k;
Caption.RE.Lines.Clear;
for i := 0 to CaptionsList.Count - 1 do
begin
CaptionsList[i] := FastReplace(CaptionsList[i],#13#10,' ');
Caption.re.Lines.Add(CaptionsList[i]);
end;
RefreshCAD(GCadForm.PCad);
Break;
end;
end;
// ïîäãîíêà ïîäïèñè ïîä ÓÎ
BlockCP.x := BlockBnd.Left + BlockX / 2;
BlockCP.y := BlockBnd.Top + BlockY / 2;
Caption.Move(BlockCP.x - Caption.CenterPoint.x, BlockCP.y - Caption.CenterPoint.y);
AddFigure(Caption);
FreeAndNil(CaptionsList);
RefreshCAD(GCadForm.PCad);
except
on E: Exception do addExceptionToLogEx('TPlanObject.Edit', E.Message);
end;
end;
function TPlanObject.IsPointIn(x, y: Double): Boolean;
var
CP: TDoublePoint;
begin
try
Result := False;
CP := CenterPoint;
if (x >= CP.x - FSizeX / 2) and (x <= CP.x + FSizeX / 2) and (y >= CP.y - FSizeY / 2) AND (y <= CP.y + FSizeY / 2) then
Result := True;
except
on E: Exception do addExceptionToLogEx('TPlanObject.IsPointIn', E.Message);
end;
end;
procedure TPlanObject.move(deltax, deltay: double);
var
i, j: integer;
JoinTrace: TPlanTrace;
JoinConn: TPlanConnector;
p1, p2: TDoublePoint;
OtherConn: TPlanConnector;
otherdeltax, otherdeltay: double;
begin
try
deltax := GetCoordXWithSnapToGrid(deltax);
deltay := GetCoordYWithSnapToGrid(deltay);
inherited;
for i := 0 to JoinedConnectors.Count - 1 do
begin
JoinConn := TPlanConnector(JoinedConnectors[i]);
JoinConn.move(deltax, deltay);
for j := 0 to JoinConn.JoinedTraces.Count - 1 do
begin
JoinTrace := TPlanTrace(JoinConn.JoinedTraces[j]);
if JoinTrace.JoinObject1 = JoinConn then
begin
p1 := DoublePoint(JoinTrace.ActualPoints[1].x - deltax, JoinTrace.ActualPoints[1].y - deltay);
p2 := DoublePoint(JoinTrace.ActualPoints[2].x, JoinTrace.ActualPoints[2].y);
if FMoveWithConnector then
begin
if CheckFigureByClassName(JoinTrace.JoinObject2, cTPlanConnector) then
begin
otherdeltax := deltax;
otherdeltay := deltay;
if abs(p1.x - p2.x) < 0.1 then
otherdeltay := 0;
if abs(p1.y - p2.y) < 0.1 then
otherdeltax := 0;
OtherConn := TPlanConnector(JoinTrace.JoinObject2);
OtherConn.Move(otherdeltax, otherdeltay);
end;
end;
end;
if JoinTrace.JoinObject2 = JoinConn then
begin
p1 := DoublePoint(JoinTrace.ActualPoints[1].x, JoinTrace.ActualPoints[1].y);
p2 := DoublePoint(JoinTrace.ActualPoints[2].x - deltax, JoinTrace.ActualPoints[2].y - deltay);
if FMoveWithConnector then
begin
if CheckFigureByClassName(JoinTrace.JoinObject1, cTPlanConnector) then
begin
otherdeltax := deltax;
otherdeltay := deltay;
if abs(p1.x - p2.x) < 0.1 then
otherdeltay := 0;
if abs(p1.y - p2.y) < 0.1 then
otherdeltax := 0;
OtherConn := TPlanConnector(JoinTrace.JoinObject1);
OtherConn.Move(otherdeltax, otherdeltay);
end;
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TPlanObject.move', E.Message);
end;
end;
procedure TPlanObject.RaiseProperties(CadFigList: TList);
var
i: integer;
Connector: TPlanConnector;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
//Tolik
// FiguresList := GCadForm.PCad.Figures;
FiguresList := CadFigList;
//
FMoveWithConnector := True;
for i := 0 to Length(FJoinedConnectorsIndexes) - 1 do
begin
Connector := TPlanConnector(FiguresList.Items[FJoinedConnectorsIndexes[i]]);
JoinedConnectors.Add(Connector);
end;
except
on E: Exception do addExceptionToLogEx('TPlanObject.RaiseProperties', E.Message);
end;
end;
procedure TPlanObject.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
FindCode: Integer;
xInt: Integer;
begin
try
inherited;
case xCode of
27: begin
xInt := pInt(data)^;
FFloorNumber := xInt;
end;
28: begin
xInt := pInt(data)^;
FCabNumber := xInt;
end;
29: begin
xInt := pInt(data)^;
FSCSID := xInt;
end;
230: FSizeX := pDouble(data)^;
231: FSizeY := pDouble(data)^;
end;
if (xCode >= 30) AND (xCode <= 60) then
begin
FindCode := Length(FJoinedConnectorsIndexes);
FindCode := FindCode + 1;
SetLength(FJoinedConnectorsIndexes, FindCode);
xInt := pInt(data)^;
FJoinedConnectorsIndexes[FindCode - 1] := xInt;
end;
if JoinedConnectors = nil then
JoinedConnectors := TList.Create;
except
on E: Exception do addExceptionToLogEx('TPlanObject.SetPropertyFromStream', E.Message);
end;
end;
procedure TPlanObject.WriteToStream(Stream: TStream);
var
i: integer;
xInt: Integer;
xDbl: Double;
xBool: Boolean;
FiguresList: TList;
begin
try
inherited;
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
xInt := FFloorNumber;
WriteField(27, Stream, xInt, sizeof(xInt));
xInt := FCabNumber;
WriteField(28, Stream, xInt, sizeof(xInt));
xInt := FSCSID;
WriteField(29, Stream, xInt, sizeof(xInt));
for i := 0 to JoinedConnectors.Count - 1 do
begin
xInt := FiguresList.IndexOf(JoinedConnectors[i]);
if ((30 + i) <= 60) then
WriteField(30 + i, Stream, xInt, sizeof(xInt))
end;
xDbl := FSizeX;
WriteField(230, Stream, xDbl, sizeof(xDbl));
xDbl := FSizeY;
WriteField(231, Stream, xDbl, sizeof(xDbl));
except
on E: Exception do addExceptionToLogEx('TPlanObject.WriteToStream', E.Message);
end;
end;
{ TPlanTrace }
constructor TPlanTrace.create(aX1, aY1, aX2, aY2: Double; w, s,
c, row, LHandle: Integer; aDrawStyle: TDrawStyle; aOwner: TComponent);
begin
try
inherited create(aX1, aY1, aX2, aY2, w, s, c, row, LHandle, aDrawStyle, aOwner);
// Tolik -- 23/02/2018 --
//JoinObject1 := TFigure.Create(LHandle, mydsNormal, aOwner);
//JoinObject2 := TFigure.Create(LHandle, mydsNormal, aOwner);
JoinObject1 := Nil;
JoinObject2 := Nil;
//
OriginalPoints[1] := DoublePoint(aX1,aY1);
OriginalPoints[2] := DoublePoint(aX2,aY2);
ActualPoints[1] := DoublePoint(aX1,aY1);
ActualPoints[2] := DoublePoint(aX2,aY2);
Caption := nil;
except
on E: Exception do addExceptionToLogEx('TPlanTrace.create', E.Message);
end;
end;
//Tolik 23/02/2018 --
destructor TPlanTrace.destroy;
begin
{
if Caption <> nil then
begin
if GCadForm.PCad.Figures.IndexOf(Caption) = -1 then
FreeAndNil(Caption);
end;
}
JoinObject1 := Nil;
JoinObject2 := Nil;
//TPlanConnector(JoinObject1).JoinedTraces.Remove(Self);
//TPlanConnector(JoinObject2).JoinedTraces.Remove(Self);
end;
function TPlanTrace.CreateModification: TFigure;
begin
try
Result := nil;
Result := TPlanTrace.Create(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y, 1, ord(psSolid), clBlack, 0, 0, dsTrace, nil);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.CreateModification', E.Message);
end;
end;
procedure TPlanTrace.Delete;
begin
try
if not Deleted then
begin
Deleted := true;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//Tolik 22/06/2021 --
if Caption <> nil then
begin
Caption.Deleted := True;
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
end;
//
end;
TPlanConnector(JoinObject1).JoinedTraces.Remove(Self);
TPlanConnector(JoinObject2).JoinedTraces.Remove(Self);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.Delete', E.Message);
end;
end;
procedure TPlanTrace.Draw(DEngine: TPCDrawEngine; isFlue: Boolean);
var
x1, x2, y1, y2: Double;
points: array[0..1] of TDoublePoint;
Conn1, Conn2: TPlanConnector;
begin
try
If Deleted then
Exit;
if (DrawStyle = dsTrace) then
begin
DEngine.Canvas.Pen.Mode := pmXor;
DEngine.Canvas.Pen.Color := clBlue xor clWhite;
DEngine.Canvas.Pen.Style := psDash;
DEngine.Canvas.Pen.Width := 2;
DEngine.Canvas.Brush.Style := bsClear;
DEngine.Canvas.Brush.Color := clBlack;
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
RowStyle := ord(rsNone);
end
else
begin
DEngine.Canvas.Pen.Mode := pmCopy;
DEngine.Canvas.Pen.Color := color;
DEngine.Canvas.Pen.Width := width;
DEngine.Canvas.Pen.Style := TPenStyle(style);
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
Conn1 := TPlanConnector(JoinObject1);
Conn2 := TPlanConnector(JoinObject2);
RowStyle := ord(rsNone);
if ((Conn1 <> nil) and (Conn2 <> nil)) and (SCSClassDetect(Conn1) and SCSClassDetect(Conn2)) then
begin
if (Conn1.JoinedPlanObject <> nil) and (Conn2.JoinedPlanObject = nil) then
RowStyle := ord(rsLeftSolid);
if (Conn1.JoinedPlanObject = nil) and (Conn2.JoinedPlanObject <> nil) then
RowStyle := ord(rsRightSolid);
if (Conn1.JoinedPlanObject <> nil) and (Conn2.JoinedPlanObject <> nil) then
RowStyle := ord(rsBothSolid);
end;
if Selected then
begin
DEngine.Canvas.Pen.Width := 2;
DEngine.Canvas.Pen.Style := psSolid;
DEngine.Canvas.Pen.Color := clYellow;
end;
end;
points[0].x := x1;
points[0].y := y1;
points[1].x := x2;
points[1].y := y2;
DEngine.drawline(points[0], points[1], ord(DEngine.Canvas.Pen.Color), DEngine.Canvas.Pen.Width, Style, ord(RowStyle), rowL, rowH, rowWhite);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.Draw', E.Message);
end;
end;
procedure TPlanTrace.GetModPoints(ModList: TMyList);
begin
// inherited;
end;
function TPlanTrace.isPointIn(x, y: Double): boolean;
var
x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6: Double;
len, f, Gap2: Extended;
RegHandle: HRGN;
Points: array[0..4] of TPoint;
BasisPoints: TDoublePoint;
begin
try
Result := false;
x1 := ActualPoints[1].x;
y1 := ActualPoints[1].y;
x2 := ActualPoints[2].x;
y2 := ActualPoints[2].y;
Gap2 := 0.5;
len := sqrt(sqr(x1 - x2) + sqr(y1 - y2));
if len = 0 then
len := 0.001;
f := arcsin((abs(y1 - y2) / len)) * 180 / pi;
if ((x1 < x2) and (y1 > y2)) or ((x1 > x2) and (y1 < y2)) then
f := f * (-1);
try
x3 := Gap2 * cos((f - 90) * pi / 180) + x1;
y3 := Gap2 * sin((f - 90) * pi / 180) + y1;
x4 := Gap2 * cos((f + 90) * pi / 180) + x1;
y4 := Gap2 * sin((f + 90) * pi / 180) + y1;
x5 := Gap2 * cos((f - 90) * pi / 180) + x2;
y5 := Gap2 * sin((f - 90) * pi / 180) + y2;
x6 := Gap2 * cos((f + 90) * pi / 180) + x2;
y6 := Gap2 * sin((f + 90) * pi / 180) + y2;
except
Result := false;
Exit;
end;
Points[0].x := round(x3 * 100);
Points[0].y := round(y3 * 100);
Points[1].x := round(x5 * 100);
Points[1].y := round(y5 * 100);
Points[2].x := round(x6 * 100);
Points[2].y := round(y6 * 100);
Points[3].x := round(x4 * 100);
Points[3].y := round(y4 * 100);
RegHandle := CreatePolygonRgn(Points, 4, WINDING);
result := PtInRegion(RegHandle, round(x * 100), round(y * 100));
DeleteObject(RegHandle);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.isPointIn', E.Message);
end;
end;
procedure TPlanTrace.Move(deltax, deltay: Double);
begin
try
if DrawStyle = dsTrace then
begin
if abs(ActualPoints[1].x - ActualPoints[2].x) < 0.1 then
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y);
ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y);
end
else
if abs(ActualPoints[1].y - ActualPoints[2].y) < 0.1 then
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x, ActualPoints[1].y + deltay);
ActualPoints[2] := DoublePoint(ActualPoints[2].x, ActualPoints[2].y + deltay);
end
else
begin
ActualPoints[1] := DoublePoint(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
ActualPoints[2] := DoublePoint(ActualPoints[2].x + deltax, ActualPoints[2].y + deltay);
end;
end
else
begin
if abs(ActualPoints[1].x - ActualPoints[2].x) < 0.1 then
deltay := 0
else
if abs(ActualPoints[1].y - ActualPoints[2].y) < 0.1 then
deltax := 0;
if not JoinObject1.Selected then
TPlanConnector(JoinObject1).Move(deltax, deltay);
if not JoinObject2.Selected then
TPlanConnector(JoinObject2).Move(deltax, deltay);
end;
except
on E: Exception do addExceptionToLogEx('TPlanTrace.Move', E.Message);
end;
end;
procedure TPlanTrace.RaiseProperties(CadFigList: TList);
var
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
//Tolik
// FiguresList := GCadForm.PCad.Figures;
FiguresList := CadfigList;
//
SetJConnector1(FiguresList.Items[FJoinObject1Index]);
SetJConnector2(FiguresList.Items[FJoinObject2Index]);
if FCaptionIndex = - 1 then
Caption := Nil
else
Caption := TRichText(FiguresList.Items[FCaptionIndex]);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.RaiseProperties', E.Message);
end;
end;
procedure TPlanTrace.SetJConnector1(aObject: TFigure);
begin
try
if CheckFigureByClassName(aObject, cTPlanConnector) then
begin
JoinObject1 := aObject;
TPlanConnector(aObject).JoinedTraces.Add(Self);
end;
except
on E: Exception do addExceptionToLogEx('TPlanTrace.SetJConnector1', E.Message);
end;
end;
procedure TPlanTrace.SetJConnector2(aObject: TFigure);
begin
try
if CheckFigureByClassName(aObject, cTPlanConnector) then
begin
JoinObject2 := aObject;
TPlanConnector(aObject).JoinedTraces.Add(Self);
end;
except
on E: Exception do addExceptionToLogEx('TPlanTrace.SetJConnector2', E.Message);
end;
end;
procedure TPlanTrace.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
var
xInt: integer;
xStr: string;
DataP: PChar;
begin
try
inherited;
case xCode of
29: begin
xInt := pInt(data)^;
FCaptionIndex := xInt;
end;
30: begin
xInt := pInt(data)^;
FJoinObject1Index := xInt;
end;
31: begin
xInt := pInt(data)^;
FJoinObject2Index := xInt;
end;
32: begin
xInt := pInt(data)^;
FBegSCSID := xInt;
end;
33: begin
xInt := pInt(data)^;
FEndSCSID := xInt;
end;
215: begin
DataP := data;
xStr := DataP;
FBegType := xStr;
end;
216: begin
DataP := data;
xStr := DataP;
FEndType := xStr;
end;
end;
except
on E: Exception do addExceptionToLogEx('TPlanTrace.SetPropertyFromStream', E.Message);
end;
end;
procedure TPlanTrace.WriteToStream(Stream: TStream);
var
xInt: Integer;
xStr: string;
FiguresList: TList;
begin
try
inherited;
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
if Caption <> nil then
begin
xInt := FiguresList.IndexOf(Caption);
WriteField(29, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(29, Stream, xInt, sizeof(xInt));
end;
if JoinObject1 <> nil then
begin
xInt := FiguresList.IndexOf(JoinObject1);
WriteField(30, Stream, xInt, sizeof(xInt));
end;
if JoinObject2 <> nil then
begin
xInt := FiguresList.IndexOf(JoinObject2);
WriteField(31, Stream, xInt, sizeof(xInt));
end;
xInt := FBegSCSID;
WriteField(32, Stream, xInt, sizeof(xInt));
xInt := FEndSCSID;
WriteField(33, Stream, xInt, sizeof(xInt));
xStr := FBegType;
WriteStrField(215, Stream, xStr);
xStr := FEndType;
WriteStrField(216, Stream, xStr);
except
on E: Exception do addExceptionToLogEx('TPlanTrace.WriteToStream', E.Message);
end;
end;
{ TPlanConnector }
constructor TPlanConnector.Create(aX, aY, aZ: Double; LHandle: Longint; aDrawStyle: TDrawStyle; aOwner: TComponent);
begin
try
inherited Create(aX, aY, aZ, LHandle, aDrawStyle, aOwner);
JoinedTraces := TList.Create;
SetLength(FJoinedTracesIndexes, 0);
// Tolik 23/02/2018 - -
JoinedPlanObject := Nil;
//
except
on E: Exception do addExceptionToLogEx('TPlanConnector.Create', E.Message);
end;
end;
// Tolik -- 23/02/2018 --
destructor TPlanConnector.destroy;
begin
setLength(FJoinedTracesIndexes, 0);
JoinedTraces.Clear;
JoinedTraces.Free;
JoinedTraces := Nil;
if JoinedPlanObject <> nil then
begin
if Assigned(JoinedPlanObject.JoinedConnectors) then
JoinedPlanObject.JoinedConnectors.Remove(Self);
JoinedPlanObject := nil;
end;
inherited;
end;
//
procedure TPlanConnector.Delete;
var
i, j: Integer;
JoinTrace: TPlanTrace;
begin
try
if not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
i := 0;
while i < JoinedTraces.Count do
begin
TPlanTrace(JoinedTraces[i]).Delete;
end;
if JoinedPlanObject <> nil then
JoinedPlanObject.JoinedConnectors.Remove(Self);
end;
setLength(FJoinedTracesIndexes, 0);
except
on E: Exception do addExceptionToLogEx('TPlanConnector.Delete', E.Message);
end;
end;
function TPlanConnector.IsPointIn(x, y: Double): Boolean;
begin
try
Result := False;
if (x >= ActualPoints[1].x - 0.5) and (x <= ActualPoints[1].x + 0.5) and (y >= ActualPoints[1].y - 0.5) AND (y <= ActualPoints[1].y + 0.5) then
Result := True;
except
on E: Exception do addExceptionToLogEx('TPlanConnector.IsPointIn', E.Message);
end;
end;
procedure TPlanConnector.move(deltax, deltay: double);
var
i: integer;
CurTrace: TPlanTrace;
JoinConn: TConnectorObject;
NeedPoints: TDoublePoint;
TraceCP: TDoublePoint;
MvAngle: Double;
Bnd: TDoubleRect;
h: double;
CurAngle: double;
begin
try
NeedPoints := GetCoordsWithSnapToGrid(ActualPoints[1].x + deltax, ActualPoints[1].y + deltay);
ActualPoints[1] := DoublePoint(NeedPoints.x, NeedPoints.y);
for i := 0 to JoinedTraces.Count - 1 do
begin
CurTrace := TPlanTrace(JoinedTraces[i]);
if CurTrace.JoinObject1 = Self then
begin
CurTrace.ActualPoints[1] := DoublePoint(NeedPoints.x, NeedPoints.y);
end;
if CurTrace.JoinObject2 = Self then
begin
CurTrace.ActualPoints[2] := DoublePoint(NeedPoints.x, NeedPoints.y);
end;
//
if CurTrace.Caption <> nil then
begin
TraceCP.x := (CurTrace.ActualPoints[1].x + CurTrace.ActualPoints[2].x) / 2;
TraceCP.y := (CurTrace.ActualPoints[1].y + CurTrace.ActualPoints[2].y) / 2;
CurAngle := CurTrace.Caption.AngletoPoint;
CurTrace.Caption.Rotate( - CurAngle, CurTrace.Caption.CenterPoint);
CurTrace.Caption.Move(TraceCP.x - CurTrace.Caption.CenterPoint.x, TraceCP.y - CurTrace.Caption.CenterPoint.y);
Bnd := CurTrace.Caption.GetBoundRect;
h := abs(Bnd.Bottom - Bnd.Top);
CurTrace.Caption.Move(0, - h / 2);
MvAngle := GetPlanTraceAngle(CurTrace.ActualPoints[1], CurTrace.ActualPoints[2]);
MvAngle := MvAngle * pi / 180;
CurTrace.Caption.Rotate(MvAngle, CurTrace.Caption.CenterPoint);
end;
end;
except
on E: Exception do addExceptionToLogEx('TPlanConnector.move', E.Message);
end;
end;
procedure TPlanConnector.RaiseProperties(CadFigList: TList);
var
i: integer;
Trace: TPlanTrace;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
//Tolik
// FiguresList := GCadForm.PCad.Figures;
FiguresList := CadFigList;
//
if FJoinedPlanObjectIndex = - 1 then
begin
JoinedPlanObject := Nil;
end
else
begin
JoinedPlanObject := TPlanObject(FiguresList.Items[FJoinedPlanObjectIndex]);
LockMove := True;
LockModify := True;
LockSelect := True;
end;
except
on E: Exception do addExceptionToLogEx('TPlanConnector.RaiseProperties', E.Message);
end;
end;
procedure TPlanConnector.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
FindCode: Integer;
xInt: Integer;
xStr: string;
DataP: PChar;
begin
try
inherited;
case xCode of
61: begin
xInt := pInt(data)^;
FBegSCSID := xInt;
end;
62: begin
xInt := pInt(data)^;
FEndSCSID := xInt;
end;
63: begin
xInt := pInt(data)^;
FJoinedPlanObjectIndex := xInt;
end;
215: begin
DataP := data;
xStr := DataP;
FBegType := xStr;
end;
216: begin
DataP := data;
xStr := DataP;
FEndType := xStr;
end;
end;
if (xCode >= 65) AND (xCode <= 80) then
begin
FindCode := Length(FJoinedTracesIndexes);
FindCode := FindCode + 1;
SetLength(FJoinedTracesIndexes, FindCode);
xInt := pInt(data)^;
FJoinedTracesIndexes[FindCode - 1] := xInt;
end;
if JoinedTraces = nil then
JoinedTraces := TList.Create;
except
on E: Exception do addExceptionToLogEx('TPlanConnector.SetPropertyFromStream', E.Message);
end;
end;
procedure TPlanConnector.WriteToStream(Stream: TStream);
var
i: integer;
xInt: Integer;
xStr: string;
FiguresList: TList;
begin
try
inherited;
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
xInt := FBegSCSID;
WriteField(61, Stream, xInt, sizeof(xInt));
xInt := FEndSCSID;
WriteField(62, Stream, xInt, sizeof(xInt));
if JoinedPlanObject <> nil then
begin
xInt := FiguresList.IndexOf(JoinedPlanObject);
WriteField(63, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(63, Stream, xInt, sizeof(xInt));
end;
for i := 0 to JoinedTraces.Count - 1 do
begin
xInt := FiguresList.IndexOf(JoinedTraces[i]);
if ((65 + i) <= 80) then
WriteField(65 + i, Stream, xInt, sizeof(xInt));
end;
xStr := FBegType;
WriteStrField(215, Stream, xStr);
xStr := FEndType;
WriteStrField(216, Stream, xStr);
except
on E: Exception do addExceptionToLogEx('TPlanConnector.WriteToStream', E.Message);
end;
end;
{ TCabinet }
constructor TCabinet.create(aX1, aY1, aX2, aY2: Double; w, s, c, abrs,
abrc, LHandle: Integer; aDrawStyle: TDrawStyle; aOwner: TComponent);
var
p: TDoublePoint;
begin
try
inherited create(aX1, aY1, aX2, aY2, w, s, c, abrs, abrc, LHandle, aDrawStyle, aOwner);
FSCSID := -1;
FIndex := -1;
FType := ct_Virtual;
FNumberObject := nil;
FNumberObjectIndex := -1;
//Tolik
FCabinetSquare := -1;
//
Visible := False;
if aDrawStyle <> dsTrace then
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
CabinetConfig.aWorkRoom := true;
CabinetConfig.NumRadius := 3;
except
on E: Exception do addExceptionToLogEx('TCabinet.create', E.Message);
end;
end;
class function TCabinet.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
var
ObjParams: TObjectParams;
GetSCSID, GetIndex: Integer;
begin
try
// ñîçäàíèå ñ òóëñû íà ïàíåëè ÊÀÄ
// *UNDO*
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
Result := nil;
Result := TCabinet.Create(Shadow.ActualPoints[1].x, Shadow.ActualPoints[1].y, Shadow.ActualPoints[3].x, Shadow.ActualPoints[3].y,
2, ord(psSolid), clMaroon, ord(bsClear), clBlack, LHandle, mydsNormal, aOwner);
TCabinet(Result).FType := ct_Visual;
ObjParams := CreateRoomFromCADToPM(GCadForm.FCADListID);
GetSCSID := ObjParams.ID;
GetIndex := ObjParams.MarkID;
TCabinet(Result).FSCSID := GetSCSID;
TCabinet(Result).ID := GetSCSID;//08.11.2011
TCabinet(Result).FIndex := GetIndex;
TCabinet(Result).FNumberObject := CreateNumberObjectOnCAD(TCabinet(Result), GCadForm.FShowCabinetsNumbers);
TCabinet(Result).FNumberObject.IsCabinetExt := false;
TCabinet(Result).FNumberObject.FPositionIndex := 4;
TCabinet(Result).FNumberObject.CircleRadius := 3;
//Tolik
TCabinet(Result).FCabinetSquare := -1;
//
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Result, False);
GCadForm.AddSCSFigure(Result); //08.11.2011
TCabinet(Result).FNumberObject.Draw(GCadForm.PCad.DEngine, false);
MoveObjectsToCabinetOnCreate(TCabinet(Result));
if GCadForm.FShowCabinetsBounds then
TCabinet(Result).Visible := True;
Result := nil;
// *UNDO*
GCadForm.FCanSaveForUndo := True;
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TCabinet.CreateFromShadow', E.Message);
end;
end;
procedure TCabinet.Delete;
var
aFigure: TFigure;
j: Integer;
begin
try
if not Self.Deleted then
begin
if Owner <> nil then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
if FNumberObject <> nil then
FNumberObject.Delete;
//Ïðîâåðêà ôèãóðû íà âõîæäåíèå â êàáèíåò
GCadForm.UpdateCheckedFigures;
for j := 0 to GCadForm.FCheckedFigures.Count - 1 do
begin
aFigure := TFigure(GCadForm.FCheckedFigures[j]);
GCadForm.Pcad.CheckFigureInsideCabinet(GCadForm.FCheckedFigures, aFigure);
end;
end;
except
on E: Exception do addExceptionToLogEx('TCabinet.Delete', E.Message);
end;
end;
procedure TCabinet.Draw(DEngine: TPCDrawEngine; isFlue: Boolean);
var
CabCP: TDoublePoint;
CabCP2: TDoublePoint;
aHRGN: HRGN;
aFont: TFont;
SCSList: TSCSList;
RoomObject: TSCSCatalog;
aText: string;
xCanvas: TMetafileCanvas;
h, w: double;
aFontSize: integer;
aFontName: string;
begin
try
if fType = ct_Visual then
if Visible then
begin
aText := '';
SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(Owner).Owner).FCADListID);
if SCSList <> nil then
begin
RoomObject := SCSList.GetCatalogFromReferencesBySCSID(self.FSCSID);
if RoomObject <> nil then
aText := RoomObject.NameShort;
end;
if aText <> '' then
begin
aFont := TFont.Create;
aFont.Name := TF_CAD(TPowerCad(Owner).Owner).PCad.Font.Name; //TF_CAD(TPowerCad(Owner).Owner).Font.Name;
aFont.Size := 10;
aFont.color := clMaroon; //clBlack;
aFontSize := aFont.Size;
aFontName := aFont.Name;
GetTextSize(aFontSize, [], aFontName, aText, nil, h, w);
// çàâèñèìîñòè îò ïîëîæåíèÿ âûñ÷èòûâàåì íîâûå êîîðäèíàòû
Case Self.CabinetConfig.CabinetSignPos of
1:
begin
//Âåðõíèé ïðàâûé
CabCP.x := (self.ActualPoints[1].x + self.ActualPoints[3].x) / 2;
CabCP.x := CabCP.x + Abs(self.ActualPoints[1].x - self.ActualPoints[3].x) / 2 - 1 - w * 1.3;
//CabCP.x := CabCP.x + Abs(self.ActualPoints[1].x - self.ActualPoints[3].x) / 2 - 2.4 - 1.1*(length(aText) - 1);
CabCP.y := (self.ActualPoints[1].y + self.ActualPoints[3].y) / 2;
CabCP.y := CabCP.y - Abs(self.ActualPoints[1].y - self.ActualPoints[3].y) / 2 + h / 2 - 1;
//CabCP.y := CabCP.y - Abs(self.ActualPoints[1].y - self.ActualPoints[3].y) / 2 + 1.3;
CabCP2.x := CabCP.x + w;
CabCP2.y := CabCP.y + h;
//CabCP2.x := CabCP.x + 3;
//CabCP2.y := CabCP.y + 3;
end;
2:
begin
//Âåðõíèé ëåâûé
CabCP.x := (self.ActualPoints[1].x + self.ActualPoints[3].x) / 2;
CabCP.x := CabCP.x - Abs(self.ActualPoints[1].x - self.ActualPoints[3].x) / 2 + 1 + w * 1.3;
CabCP.y := (self.ActualPoints[1].y + self.ActualPoints[3].y) / 2;
CabCP.y := CabCP.y - Abs(self.ActualPoints[1].y - self.ActualPoints[3].y) / 2 + h / 2 - 1;
CabCP2.x := CabCP.x - w;
CabCP2.y := CabCP.y + h;
end;
3:
begin
//Íèæíèé ïðàâûé
CabCP.x := (self.ActualPoints[1].x + self.ActualPoints[3].x) / 2;
CabCP.x := CabCP.x + Abs(self.ActualPoints[1].x - self.ActualPoints[3].x) / 2 - 1 - w * 1.3;
CabCP.y := (self.ActualPoints[1].y + self.ActualPoints[3].y) / 2;
CabCP.y := CabCP.y + Abs(self.ActualPoints[1].y - self.ActualPoints[3].y) / 2 - h / 2 + 1;
CabCP2.x := CabCP.x + w;
CabCP2.y := CabCP.y - h/2;
end;
4:
begin
//Íèæíèé ëåâûé
CabCP.x := (self.ActualPoints[1].x + self.ActualPoints[3].x) / 2;
CabCP.x := CabCP.x - Abs(self.ActualPoints[1].x - self.ActualPoints[3].x) / 2 + 1 + w * 1.3;
CabCP.y := (self.ActualPoints[1].y + self.ActualPoints[3].y) / 2;
CabCP.y := CabCP.y + Abs(self.ActualPoints[1].y - self.ActualPoints[3].y) / 2 - h / 2 + 1;
CabCP2.x := CabCP.x - w;
CabCP2.y := CabCP.y - h/2;
end;
end;
//DEngine.DrawLabel(CabCP, CabCP2, aText, aFont, 3, clNone, 3, ord(psClear), clNone, ord(bsClear), aHRGN);
if Self.CabinetConfig.CabinetSignPos > 0 then
DEngine.DrawLabel(CabCP, CabCP2, aText, aFont, h, clNone, RoundUp(w), ord(psClear), clNone, ord(bsClear), aHRGN);
if aHRGN <> 0 then
DeleteObject(aHrgn);
FreeAndNil(aFont);
end;
inherited;
end;
except
on E: Exception do addExceptionToLogEx('TCabinet.Draw', E.Message);
end;
end;
function TCabinet.Edit: Boolean;
begin
Result := False;
ShowRoomPropsInCAD(GCadForm.FCADListID, FSCSID);
// SetCabinetFalseFloor(Self);
end;
function TCabinet.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): boolean;
var
CP: TDoublePoint;
begin
try
Result := false;
Result := inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
if FNumberObject <> nil then
begin
CP.x := (ActualPoints[1].x + ActualPoints[3].x) / 2;
CP.y := (ActualPoints[1].y + ActualPoints[3].y) / 2;
FNumberObject.move(CP.x - FNumberObject.CenterPoint.x, CP.y - FNumberObject.CenterPoint.y);
end;
MoveObjectsToCabinetOnMove(Self);
except
on E: Exception do addExceptionToLogEx('TCabinet.EndModification', E.Message);
end;
end;
function TCabinet.isPointIn(x, y: Double): boolean;
begin
try
Result := False;
if Visible then
Result := inherited isPointIn(x, y);
except
on E: Exception do addExceptionToLogEx('TCabinet.isPointIn', E.Message);
end;
end;
function TCabinet.isPointInMod(x, y: Double): boolean;
var
MinX, MinY, MaxX, MaxY: double;
ActualArrayX: array of Double;
ActualArrayY: array of Double;
begin
try
Result := False;
SetLength(ActualArrayX, 4);
SetLength(ActualArrayY, 4);
ActualArrayX[0] := ActualPoints[1].x;
ActualArrayX[1] := ActualPoints[2].x;
ActualArrayX[2] := ActualPoints[3].x;
ActualArrayX[3] := ActualPoints[4].x;
ActualArrayY[0] := ActualPoints[1].y;
ActualArrayY[1] := ActualPoints[2].y;
ActualArrayY[2] := ActualPoints[3].y;
ActualArrayY[3] := ActualPoints[4].y;
MinX := MinValue(ActualArrayX);
MaxX := MaxValue(ActualArrayX);
MinY := MinValue(ActualArrayY);
MaxY := MaxValue(ActualArrayY);
// Tolik
SetLength(ActualArrayX, 0);
SetLength(ActualArrayY, 0);
//
if (x >= MinX) and (x <= MaxX) and (y >= MinY) AND (y <= MaxY) then
Result := True;
except
on E: Exception do addExceptionToLogEx('TCabinet.isPointInMod', E.Message);
end;
end;
procedure TCabinet.Move(deltax, deltay: Double);
begin
try
inherited;
if FNumberObject <> nil then
if not FNumberObject.Selected then
FNumberObject.move(deltax, deltay);
MoveObjectsToCabinetOnMove(Self);
except
on E: Exception do addExceptionToLogEx('TCabinet.Move', E.Message);
end;
end;
procedure TCabinet.RaiseProperties(CadFigList: TList);
var
LHandle9: Integer;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
//Tolik
// FiguresList := GCadForm.PCad.Figures;
FiguresList := CadFigList;
//
if FNumberObjectIndex = - 1 then
FNumberObject := Nil
else
begin
FNumberObject := TCabinetNumber(FiguresList.Items[FNumberObjectIndex]);
FNumberObject.Visible := CabinetConfig.aWorkRoom;
FNumberObject.CircleRadius := CabinetConfig.NumRadius;
FNumberObject.IsCabinetExt := false;
FNumberObject.FPositionIndex := CabinetConfig.CabinetNumPos;
end;
Visible := False;
// åñëè íà ñòàðîì ñëîå - ïåðåíåñòè íà íîâûé
LHandle9 := GCadForm.PCad.GetLayerHandle(9);
if LayerHandle <> LHandle9 then
begin
LayerHandle := LHandle9;
if FNumberObject <> nil then
FNumberObject.LayerHandle := LHandle9;
end;
except
on E: Exception do addExceptionToLogEx('TCabinet.RaiseProperties', E.Message);
end;
end;
procedure TCabinet.select;
begin
try
if fType = ct_Visual then
if Visible then
inherited;
except
on E: Exception do addExceptionToLogEx('TCabinet.select', E.Message);
end;
end;
procedure TCabinet.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
var
xInt: Integer;
xBool: Boolean;
xDbl: Double;
begin
try
inherited;
case xCode of
30: begin
xInt := pInt(data)^;
FSCSID := xInt;
FFalseFloorHeight := GCadForm.FFalseFloorHeight;
ID := xInt; //08.11.2011
if ID <> 0 then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).AddSCSFigure(Self);
end;
31: begin
xInt := pInt(data)^;
FIndex := xInt;
end;
32: begin
xInt := pInt(data)^;
FType := TCabinetType(xInt);
end;
33: begin
xInt := pInt(data)^;
FNumberObjectIndex := xInt;
end;
230:begin
xDbl := pDouble(data)^;
FFalseFloorHeight := xDbl;
end;
240:begin
CabinetConfig := ProomConfig(data)^;
end;
241:begin
xDbl := pDouble(data)^;
FCabinetSquare := xDbl;
end;
end;
TF_CAD(TPowerCad(Owner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TCabinet.SetPropertyFromStream', E.Message);
end;
end;
procedure TCabinet.WriteToStream(Stream: TStream);
var
xInt: Integer;
xBool: Boolean;
xDbl: Double;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
inherited;
xInt := FSCSID;
WriteField(30, Stream, xInt, sizeof(xInt));
xInt := FIndex;
WriteField(31, Stream, xInt, sizeof(xInt));
xInt := Ord(FType);
WriteField(32, Stream, xInt, sizeof(xInt));
if FNumberObject <> nil then
begin
xInt := FiguresList.IndexOf(FNumberObject);
WriteField(33, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(33, Stream, xInt, sizeof(xInt));
end;
xDbl := FFalseFloorHeight;
WriteField(230, Stream, xDbl, sizeof(xDbl));
WriteField(240, Stream, CabinetConfig, sizeof(CabinetConfig));
//Tolik
WriteField(241, Stream, FCabinetSquare, sizeof(FCabinetSquare));
//
except
on E: Exception do addExceptionToLogEx('TCabinet.WriteToStream', E.Message);
end;
end;
procedure TCabinet.Initialize;
begin
inherited;
FClassIndex := ciCabinet;
cabinetconfig.aWorkRoom := true;
cabinetconfig.IsCabinetExt := False;
cabinetconfig.POintCount := Self.PointCount;
CabinetConfig.CabinetNumPos := 4;
CabinetConfig.CabinetSignPos := 1;
CabinetConfig.NumRadius := 3;
FCabinetSquare := -1;
end;
{ TCabinetNumber }
procedure TCabinetNumber.Delete;
begin
try
if not Deleted then
begin
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
end;
except
on E: Exception do addExceptionToLogEx('TCabinetNumber.Delete', E.Message);
end;
end;
Function GetCabinetByNumber(Form: TF_Cad; CabinetID: Integer): TObject;
var i: Integer;
begin
Result := nil;
if Form.FNeedUpdateCheckedFigures then
Form.UpdateCheckedFigures;
for i := 0 to Form.FCheckedFigures.Count - 1 do
begin
if TObject(Form.FCheckedFigures[i]).ClassName = 'TCabinet' then
begin
if TCabinet(Form.FCheckedFigures[i]).FSCSID = CabinetID then
begin
result := TCabinet(Form.FCheckedFigures[i]);
break;
end;
end
else
if TObject(Form.FCheckedFigures[i]).ClassName = 'TCabinetExt' then
begin
if TCabinetExt(Form.FCheckedFigures[i]).FSCSID = CabinetID then
begin
result := TCabinetExt(Form.FCheckedFigures[i]);
break;
end;
end;
end;
end;
procedure TCabinetNumber.Draw(DEngine: TPCDrawEngine; isFlue: Boolean);
var
DeltaX, DeltaY: Double;
CabObj: TObject;
ConnPoint: TDoublePoint;
MaxX, MaxY, MinX, MinY: Double;
//Tolik
NumberRadius: Double;
LenX, LenY: Double;
RadiusNumber: Integer;
CenX, CenY: Double;
LayerHandle : Integer;
// 02/11/2016--
DoubleRad: Double;
TempCapt: TRichText;
Procedure ChangeFontSizeToCircle;
var i, CurrFontSize: Integer;
OldStrings: TStringList;
TempCapt: TRichText;
FontName: string;
DoubleRad: Double;
CabCaption: String;
Delta: Double;
begin
TempCapt := nil;
TempCapt := TRichTextMod(Self.InFigures[1]);
TempCapt.getbounds(MaxX, MinY, MinX, MaxY);
GetTextSize(TRichText(Self.InFigures[1]).re.font.Size, [], TRichText(Self.InFigures[1]).re.font.Name, '', TRichText(Self.InFigures[1]).re.Lines, LenY{h}, LenX{w});
NumberRadius := Sqrt(Sqr(LenX) + Sqr(LenY))/2;
DoubleRad := Double((TCircle(Self.InFigures[0]).Radius ));
if NumberRadius > 0 then
begin
//if (Round(NumberRadius) > (TCircle(Self.InFigures[0]).Radius )) then
if NumberRadius > DoubleRad then // òàê òî÷íåå
begin
if TRichText(Self.InFigures[1]).re.font.size > 2 then
begin
OldStrings := TStringList.Create;
//ÄÀííûå ñîõðàíÿåì
for i := 0 to TRichText(Self.InFigures[1]).re.Lines.Count - 1 do
begin
OldStrings.Add(TRichText(Self.InFigures[1]).re.Lines[i]);
end;
TempCapt := TRichText(Self.InFigures[1]);
CurrFontSize := TRichText(Self.InFigures[1]).re.font.size - 1;
FontName := TempCapt.re.Font.Name;
// óäàëÿåì èç ñïèñêà ôèãóð íîìåðà
Self.Infigures.delete(1);
//îáúåêò óáèâàåì
GCadForm.PCad.Figures.Remove(TempCapt);
FreeAndNil(TempCapt);
// è ïåðåñîçäàåì
if not IsCabinetExt then
LayerHandle := TCabinet(cabObj).LayerHandle
else
LayerHandle := TCabinetExt(CabObj).LayerHandle;
// îïðåäåëÿåì íîâûå ðàçìåðû íàäïèñè
GetTextSize(CurrFontSize, [], FontName, '', OldStrings, LenY{h}, LenX{w});
// ñîçäàåì
TempCapt := TRichText.create(-100, -100, -100 + LenX{w}, -100 + LenY{h}, 1, ord(psSolid), clMaroon, ord(bsClear), clNone,
LayerHandle, mydsNormal, GCadForm.PCad);
// âîçâðàøàåì êàê áûëî
TempCapt.re.Font.Name := FontName;
TempCapt.re.Font.Size := CurrFontSize;
TempCapt.re.Font.Color := clMaroon;
TempCapt.re.Lines.Clear;
// ïîäïèñè âîçâðàùàåì
for i := 0 to OldStrings.Count - 1 do
begin
OldStrings[i] := FastReplace(OldStrings[i],#13#10,' ');
TempCapt.re.Lines.Add(OldStrings[i]);
end;
FreeAndNil(oldStrings);
// âûñòàâëÿåì ðàçìåð øðèôòà
CabCaption := TempCapt.re.Lines[0];
TempCapt.re.Lines.Clear;
TempCapt.re.font.size := CurrFontSize;
CabCaption := FastReplace(CabCaption,#13#10,' ');
TempCapt.re.Lines.Add(CabCaption);
// öåíòð
CenX := (TempCapt.ap1.x + TempCapt.ap3.x)/2;
CenY := (TempCapt.ap1.Y + TempCapt.ap3.Y)/2;
// ñäâèãàåì îòíîñèòåëüíî êðóãà (â öåíòð)
TempCapt.Move(TCircle(Self.InFigures[0]).CenterPoint.x - CenX,
TCircle(Self.InFigures[0]).CenterPoint.y - CenY + 0.5);
// äîáàâëÿåì â ãðóïïó íîìåðà êàáèíåòà (ëîæèì òóäà, ãäå âçÿëè)
if infigures.count > 1 then
inFigures.Insert(1,TempCapt)
else
inFigures.Add(TempCapt);
// è òàê ïî êðóãó, ïîêà íå ïîëó÷èòñÿ ÎÊ
ChangeFontSizeToCircle;
end;
end;
end;
end;
begin
try
if Visible then
begin
//Tolik
// êàáèíåò, êîòîðîìó ïðèíàäëåæèò íîìåð
CabObj := GetCabinetByNumber(TF_CAD(TPowerCad(Owner).Owner), FCabinetID);
if CabObj = nil then
exit;
TCircle(Self.InFigures[0]).Radius := CircleRadius + 2;
{if CircleRadius = 0 then
TRichText(Self.InFigures[1]).re.font.size := 10
else
TRichText(Self.InFigures[1]).re.font.size := 12;
TRichText(Self.InFigures[1]).Move(TCircle(Self.InFigures[0]).CenterPoint.x - TRichText(Self.InFigures[1]).CenterPoint.x,
TCircle(Self.InFigures[0]).CenterPoint.y - TRichText(Self.InFigures[1]).CenterPoint.y);}
if not IsCabinetExt then
begin
// Tolik
// !!!!!!!!!!! ÂÀÆÍÎ !!!!!
// ïðè îòðèñîâêå íîìåðà êàáèíåòà íåëüçÿ ïðèâÿçûâàòüñÿ ê ïîèíòàì, òàê êàê ïîëüçîâàòåëü ìîæåò íà÷àòü ðèñîâàòü
// êàáèíåò íå ñ ëåâîãî âåðõíåãî óãëà, à, äîïóñòèì, ñ íèæíåãî ëåâîãî èëè âåðõíåãî ïðàâîãî èëè ïðàâîãî íèæíåãî è òîãäà ïîðÿäîê
// êîîðäèíàò áóäåò íå òàêèì, êàê ïðåäïîëàãàëîñü â ðàñ÷åòàõ, ïîýòîìó çäåñü íóæíî áðàòü ãðàíèöû ïðÿìîóãîëüíèêà è ïðîèçâîäèòü
// âû÷èñëåíèÿ ïî íèì, èíà÷å íîìåð êàáèíåòà áóäåò âñå âðåìÿ "Óáåãàòü" ñîâñåì íå òóäà, êóäà õîòåë ïîëüçîâàòåëü, à ìû íå ìîæåì
// çàñòàâèòü ïîëüçîâàòåëÿ âñå âðåìÿ ðèñîâàòü êàáèíåò ñëåâà-ñâåðõó âïðàâî-âíèç....
// Çäåñü íà çàáûâàåì, ÷òî îñü Ó ó íàñ ïåðåâåðíóòà, ò.ê. ïðàêòè÷åñêè 0 - íàõîäèòñÿ â ëåâîì âåðõíåì óãëó ýêðàíà
// ïîýòîìó ïîëó÷àåìûå çíà÷åíèÿ ìèíèìóìà è ìàêñèìóìà ïî îñè Ó ìåíÿåì ìåñòàìè, íî íàçâàíèÿ îñòàâèì, äàáû íå ëîìàòü
// àëãîðèòì ðàñ÷åòà, ò.ê. îí ìàòåìàòè÷åñêè ïðàâèëåí
TCabinet(CabObj).getbounds(MaxX, MinY, MinX, MaxY);
case FPositionIndex of
1:begin //Ââåðõó
DeltaX := ((MinX + MaxX) / 2) - Self.CenterPoint.x;
DeltaY := (MaxY + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
//Self.Move(DeltaX, DeltaY);
end;
2:begin //Ââåðõó ñïðàâà
DeltaX := (MaxX - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := (MaxY + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
//Self.Move(DeltaX, DeltaY);
end;
3:begin //Ââåðõó ñëåâà
DeltaX := (MinX + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := (MaxY + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
//Self.Move(DeltaX, DeltaY);
end;
4:begin //Ïî öåíòðó
DeltaX := ((MinX + MaxX) / 2) - Self.CenterPoint.x;
DeltaY := ((MaxY + MinY) / 2) - Self.CenterPoint.y;
//Self.Move(DeltaX, DeltaY);
end;
5:begin //Ñïðàâà
DeltaX := (MaxX - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := ((MaxY + MinY) / 2) - Self.CenterPoint.y;
//Self.Move(DeltaX, DeltaY);
end;
6:begin //Ñëåâà
DeltaX := (MinX + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := ((MaxY + MinY) / 2) - Self.CenterPoint.y;
//Self.Move(DeltaX, DeltaY);
end;
7:begin //Âíèçó
DeltaX := ((MinX + MaxX) / 2) - Self.CenterPoint.x;
DeltaY := (MinY - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
//Self.Move(DeltaX, DeltaY);
end;
8:begin //Âíèçó ñïðàâà
DeltaX := (MaxX - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := (MinY - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
//Self.Move(DeltaX, DeltaY);
end;
9:begin //Âíèçó ñëåâà
DeltaX := (MinX + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := (MinY - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
// Self.Move(DeltaX, DeltaY);
end;
end;
//Tolik
// Font Change to Cabinet Number
if Self.InFigures.Count > 1 then
begin
TempCapt := TRichTextMod(Self.InFigures[1]);
TempCapt.getbounds(MaxX, MinY, MinX, MaxY);
GetTextSize(TRichText(Self.InFigures[1]).re.font.Size, [], TRichText(Self.InFigures[1]).re.font.Name, '', TRichText(Self.InFigures[1]).re.Lines, LenY{h}, LenX{w});
NumberRadius := Sqrt(Sqr(LenX) + Sqr(LenY))/2;
DoubleRad := Double((TCircle(Self.InFigures[0]).Radius ));
if NumberRadius > 0 then
begin
//if (Round(NumberRadius) > (TCircle(Self.InFigures[0]).Radius )) then
if NumberRadius > DoubleRad then // òàê òî÷íåå
begin
TRichText(Self.InFigures[1]).re.font.size := 25;
ChangeFontSizeToCircle;
end;
end;
Self.Move(DeltaX, DeltaY); // ìîæíî è îäèí ðàç íàïèñàòü, à íå â êàæäîì êåéñå
end;
//
{
case FPositionIndex of
1:begin //Ââåðõó
DeltaX := ((TFigure(Cabobj).ActualPoints[1].x + TFigure(Cabobj).ActualPoints[3].x) / 2) - Self.CenterPoint.x;
DeltaY := (TFigure(Cabobj).ActualPoints[1].y + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
Self.Move(DeltaX, DeltaY);
end;
2:begin //Ââåðõó ñïðàâà
DeltaX := (TFigure(Cabobj).ActualPoints[3].x - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := (TFigure(Cabobj).ActualPoints[1].y + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
Self.Move(DeltaX, DeltaY);
end;
3:begin //Ââåðõó ñëåâà
DeltaX := (TFigure(Cabobj).ActualPoints[1].x + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := (TFigure(Cabobj).ActualPoints[1].y + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5;
Self.Move(DeltaX, DeltaY);
end;
4:begin //Ïî öåíòðó
DeltaX := ((TFigure(Cabobj).ActualPoints[1].x + TFigure(Cabobj).ActualPoints[3].x) / 2) - Self.CenterPoint.x;
DeltaY := ((TFigure(Cabobj).ActualPoints[1].y + TFigure(Cabobj).ActualPoints[3].y) / 2) - Self.CenterPoint.y;
Self.Move(DeltaX, DeltaY);
end;
5:begin //Ñïðàâà
DeltaX := (TFigure(Cabobj).ActualPoints[3].x - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := ((TFigure(Cabobj).ActualPoints[1].y + TFigure(Cabobj).ActualPoints[3].y) / 2) - Self.CenterPoint.y;
Self.Move(DeltaX, DeltaY);
end;
6:begin //Ñëåâà
DeltaX := (TFigure(Cabobj).ActualPoints[1].x + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := ((TFigure(Cabobj).ActualPoints[1].y + TFigure(Cabobj).ActualPoints[3].y) / 2) - Self.CenterPoint.y;
Self.Move(DeltaX, DeltaY);
end;
7:begin //Âíèçó
DeltaX := ((TFigure(Cabobj).ActualPoints[1].x + TFigure(Cabobj).ActualPoints[3].x) / 2) - Self.CenterPoint.x;
DeltaY := (TFigure(Cabobj).ActualPoints[3].y - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
Self.Move(DeltaX, DeltaY);
end;
8:begin //Âíèçó ñïðàâà
DeltaX := (TFigure(Cabobj).ActualPoints[3].x - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
DeltaY := (TFigure(Cabobj).ActualPoints[3].y - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
Self.Move(DeltaX, DeltaY);
end;
9:begin //Âíèçó ñëåâà
DeltaX := (TFigure(Cabobj).ActualPoints[1].x + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5;
DeltaY := (TFigure(Cabobj).ActualPoints[3].y - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
Self.Move(DeltaX, DeltaY);
end;
end; }
//
end
else
begin
if (FPositionIndex <> 0)and (FPositionIndex <> 1) then
begin
ConnPoint := TFigure(CabObj).ActualPoints[FPositionIndex - 1];
TCabinetExt(CabObj).getbounds(MaxX, MaxY, MinX, MinY);
if ((ConnPoint.x - TCircle(Self.InFigures[0]).Radius) < MinX) then
DeltaX := (ConnPoint.x + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x + 0.5
else
DeltaX := (ConnPoint.x - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.x - 0.5;
if ((ConnPoint.y - TCircle(Self.InFigures[0]).Radius) < MinY) then
DeltaY := (ConnPoint.y + TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y + 0.5
else
DeltaY := (ConnPoint.y - TCircle(Self.InFigures[0]).Radius) - Self.CenterPoint.y - 0.5;
//Tolik
// Font Change to Cabinet Number
if Self.InFigures.Count > 1 then
begin
TRichText(Self.InFigures[1]).re.font.size := 25;
ChangeFontSizeToCircle;
end;
//
Self.Move(DeltaX, DeltaY);
end
else
if FPositionIndex = 1 then
begin
TCabinetExt(CabObj).getbounds(MaxX, MaxY, MinX, MinY);
DeltaX := (MinX + MaxX) / 2;
DeltaY := (MinY + MaxY) / 2;
//Tolik
// Font Change to Cabinet Number
if Self.InFigures.Count > 1 then
begin
TempCapt := TRichTextMod(Self.InFigures[1]);
TempCapt.getbounds(MaxX, MinY, MinX, MaxY);
GetTextSize(TRichText(Self.InFigures[1]).re.font.Size, [], TRichText(Self.InFigures[1]).re.font.Name, '', TRichText(Self.InFigures[1]).re.Lines, LenY{h}, LenX{w});
NumberRadius := Sqrt(Sqr(LenX) + Sqr(LenY))/2;
DoubleRad := Double((TCircle(Self.InFigures[0]).Radius ));
if NumberRadius > 0 then
begin
//if (Round(NumberRadius) > (TCircle(Self.InFigures[0]).Radius )) then
if NumberRadius > DoubleRad then // òàê òî÷íåå
begin
TRichText(Self.InFigures[1]).re.font.size := 25;
ChangeFontSizeToCircle;
end;
end;
self.move(DeltaX - Self.CenterPoint.x, DeltaY - Self.CenterPoint.y);
end;
end;
end;
if FPositionIndex <> 0 then
inherited;
end;
except
on E: Exception do addExceptionToLogEx('TCabinetNumber.Draw', E.Message);
end;
end;
function TCabinetNumber.Edit: Boolean;
var
Cabinet: TFigure;
begin
try
Result := False;
if Visible then
begin
Cabinet := FindCabinetBySCSID(GCadForm, FCabinetID);
if Cabinet <> nil then
begin
if CheckFigureByClassName(Cabinet, cTCabinet) then
begin
ShowObjectInPM(TCabinet(Cabinet).FSCSID, TCabinet(Cabinet).Name);
ActivateCabinetOnCAD(GCadForm.FCADListID, TCabinet(Cabinet).FSCSID);
end
else if CheckFigureByClassName(Cabinet, cTCabinetExt) then
begin
ShowObjectInPM(TCabinetExt(Cabinet).FSCSID, TCabinetExt(Cabinet).Name);
ActivateCabinetOnCAD(GCadForm.FCADListID, TCabinetExt(Cabinet).FSCSID);
end;
end;
if Selected then
Deselect;
end;
except
on E: Exception do addExceptionToLogEx('TCabinetNumber.Edit', E.Message);
end;
end;
function TCabinetNumber.isPointIn(x, y: double): boolean;
begin
Result := False;
Result := inherited isPointIn(x, y);
end;
procedure TCabinetNumber.Select;
begin
// inherited;
end;
procedure TCabinetNumber.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
xInt: Integer;
begin
try
inherited;
case xCode of
30: begin
xInt := pInt(data)^;
FCabinetID := xInt;
LockSelect := False;
LockMove := True;
LockModify := True;
end;
31: begin
xInt := pInt(data)^;
FPositionIndex := xInt;
end;
91: begin
IsCabinetExt := PBoolean(Data)^;
end;
32: begin
xInt := pInt(data)^;
CircleRadius := xInt;
end;
end;
except
on E: Exception do addExceptionToLogEx('TCabinetNumber.SetPropertyFromStream', E.Message);
end;
end;
procedure TCabinetNumber.WriteToStream(Stream: TStream);
var
xInt: Integer;
begin
try
inherited;
xInt := FCabinetID;
WriteField(30, Stream, xInt, sizeof(xInt));
xInt := FPositionIndex;
WriteField(31, Stream, xInt, sizeof(xInt));
WriteField(32, Stream, CircleRadius, sizeof(CircleRadius));
WriteField(91, Stream, IsCabinetExt, sizeof(IsCabinetExt));
except
on E: Exception do addExceptionToLogEx('TCabinetNumber.WriteToStream', E.Message);
end;
end;
{ TCadNorms }
procedure TCadNorms.Build;
begin
try
if FNormsList.Count > 0 then
DrawTable
else
begin
EndProgress;
ShowMessage(cCadClasses_Mes22);
end;
except
on E: Exception do addExceptionToLogEx('TCadNorms.Build', E.Message);
end;
end;
constructor TCadNorms.create(LHandle: Integer; aOwner: TComponent);
begin
try
inherited Create(LHandle, aOwner);
FNormsList := TObjectList.Create;
// ðàçìåðû ïîëåé
fTableWidth := 1;
fTextSize := 7;
fTextStyle := [fsBold];
fNumberSize := 10;
fNameSize := 50;
fIzmSize := 10;
fCountSize := 10;
fColumnSize := 12;
fLineHeight := 6;
AlwaysTogether := True;
except
on E: Exception do addExceptionToLogEx('TCadNorms.create', E.Message);
end;
end;
//Tolik
Destructor TCadNorms.Destroy;
var CadNormStruct: TCadNormStruct;
i: Integer;
begin
if FNormsList <> nil then
begin
FreeAndNil(FNormsList);
end;
inherited;
end;
//
procedure TCadNorms.Delete;
begin
end;
procedure TCadNorms.DrawTable;
var
i, j: Integer;
x, y: double;
Rect: TRectangle;
Line: TLine;
w, h: double;
LHandle: Integer;
BeginPoint: TDoublePoint;
ToPoint: TDoublePoint;
CadNormStruct: TCadNormStruct;
CadNormColumn: TCadNormColumn;
MustRebuild: Boolean;
begin
try
LHandle := GCadForm.PCad.GetLayerHandle(1);
h := FNormsList.Count * fLineHeight + fLineHeight * 2;
CadNormStruct := TCADNormStruct(FNormsList[0]);
w := fNumberSize + fNameSize + fIzmSize + fCountSize;
for i := 0 to CadNormStruct.NormColumns.Count - 1 do
begin
CadNormColumn := TCadNormColumn(CadNormStruct.NormColumns[i]);
w := w + CadNormColumn.Columns.Count * fColumnSize;
end;
BeginPoint := DoublePoint(-100, -100);
Rect := TRectangle.create(BeginPoint.x, BeginPoint.y, BeginPoint.x + w, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, ord(bsClear), clNone, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Rect);
Line := TLine.create(BeginPoint.x + fNumberSize + fNameSize + fIzmSize + fCountSize, BeginPoint.y + fLineHeight,
BeginPoint.x + w, BeginPoint.y + fLineHeight, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
Line := TLine.create(BeginPoint.x + fNumberSize + fNameSize + fIzmSize + fCountSize, BeginPoint.y + fLineHeight * 2,
BeginPoint.x + w, BeginPoint.y + fLineHeight * 2, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
Line := TLine.create(BeginPoint.x, BeginPoint.y + fLineHeight * 3, BeginPoint.x + w, BeginPoint.y + fLineHeight * 3, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
// ïðî÷åðòèòü âåðòèêàëè
for i := 1 to FNormsList.Count - 1 do
begin
Line := TLine.create(BeginPoint.x, BeginPoint.y + fLineHeight * 3 + i * fLineHeight, BeginPoint.x + w, BeginPoint.y + fLineHeight * 3 + i * fLineHeight, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
end;
// ïðî÷åðòèòü ãîðèçîíòàëè
// îñíîâíûå ïîëÿ
Line := TLine.create(BeginPoint.x + fNumberSize, BeginPoint.y, BeginPoint.x + fNumberSize, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
Line := TLine.create(BeginPoint.x + fNumberSize + fNameSize, BeginPoint.y, BeginPoint.x + fNumberSize + fNameSize, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
Line := TLine.create(BeginPoint.x + fNumberSize + fNameSize + fIzmSize, BeginPoint.y, BeginPoint.x + fNumberSize + fNameSize + fIzmSize, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
Line := TLine.create(BeginPoint.x + fNumberSize + fNameSize + fIzmSize + fCountSize, BeginPoint.y, BeginPoint.x + fNumberSize + fNameSize + fIzmSize + fCountSize, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
// ïîëÿ êîëîíîê
x := fNumberSize + fNameSize + fIzmSize + fCountSize;
for i := 0 to CadNormStruct.NormColumns.Count - 1 do
begin
CadNormColumn := TCadNormColumn(CadNormStruct.NormColumns[i]);
for j := 0 to CadNormColumn.Columns.Count - 1 do
begin
x := x + fColumnSize;
if j = CadNormColumn.Columns.Count - 1 then
y := fLineHeight
else
y := fLineHeight * 2;
Line := TLine.create(BeginPoint.x + x, BeginPoint.y + y, BeginPoint.x + x, BeginPoint.y + h, fTableWidth, ord(psSolid), clBlack, 0, LHandle, mydsNormal, GCadForm.PCad);
AddFigure(Line);
end;
end;
MustRebuild := DrawTextFileds(Rect.GetBoundRect);
ToPoint.x := 25;
ToPoint.y := GCadForm.PCad.WorkHeight - 10 - h;
if MustRebuild then
ReBuild
else
move(ToPoint.x - BeginPoint.x, ToPoint.y - BeginPoint.y);
except
on E: Exception do addExceptionToLogEx('TCadNorms.DrawTable', E.Message);
end;
end;
function TCadNorms.DrawTextFileds(aBnd: TDoubleRect): Boolean;
var
i, j, k: Integer;
FieldsList: TList;
FieldBnd: TDoubleRect;
StrField: String;
x, y: double;
CadNormStruct: TCadNormStruct;
CadNormColumn: TCadNormColumn;
SumColumn: Double;
CurrX: double;
tmpNumberSize: Double;
tmpNameSize: Double;
tmpIzmSize: Double;
tmpCountSize: Double;
tmpColumnSize: Double;
GetTextWidth: Double;
begin
try
Result := False;
// øàïêà
CadNormStruct := TCadNormStruct(FNormsList[0]);
// îñíîâíûå ïîëÿ
StrField := CadNormStruct.Number;
FieldBnd.Top := aBnd.Top;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight * 3;
FieldBnd.Left := aBnd.Left;
FieldBnd.Right := FieldBnd.Left + fNumberSize;
tmpNumberSize := DrawTextToField(FieldBnd, StrField, True, fNumberSize);
StrField := CadNormStruct.Name;
FieldBnd.Top := aBnd.Top;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight * 3;
FieldBnd.Left := aBnd.Left + fNumberSize;
FieldBnd.Right := FieldBnd.Left + fNameSize;
tmpNameSize := DrawTextToField(FieldBnd, StrField, True, fNameSize);
StrField := CadNormStruct.Izm;
FieldBnd.Top := aBnd.Top;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight * 3;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize;
FieldBnd.Right := FieldBnd.Left + fIzmSize;
tmpIzmSize := DrawTextToField(FieldBnd, StrField, True, fIzmSize);
StrField := CadNormStruct.Count;
FieldBnd.Top := aBnd.Top;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight * 3;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize + fIzmSize;
FieldBnd.Right := FieldBnd.Left + fCountSize;
tmpCountSize := DrawTextToField(FieldBnd, StrField, True, fCountSize);
// ïîëÿ êîëîíîê
SumColumn := 0;
CurrX := aBnd.Left + fNumberSize + fNameSize + fIzmSize + fCountSize;
for i := 0 to CadNormStruct.NormColumns.Count - 1 do
begin
CadNormColumn := TCadNormColumn(CadNormStruct.NormColumns[i]);
StrField := CadNormColumn.CableName;
FieldBnd.Top := aBnd.Top + fLineHeight;
FieldBnd.Bottom := aBnd.Top + fLineHeight * 2;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize + fIzmSize + fCountSize + SumColumn;
FieldBnd.Right := FieldBnd.Left + (CadNormColumn.Columns.Count * fColumnSize);
tmpColumnSize := DrawTextToField(FieldBnd, StrField, True, CadNormColumn.Columns.Count * fColumnSize);
SumColumn := SumColumn + CadNormColumn.Columns.Count * fColumnSize;
for j := 0 to CadNormColumn.Columns.Count - 1 do
begin
StrField := CadNormColumn.Columns[j];
FieldBnd.Top := aBnd.Top + fLineHeight * 2;
FieldBnd.Bottom := aBnd.Top + fLineHeight * 3;
FieldBnd.Left := CurrX;
FieldBnd.Right := FieldBnd.Left + fColumnSize;
CurrX := FieldBnd.Right;
tmpColumnSize := DrawTextToField(FieldBnd, StrField);
end;
end;
if TCadNormStruct(FNormsList[0]).NormColumns.Count > 0 then
begin
FieldBnd.Top := aBnd.Top;
FieldBnd.Bottom := aBnd.Top + fLineHeight;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize + fIzmSize + fCountSize;
FieldBnd.Right := FieldBnd.Left + SumColumn;
DrawTextToField(FieldBnd, cCadClasses_Mes23, True, SumColumn);
end;
// âñå îñòàëüíûå ïîëÿ
tmpNumberSize := fNumberSize;
tmpNameSize := fNameSize;
tmpIzmSize := fIzmSize;
tmpCountSize := fCountSize;
tmpColumnSize := fColumnSize;
for i := 1 to FNormsList.Count - 1 do
begin
CadNormStruct := TCadNormStruct(FNormsList[i]);
// îñíîâíûå ïîëÿ
StrField := CadNormStruct.Number;
FieldBnd.Top := aBnd.Top + fLineHeight * 2 + i * fLineHeight;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight;
FieldBnd.Left := aBnd.Left;
FieldBnd.Right := FieldBnd.Left + fNumberSize;
GetTextWidth := DrawTextToField(FieldBnd, StrField, True);
if GetTextWidth > tmpNumberSize then
tmpNumberSize := GetTextWidth;
StrField := CadNormStruct.Name;
FieldBnd.Top := aBnd.Top + fLineHeight * 2 + i * fLineHeight;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight;
FieldBnd.Left := aBnd.Left + fNumberSize;
FieldBnd.Right := FieldBnd.Left + fNameSize;
GetTextWidth := DrawTextToField(FieldBnd, StrField, False);
if GetTextWidth > tmpNameSize then
tmpNameSize := GetTextWidth;
StrField := CadNormStruct.Izm;
FieldBnd.Top := aBnd.Top + fLineHeight * 2 + i * fLineHeight;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize;
FieldBnd.Right := FieldBnd.Left + fIzmSize;
GetTextWidth := DrawTextToField(FieldBnd, StrField, True);
if GetTextWidth > tmpIzmSize then
tmpIzmSize := GetTextWidth;
StrField := CadNormStruct.Count;
FieldBnd.Top := aBnd.Top + fLineHeight * 2 + i * fLineHeight;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight;
FieldBnd.Left := aBnd.Left + fNumberSize + fNameSize + fIzmSize;
FieldBnd.Right := FieldBnd.Left + fCountSize;
GetTextWidth := DrawTextToField(FieldBnd, StrField, True);
if GetTextWidth > tmpCountSize then
tmpCountSize := GetTextWidth;
CurrX := aBnd.Left + fNumberSize + fNameSize + fIzmSize + fCountSize;
for j := 0 to CadNormStruct.NormColumns.Count - 1 do
begin
CadNormColumn := TCadNormColumn(CadNormStruct.NormColumns[j]);
for k := 0 to CadNormColumn.Columns.Count - 1 do
begin
StrField := CadNormColumn.Columns[k];
FieldBnd.Top := aBnd.Top + fLineHeight * 2 + i * fLineHeight;
FieldBnd.Bottom := FieldBnd.Top + fLineHeight;
FieldBnd.Left := CurrX;
FieldBnd.Right := FieldBnd.Left + fColumnSize;
CurrX := FieldBnd.Right;
GetTextWidth := DrawTextToField(FieldBnd, StrField, True);
if GetTextWidth > tmpColumnSize then
tmpColumnSize := GetTextWidth;
end;
end;
end;
// Check Textes Widths
if tmpNumberSize > fNumberSize then
begin
fNumberSize := tmpNumberSize;
Result := true;
end;
if tmpNameSize > fNameSize then
begin
fNameSize := tmpNameSize;
Result := true;
end;
if tmpIzmSize > fIzmSize then
begin
fIzmSize := tmpIzmSize;
Result := true;
end;
if tmpCountSize > fCountSize then
begin
fCountSize := tmpCountSize;
Result := true;
end;
if tmpColumnSize > fColumnSize then
begin
fColumnSize := tmpColumnSize;
Result := true;
end;
except
on E: Exception do addExceptionToLogEx('TCadNorms.DrawTextFileds', E.Message);
end;
end;
function TCadNorms.DrawTextToField(aFieldBnd: TDoubleRect; aText: string; aCentered: Boolean = True; aMaxWidth: Double = -1): Double;
var
i: integer;
TextField: TRichText;
FieldCP: TDoublePoint;
TM: TTextMetric;
xCanvas: TMetafileCanvas;
h, w: double;
HalfField: double;
HalfText: double;
ModCount: Integer;
tmHeight: Integer; //Longint;
Strings: TStringList;
begin
try
Result := -1;
FieldCP.x := (aFieldBnd.Left + aFieldBnd.Right) / 2;
FieldCP.y := (aFieldBnd.Top + aFieldBnd.Bottom) / 2;
//11.10.2011 - Óïðîùåí ñïîñîá ðàñ÷åòà ðàçìåðîâ
{TextField := TRichText.create(-100, -100, -100, -100, 1, ord(psSolid), clBlack, ord(bsClear), clNone,
LayerHandle, mydsNormal, GCadForm.PCad);
if aCentered then
TextField.re.WordWrap := True
else
TextField.re.WordWrap := False;
TextField.re.Font.Name := GCadForm.FFontName;
TextField.re.Font.Size := fTextSize;
TextField.re.Font.Style := fTextStyle;
TextField.re.Font.Color := clBlack;
TextField.re.Lines.Clear;
TextField.re.Lines.Add(aText);
// ïîëó÷èòü ñâîéñòâà
xCanvas := TMetafileCanvas.Create(TextField.Metafile, 0);
xCanvas.Font.Name := TextField.re.Font.Name;
xCanvas.Font.Size := TextField.re.Font.Size;
xCanvas.Font.Style := TextField.re.Font.Style;
GetTextMetrics(xCanvas.Handle, TM);
if TextField.re.Lines.Count > 1 then
h := TM.tmHeight / 4 * TextField.re.Lines.Count + 1
else
h := TM.tmHeight / 4 * TextField.re.Lines.Count;
w := 0;
for i := 0 to TextField.re.Lines.Count - 1 do
begin
if w < xCanvas.TextWidth(TextField.Re.Lines[i]) then
w := xCanvas.TextWidth(TextField.Re.Lines[i]);
end;
w := (w + 3) / 4 ;
// íóæíî îãðàíè÷èòü
if aMaxWidth <> - 1 then
begin
if w > aMaxWidth then
begin
ModCount := trunc(w / aMaxWidth) + 1;
w := aMaxWidth - 2;
h := TM.tmHeight / 4 * ModCount + 1;
end;
end;
FreeAndNil(xCanvas);
// ïåðåñîçäàòü ñ íîâûìè ñâîéñòâàìè
if TextField <> nil then
begin
FreeAndNil(TextField);
end;}
Strings := TStringList.Create;
Strings.Add(aText);
GetTextSize(fTextSize, fTextStyle, GCadForm.FFontName, '', Strings, h, w, @tmHeight); //11.10.2011 øèðèíà w íå íóæíà
if Strings.Count > 1 then
h := tmHeight / 4 * Strings.Count + 1
else
h := tmHeight / 4 * Strings.Count;
//11.10.2011 íóæíî îãðàíè÷èòü
if aMaxWidth <> - 1 then
begin
if w > aMaxWidth then
begin
ModCount := trunc(w / aMaxWidth) + 1;
w := aMaxWidth - 2;
h := tmHeight / 4 * ModCount + 1;
end;
end;
FreeAndNil(Strings);
TextField := TRichText.create(-100, -100, -100 + w, -100 + h, 1, ord(psSolid), clBlack, ord(bsClear), clNone,
LayerHandle, mydsNormal, GCadForm.PCad);
if aCentered then
TextField.re.WordWrap := True
else
TextField.re.WordWrap := False;
TextField.re.Font.Name := GCadForm.FFontName;
TextField.re.Font.Size := fTextSize;
TextField.re.Font.Style := fTextStyle;
TextField.re.Font.Color := clBlack;
TextField.re.Lines.Clear;
AText := FastReplace(AText,#13#10,' ');
TextField.re.Lines.Add(aText);
TextField.Move(FieldCP.x - TextField.CenterPoint.x, FieldCP.y - TextField.CenterPoint.y);
if not aCentered then
begin
HalfField := abs(aFieldBnd.Left - aFieldBnd.Right) / 2;
HalfText := w / 2;
TextField.Move(HalfText - HalfField + 1, 0);
end;
AddFigure(TextField);
Result := w;
except
on E: Exception do addExceptionToLogEx('TCadNorms.DrawTextToField', E.Message);
end;
end;
function TCadNorms.Edit: Boolean;
begin
Result := False;
end;
function TCadNorms.isPointIn(x, y: double): boolean;
var
Bnd: TDoubleRect;
MinX, MinY, MaxX, MaxY: Double;
begin
try
Result := False;
Bnd := GetBoundRect;
MinX := Bnd.Left;
MinY := Bnd.Top;
MaxX := Bnd.Right;
MaxY := Bnd.Bottom;
if (x >= MinX) and (x <= MaxX) and (y >= MinY) and (y <= MaxY) then
Result := True;
except
on E: Exception do addExceptionToLogEx('TCadNorms.isPointIn', E.Message);
end;
end;
procedure TCadNorms.ReBuild;
var
i: Integer;
begin
try
RemoveInFigureGrp(Self);
RefreshCAD(GCadForm.PCad);
Build;
except
on E: Exception do addExceptionToLogEx('TCadNorms.ReBuild', E.Message);
end;
end;
procedure TCadNorms.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
xInt: Integer;
xDbl: Double;
begin
try
inherited;
case xCode of
30: begin
xInt := pInt(data)^;
fTableWidth := xInt;
FNormsList := GetOldNormsForCAD(GCadForm.FCADListID);
end;
31: begin
xInt := pInt(data)^;
fTextSize := xInt;
end;
32: begin
xInt := pInt(data)^;
fTextStyle := [];
if xInt and $01 = $01 then
fTextStyle := fTextStyle + [fsBold];
if xInt and $02 = $02 then
fTextStyle := fTextStyle + [fsItalic];
if xInt and $04 = $04 then
fTextStyle := fTextStyle + [fsUnderline];
if xInt and $08 = $08 then
fTextStyle := fTextStyle + [fsStrikeOut];
end;
230: fNumberSize := pDouble(data)^;
231: fNameSize := pDouble(data)^;
232: fIzmSize := pDouble(data)^;
233: fCountSize := pDouble(data)^;
234: fColumnSize := pDouble(data)^;
235: fLineHeight := pDouble(data)^;
end;
except
on E: Exception do addExceptionToLogEx('TCadNorms.SetPropertyFromStream', E.Message);
end;
end;
procedure TCadNorms.WriteToStream(Stream: TStream);
var
xInt: Integer;
xDbl: Double;
begin
try
inherited;
xInt := fTableWidth;
WriteField(30, Stream, xInt, sizeof(xInt));
xInt := fTextSize;
WriteField(31, Stream, xInt, sizeof(xInt));
xInt := $0;
if fsBold in fTextStyle then
xInt := xInt + $01;
if fsItalic in fTextStyle then
xInt := xInt + $02;
if fsUnderline in fTextStyle then
xInt := xInt + $04;
if fsStrikeOut in fTextStyle then
xInt := xInt + $08;
WriteField(32, Stream, xInt, sizeof(xInt));
xDbl := fNumberSize;
WriteField(230, Stream, xDbl, sizeof(xDbl));
xDbl := fNameSize;
WriteField(231, Stream, xDbl, sizeof(xDbl));
xDbl := fIzmSize;
WriteField(232, Stream, xDbl, sizeof(xDbl));
xDbl := fCountSize;
WriteField(233, Stream, xDbl, sizeof(xDbl));
xDbl := fColumnSize;
WriteField(234, Stream, xDbl, sizeof(xDbl));
xDbl := fLineHeight;
WriteField(235, Stream, xDbl, sizeof(xDbl));
except
on E: Exception do addExceptionToLogEx('TCadNorms.WriteToStream', E.Message);
end;
end;
procedure TOrthoLine.DrawActiveTrace(ADEngine: TPCDrawEngine; aPoint1,
aPoint2: TDoublePoint);
var
i: Integer;
Bnd1, Bnd2: TDoubleRect;
AngleDegrees, AngleRad: Double;
dx, dy: double;
p1, p2: TDoublePoint;
delta: double;
d1, d2: double;
begin
try
delta := 1;
// âû÷èñëèòü ñìåùåíèå
if FSingleBlock <> nil then
begin
if FSingleBlock.InFigures.Count = 0 then
begin
if FSingleBlockDelta < 1 then
FSingleBlockDelta := 1;
delta := FSingleBlockDelta;
end;
if FSingleBlock.InFigures.Count = 1 then
begin
// Bnd1 := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
// d1 := abs(Bnd1.Bottom - Bnd1.Top) / 2;
delta := GrpSizeY / 2 + FSingleBlockDelta;
end;
if FSingleBlock.InFigures.Count = 2 then
begin
// Bnd1 := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
// Bnd2 := TFigure(FSingleBlock.InFigures[1]).GetBoundRect;
// d1 := abs(Bnd1.Bottom - Bnd1.Top) / 2;
// d2 := abs(Bnd2.Bottom - Bnd2.Top) / 2;
delta := GrpSizeY / 2 + FSingleBlockDelta;
end
end;
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
AngleDegrees := GetAngle(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
// Tolik 20/10/2015
//AngleDegrees := GetAngleDF(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
//
AngleRad := AngleDegrees * pi / 180;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
// Tolik 20/10/2015 îêðóãëåíèå çäåñü èíîãäà ïðèâîäèò ôèãóðó îòðèñîâêè íå òóäà, êóäà ñëåä
//if AngleDegrees >= 360 then
AngleDegrees := round(AngleDegrees) mod 360;
// AngleDegrees := round(AngleDegrees) mod 360;
//
AngleRad := AngleDegrees * pi / 180;
dx := delta * Cos(AngleRad);
dy := delta * Sin(AngleRad);
if (AngleDegrees >= 180) and (AngleDegrees < 360) then
begin
dx := -dx;
dy := -dy;
end;
// åñëè ïîâîðîò íà 180 òî ïåðåáðîñèòü ëèíèþ íà äðóãóþ ñòîðîíó
if FIsRotated then
begin
dx := -dx;
dy := -dy;
end;
p1.x := aPoint1.x + dx;
p1.y := aPoint1.y + dy;
p2.x := aPoint2.x + dx;
p2.y := aPoint2.y + dy;
ADEngine.drawline(p1, p2);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.DrawActiveTrace', E.Message);
end;
end;
procedure TOrthoLine.DrawProjectibleTrace(ADEngine: TPCDrawEngine; aPoint1,
aPoint2: TDoublePoint);
var
i: Integer;
Bnd1, Bnd2: TDoubleRect;
AngleDegrees, AngleRad: Double;
dx, dy: double;
p1, p2: TDoublePoint;
delta: double;
pp1, pp2, pp3, pp4: TDoublePoint;
d1, d2: double;
begin
try
delta := 1;
// âû÷èñëèòü ñìåùåíèå
if FSingleBlock <> nil then
begin
if FSingleBlock.InFigures.Count = 0 then
begin
if FSingleBlockDelta < 1 then
FSingleBlockDelta := 1;
delta := FSingleBlockDelta;
end;
if FSingleBlock.InFigures.Count = 1 then
begin
// Bnd1 := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
// d1 := abs(Bnd1.Bottom - Bnd1.Top) / 2;
delta := GrpSizeY / 2 + FSingleBlockDelta;
end;
if FSingleBlock.InFigures.Count = 2 then
begin
// Bnd1 := TFigure(FSingleBlock.InFigures[0]).GetBoundRect;
// Bnd2 := TFigure(FSingleBlock.InFigures[1]).GetBoundRect;
// d1 := abs(Bnd1.Bottom - Bnd1.Top) / 2;
// d2 := abs(Bnd2.Bottom - Bnd2.Top) / 2;
delta := GrpSizeY / 2 + FSingleBlockDelta;
end;
end;
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
AngleDegrees := GetAngle(ActualPoints[1].x, ActualPoints[1].y, ActualPoints[2].x, ActualPoints[2].y);
AngleRad := AngleDegrees * pi / 180;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
// Tolik 20/10/2015
// if AngleDegrees >= 360 then
AngleDegrees := round(AngleDegrees) mod 360;
//AngleDegrees := round(AngleDegrees) mod 360;
//
AngleRad := AngleDegrees * pi / 180;
dx := delta * Cos(AngleRad);
dy := delta * Sin(AngleRad);
if (AngleDegrees >= 180) and (AngleDegrees < 360) then
begin
dx := -dx;
dy := -dy;
end;
// åñëè ïîâîðîò íà 180 òî ïåðåáðîñèòü ëèíèþ íà äðóãóþ ñòîðîíó
if FIsRotated then
begin
dx := -dx;
dy := -dy;
end;
p1.x := aPoint1.x + dx;
p1.y := aPoint1.y + dy;
p2.x := aPoint2.x + dx;
p2.y := aPoint2.y + dy;
ADEngine.drawline(p1, p2);
except
on E: Exception do addExceptionToLogEx('TOrthoLine.DrawProjectibleTrace', E.Message);
end;
end;
{ TSCSFigureGrp }
constructor TSCSFigureGrp.create(LHandle: Integer; aOwner: TComponent);
begin
inherited create(LHandle, aOwner);
end;
function TSCSFigureGrp.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: double; Shift: TShiftState): boolean;
var
distx, disty: double;
vRect: TDoubleRect;
ap: TDoublepoint;
begin
try
// Result := inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
ap := DoublePoint(mp.coordx, mp.coordy);
vRect := mp.Figure.GetBoundRect;
distx := 0;
distY := 0;
If mp.SeqNbr in [3, 4, 5] then
begin
x := TraceFigure.ap2.x;
distX := x - vRect.Right;
ap.x := vRect.Left;
end
else
if mp.SeqNbr in [1, 8, 7] then
begin
x := TraceFigure.ap1.x;
distX := vRect.Left - x;
ap.x := vRect.Right;
end;
If mp.SeqNbr in [1, 2, 3] then
begin
y := TraceFigure.ap1.y;
distY := y - vRect.Top;
ap.y := vRect.Bottom;
end
else
if mp.SeqNbr in [5, 6, 7] then
begin
y := TraceFigure.ap3.y;
distY := vRect.Bottom - y;
ap.y := vRect.Top;
end;
if (distX <> 0) and (distY <> 0) then
scale(1 + distx / (vRect.Right - vRect.Left), 1 + disty / (vRect.Top - vRect.Bottom), ap)
else
if distX = 0 then
scale(1, 1 + disty / (vRect.Top - vRect.Bottom), ap)
else
if distY = 0 then
scale(1 + distx / (vRect.Right - vRect.Left), 1, ap);
ResetRegion;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.EndModification', E.Message);
end;
end;
procedure TSCSFigureGrp.getbounds(var figMaxX, figMaxY, figMinX, figMinY: double);
var
i: Integer;
InFigure: TFigure;
MaxX, MaxY, MinX, MinY: double;
isFirst: Boolean;
begin
try
isFirst := True;
for i := 0 to InFigures.Count - 1 do
begin
InFigure := TFigure(InFigures[i]);
if not CheckFigureByClassName(InFigure, cTFigureGrpMod) then
begin
InFigure.GetBounds(MaxX, MaxY, MinX, MinY);
if isFirst then
begin
figMaxX := MaxX;
figMaxY := MaxY;
figMinX := MinX;
figMinY := MinY;
isFirst := False;
end
else
begin
if MaxX > figMaxX then
figMaxX := MaxX;
if MaxY > figMaxY then
figMaxY := MaxY;
if MinX < figMinX then
figMinX := MinX;
if MinY < figMinY then
figMinY := MinY;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.getbounds', E.Message);
end;
end;
procedure TSCSFigureGrp.move(deltax, deltay: double);
var
i, j: Integer;
InFigure: TFigure;
moveFunc: TFigMoveEvent;
MovedObject: TConnectorObject;
CanMove: Boolean;
begin
try
if ssCtrl in GGlobalShiftState then
GGlobalShiftState := GGlobalShiftState - [ssCtrl];
// Move ñàìîãî îáúåêòà
// ïîëíîñòüþ âçÿòî ñ îáðàáîò÷èêà TFigure.Move
for i := 1 to pointcount do
begin
originalpoints[i] := DoublePoint(originalpoints[i].x + deltax, originalpoints[i].y + deltay);
Actualpoints[i] := DoublePoint(actualpoints[i].x + deltax, actualpoints[i].y + deltay);
end;
RotPoint := DoublePoint(RotPoint.x + deltaX, RotPoint.y + DeltaY);
ResetRegion;
for i := 0 to JoinedFigures.Count - 1 do
begin
if TFigure(JoinedFigures[i]) is TLine then
TLine(JoinedFigures[i]).JoinFigureMoved(self, deltax, deltay)
else
if TFigure(JoinedFigures[i]) is TPolyLine then
TPolyLine(JoinedFigures[i]).JoinFigureMoved(self, deltax, deltay);
end;
if DimLines.Count > 0 then
CreateDimLines;
if assigned(Fill) and (assigned(Fill.Grp)) then
Fill.Move(deltaX, deltaY);
MoveClipFigures(deltaX, deltaY);
// ---------------------------------------------
GDisableMove := True;
// ÂÍÓÒÐÅÍÍÈÅ ÑÅÒÈ
if GCadForm.FSCSType = st_Internal then
begin
for i := 0 to inFigures.Count - 1 do
begin
InFigure := TFigure(InFigures[i]);
if CheckFigureByClassName(InFigure, cTConnectorObject) then
begin
if not InFigure.LockMove then
begin
if TConnectorObject(InFigure).FConnRaiseType = crt_None then
InFigure.move(deltax, deltay)
else
if TConnectorObject(InFigure).ConnectorType <> ct_Clear then
InFigure.move(deltax, deltay);
end;
end
else if CheckFigureByClassName(InFigure, cTOrthoLine) then
begin
if not InFigure.LockMove then
begin
if not TOrthoLine(InFigure).FIsRaiseUpDown then
InFigure.move(deltax, deltay);
end;
end;
end;
end
else
// ÂÍÅØÍÈÅ ÑÅÒÈ
if GCadForm.FSCSType = st_External then
begin
for i := 0 to inFigures.Count - 1 do
begin
InFigure := TFigure(InFigures[i]);
if CheckFigureByClassName(InFigure, cTConnectorObject) then
begin
MovedObject := TConnectorObject(TConnectorObject(InFigure));
CanMove := True;
for j := 0 to MovedObject.JoinedOrtholinesList.Count - 1 do
if TOrthoLine(MovedObject.JoinedOrtholinesList[j]).FConnectingLine then
CanMove := False;
if CanMove then
MovedObject.Move(deltax, deltay);
end;
end;
end;
GDisableMove := False;
BDeltax := BDeltax + deltax;
BDeltay := BDeltay + deltay;
ResetRegion;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.move', E.Message);
end;
end;
procedure TSCSFigureGrp.UnGroup;
var
i: integer;
FFigure: TFigure;
Conns, Lines: TList;
CurConn: TConnectorObject;
CurLine: TOrthoLine;
begin
try
if AlwaysTogether then
Exit;
Combined := False;
Deselect;
Conns := TList.Create;
Lines := TList.Create;
for i := 0 to inFigures.Count - 1 do
begin
FFigure := TFigure(InFigures[i]);
GCadForm.PCad.Figures.Add(FFigure);
FFigure.Parent := nil; //30.05.2011
if CheckFigureByClassName(FFigure, cTConnectorObject) then
begin
Conns.Add(FFigure);
FFigure.select;
end
else if CheckFigureByClassName(FFigure, cTOrthoLine) then
begin
Lines.Add(FFigure);
FFigure.select;
end;
end;
for i := 0 to Conns.Count - 1 do
begin
CurConn := TConnectorObject(Conns[i]);
CurConn.FGroupObject := nil;
end;
for i := 0 to Lines.Count - 1 do
begin
CurLine := TOrthoLine(Lines[i]);
CurLine.FGroupObject := nil;
end;
UnGrouped := true;
ResetRegion;
FreeAndNil(Conns);
FreeAndNil(Lines);
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.UnGroup', E.Message);
end;
end;
procedure TSCSFigureGrp.WriteToStream(Stream: TStream);
begin
inherited;
end;
procedure TSCSFigureGrp.SetPropertyFromStream(xCode: Byte; data: pointer;
size: integer);
var
mstr: TMemoryStream;
Figure: Tfigure;
begin
try
// inherited;
Case xcode of
90: Combined := (pByte(data)^ = 1);
150: begin
mStr := TMemoryStream.Create;
mStr.Write(pByte(data)^,size);
mStr.Position := 0;
Figure := TFigure.CreateFromStream(mStr, LayerHandle, DrawStyle, Owner);
AddToGrp(Figure); //28.04.2011 InFigures.Add(Figure);
mStr.Free;
end;
end;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.SetPropertyFromStream', E.Message);
end;
end;
procedure TSCSFigureGrp.RaiseProperties(CadFigList: TList);
var
i: Integer;
FFigure: TFigure;
begin
try
for i := 0 to InFigures.Count - 1 do
begin
FFigure := TFigure(InFigures[i]);
if CheckFigureByClassName(FFigure, cTConnectorObject) then
TConnectorObject(FFigure).RaiseProperties(CadFigList)
else if CheckFigureByClassName(FFigure, cTOrthoLine) then
TOrthoLine(FFigure).RaiseProperties(CadFigList);
end;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.RaiseProperties', E.Message);
end;
end;
Procedure TSCSFigureGrp.Rotate(aAngle: Double; cPoint: TDoublePoint); //30.08.2012
var
a, j: integer;
fig: TFigure;
Cad: TPCDrawing;
Arc: TElpArc;
pd1: TDoublePoint;
ElpArc: TElpArc;
ElpPoly: TPolyline;
TmpFigures: TList;
RotatedFigures: TList;
ConnOldPoints: TList;
OldPt: PDoublePoint;
//OldPtFObjectFromRaisedLine: TDoublePoint;
ObjIdx: Integer;
TmpDX: Double;
TmpDY: Double;
RaiseConn, ObjFromRaise: TConnectorObject;
ListToPassage, CurrGCadForm: TF_CAD;
ConnToPassage: TConnectorObject;
CurrConnToPassageID: Integer;
procedure RotateConnObj(aConn: TFigure);
begin
if RotatedFigures.IndexOf(aConn) = -1 then
begin
TConnectorObject(aConn).FIsRotating := true;
try
// Çàïîìèíàåì òî÷êó ïåðåä ïåðåâîðîòîì
GetZeroMem(OldPt, SizeOf(TDoublePoint));
OldPt^ := TConnectorObject(aConn).ActualPoints[1];
// Ïåðåâîðîò
TConnectorObject(aConn).RotateByParams(aAngle,cPoint);
if TConnectorObject(aConn).CaptionsGroup <> nil then
TConnectorObject(aConn).CaptionsGroup.rotate(aAngle,cPoint);
if TConnectorObject(aConn).NotesGroup <> nil then
TConnectorObject(aConn).NotesGroup.rotate(aAngle,cPoint);
finally
TConnectorObject(aConn).FIsRotating := false;
end;
ConnOldPoints.Add(OldPt);
RotatedFigures.Add(aConn);
end;
end;
begin
//inherited;
//Exit; ///// EXIT /////
//TFigure(Self).Rotate(aAngle, cPoint); //inherited;
TmpFigures := inFigures;
inFigures := TList.Create;
inherited;
inFigures.Free;
inFigures := TmpFigures;
RotatedFigures := TList.Create;
ConnOldPoints := TList.Create;
AngletoPoint := AngleToPoint + aAngle;
for a := 0 to inFigures.Count - 1 do
begin
fig := TFigure(inFigures[a]);
if (fig is TElpArc) then
begin
Cad := TPCdrawing(owner);
Cad.ClearUndoList;
Arc := TElpArc(fig);
ElpPoly := TPolyline(Arc.DuplicateAsBezier);
InFigures[a] := ElpPoly;
Arc.Destroy;
TFigure(InFigures[a]).rotate(aAngle,cPoint);
end
else if fig is TConnectorObject then
begin
//if TConnectorObject(fig).ConnectorType <> ct_Clear then
begin
RotateConnObj(fig);
for j := 0 to TConnectorObject(fig).JoinedConnectorsList.Count - 1 do
RotateConnObj(TConnectorObject(TConnectorObject(fig).JoinedConnectorsList[j]));
end;
//if TConnectorObject(fig).ConnectorType <> ct_Clear then
//begin
// TConnectorObject(fig).RotateByParams(aAngle,cPoint);
// for j := 0 to TConnectorObject(fig).JoinedConnectorsList.Count - 1 do
// TConnectorObject(TConnectorObject(fig).JoinedConnectorsList[j]).RotateByParams(aAngle,cPoint);
//end;
end
else if fig is TOrtholine then
begin
fig.rotate(aAngle,cPoint);
RotateConnObj(TConnectorObject(TOrtholine(fig).JoinConnector1));
RotateConnObj(TConnectorObject(TOrtholine(fig).JoinConnector2));
//TConnectorObject(TOrtholine(fig).JoinConnector1).RotateByParams(aAngle,cPoint);
//TConnectorObject(TOrtholine(fig).JoinConnector2).RotateByParams(aAngle,cPoint);
//if TOrtholine(fig).FIsRaiseUpDown then
begin
if TOrtholine(fig).CaptionsGroup <> nil then
TOrtholine(fig).CaptionsGroup.rotate(aAngle,cPoint);
if TOrtholine(fig).NotesGroup <> nil then
TOrtholine(fig).NotesGroup.rotate(aAngle,cPoint);
end;
{if TOrtholine(fig).DrawFigure <> nil then
TOrtholine(fig).DrawFigure.rotate(aAngle,cPoint);}
if TOrtholine(fig).FSingleBlock <> nil then
begin
//TOrtholine(fig).FSingleBlock.rotate(aAngle,cPoint);{}
TOrtholine(fig).ReCreateDrawFigureBlock;
end;
if TOrtholine(fig).FObjectFromRaisedLine <> nil then
begin
//OldPtFObjectFromRaisedLine := TOrtholine(fig).FObjectFromRaisedLine.ActualPoints[1];
RotateConnObj(TOrtholine(fig).FObjectFromRaisedLine);
end;
if TOrtholine(fig).FIsRaiseUpDown then
begin
// ì-ý ñ.ï.
if TOrtholine(fig).FObjectFromRaisedLine <> nil then
if (GetKeyState(VK_SHIFT) and 128) = 1 then //Åñëè íå íàæàòà VK_SHIFT
begin
RaiseConn := GetRaiseConn(TOrtholine(fig).FObjectFromRaisedLine);
if RaiseConn <> nil then
if RaiseConn.FID_ConnToPassage <> -1 then
begin
ListToPassage := GetListOfPassage(RaiseConn.FID_ListToPassage);
ConnToPassage := TConnectorObject(GetFigureByID(ListToPassage, RaiseConn.FID_ConnToPassage));
if ConnToPassage <> nil then
begin
ObjFromRaise := ConnToPassage.FObjectFromRaise;
if ObjFromRaise <> nil then
begin
RotateConnObj(RaiseConn);
ObjIdx := RotatedFigures.IndexOf(RaiseConn);
if ObjIdx <> - 1 then
begin
OldPt := ConnOldPoints[ObjIdx];
TmpDX := RaiseConn.ActualPoints[1].x - OldPt^.x;
TmpDY := RaiseConn.ActualPoints[1].y - OldPt^.y;
CurrGCadForm := GCadForm;
GCadForm := ListToPassage;
CurrConnToPassageID := ConnToPassage.FID_ConnToPassage;
ConnToPassage.FID_ConnToPassage := -1;
try
ObjFromRaise.MoveConnector(TmpDX, TmpDY);
finally
ConnToPassage.FID_ConnToPassage := CurrConnToPassageID;
GCadForm := CurrGCadForm;
end;
end;
end;
end;
end;
{ObjIdx := RotatedFigures.IndexOf(TOrtholine(fig).FObjectFromRaisedLine);
if ObjIdx <> - 1 then
begin
OldPt := ConnOldPoints[ObjIdx];
TmpDX := TOrtholine(fig).FObjectFromRaisedLine.ActualPoints[1].x - OldPt^.x;
TmpDY := TOrtholine(fig).FObjectFromRaisedLine.ActualPoints[1].y - OldPt^.y;
TConnectorObject(TOrtholine(fig).FObjectFromRaisedLine).MoveRaiseConnector(TmpDX, TmpDY);
TConnectorObject(TOrtholine(fig).FObjectFromRaisedLine).MoveBetweenRaiseConnector(TmpDX, TmpDY);
end;}
end;
//TConnectorObject(FObjectFromRaisedLine).Move(deltax, deltay);
end;
end
else
begin
fig.rotate(aAngle,cPoint);
end;
end;
// Tolik 03/05/2019 --
//ConnOldPoints.Free;
FreeList(ConnOldPoints);
//
RotatedFigures.Free;
Changed := True;
CreateMetafile;
ResetRegion;
end;
function TSCSFigureGrp.isPointIn(x, y: double): boolean;
begin
try
Result := false;
if (x > ap1.x) and (x < ap2.x) and (y > ap1.y) and (y < ap4.y) then
Result := True;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.isPointIn', E.Message);
end;
end;
function TSCSFigureGrp.Edit: Boolean;
begin
result := false;
end;
procedure TSCSFigureGrp.scale(percentx, percenty: double; rPoint: Tdoublepoint);
var
i, j: Integer;
CurLine: TOrthoLine;
CurConn: TConnectorObject;
Point1, Point2: TDoublePoint;
CP_Old, CP_New: TDoublePoint;
deltax, deltay: Double;
Old_point, Old_point1, Old_point2, New_point, New_point1, New_point2: TDoublePoint;
AllConnsList, ConnsList, LinesList, MovedList: TList;
MovedConnector1, MovedConnector2: TConnectorObject;
CanMove: Boolean;
RaiseConn, BaseConn: TConnectorObject;
begin
try
for i := 1 to pointcount do
begin
actualpoints[i] := ScalePoint(rPoint, actualpoints[i], percentx, percenty);
originalpoints[i] := ScalePoint(rPoint, originalpoints[i], percentx, percenty);
end;
radius := radius * percentx;
if DimLines.Count > 0 then
CreateDimLines;
if assigned(Fill) then
Fill.Scale(percentx, percenty, rPoint);
ResetRegion;
// -------------------------------------
AllConnsList := TList.Create;
LinesList := TList.Create;
ConnsList := TList.Create;
MovedList := TList.Create;
for i := 0 to inFigures.Count - 1 do
begin
If CheckFigureByClassName(TFigure(InFigures[i]), cTOrthoLine) then
begin
LinesList.Add(TOrthoLine(InFigures[i]));
end
else If CheckFigureByClassName(TFigure(InFigures[i]), cTConnectorObject) then
begin
AllConnsList.Add(TConnectorObject(InFigures[i]));
if TConnectorObject(InFigures[i]).ConnectorType <> ct_Clear then
if (TConnectorObject(InFigures[i]).JoinedConnectorsList.Count = 0) or CheckTrunkObject(TConnectorObject(InFigures[i])) then
ConnsList.Add(TConnectorObject(InFigures[i]));
end;
end;
// ÂÍÓÒÐÅÍÍÈÅ ÑÅÒÈ
if GCadForm.FSCSType = st_Internal then
begin
// ÌÀÑØÒÀÁÈÐÎÂÀÍÈÅ ÒÐÀÑÑ
for i := 0 to LinesList.Count - 1 do
begin
CurLine := TOrthoLine(LinesList[i]);
Old_point1 := CurLine.ActualPoints[1];
Old_point2 := CurLine.ActualPoints[2];
New_point1 := ScalePoint(rPoint, Old_point1, percentx, percenty);
New_point2 := ScalePoint(rPoint, Old_point2, percentx, percenty);
if not CurLine.FIsRaiseUpDown then
begin
// Move
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1);
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2);
// Îïðåäåëåíèå ïåðåìåùàþùèõñÿ êîííåêòîðîâ
// -1-
if TConnectorObject(CurLine.JoinConnector1).JoinedConnectorsList.Count > 0 then
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1).JoinedConnectorsList[0];
if TConnectorObject(CurLine.JoinConnector1).FConnRaiseType <> crt_None then
if TConnectorObject(CurLine.JoinConnector1).FObjectFromRaise <> nil then
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1).FObjectFromRaise;
// -2-
if TConnectorObject(CurLine.JoinConnector2).JoinedConnectorsList.Count > 0 then
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2).JoinedConnectorsList[0];
if TConnectorObject(CurLine.JoinConnector2).FConnRaiseType <> crt_None then
if TConnectorObject(CurLine.JoinConnector2).FObjectFromRaise <> nil then
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2).FObjectFromRaise;
// Ïåðåìåùåíèå ÷åðåç êîííåêòîðû
if CheckNoFigureInList(MovedConnector1, MovedList) and (CurLine.FGroupObject = MovedConnector1.FGroupObject) then
begin
deltax := New_point1.x - Old_point1.x;
deltay := New_point1.y - Old_point1.y;
TConnectorObject(MovedConnector1).Move(deltax, deltay);
MovedList.Add(MovedConnector1);
//
RaiseConn := GetRaiseConn(MovedConnector1);
BaseConn := MovedConnector1.FObjectFromRaise;
if RaiseConn <> nil then
MovedList.Add(RaiseConn);
if BaseConn <> nil then
MovedList.Add(BaseConn);
//
end;
if CheckNoFigureInList(MovedConnector2, MovedList) and (CurLine.FGroupObject = MovedConnector2.FGroupObject) then
begin
deltax := New_point2.x - Old_point2.x;
deltay := New_point2.y - Old_point2.y;
TConnectorObject(MovedConnector2).Move(deltax, deltay);
MovedList.Add(MovedConnector2);
//
RaiseConn := GetRaiseConn(MovedConnector2);
BaseConn := MovedConnector2.FObjectFromRaise;
if RaiseConn <> nil then
MovedList.Add(RaiseConn);
if BaseConn <> nil then
MovedList.Add(BaseConn);
//
end;
end;
CurLine.ResetRegion;
end;
// ÌÀÑØÒÀÁÈÐÎÂÀÍÈÅ ÎÁÚÅÊÒÎÂ
for i := 0 to ConnsList.Count - 1 do
begin
CurConn := TConnectorObject(ConnsList[i]);
Old_point := CurConn.ActualPoints[1];
New_point := ScalePoint(rPoint, Old_point, percentx, percenty);
deltax := New_point.x - Old_point.x;
deltay := New_point.y - Old_point.y;
CurConn.Move(deltax, deltay);
CurConn.ResetRegion;
end;
end
else
// ÂÍÅØÍÈÅ ÑÅÒÈ
if GCadForm.FSCSType = st_external then
begin
// ÌÀÑØÒÀÁÈÐÎÂÀÍÈÅ ÎÁÚÅÊÒÎÂ
for i := 0 to ConnsList.Count - 1 do
begin
CurConn := TConnectorObject(ConnsList[i]);
Old_point := CurConn.ActualPoints[1];
New_point := ScalePoint(rPoint, Old_point, percentx, percenty);
deltax := New_point.x - Old_point.x;
deltay := New_point.y - Old_point.y;
CurConn.Move(deltax, deltay);
CurConn.ResetRegion;
end;
// ÌÀÑØÒÀÁÈÐÎÂÀÍÈÅ ÒÐÀÑÑ
for i := 0 to LinesList.Count - 1 do
begin
CurLine := TOrthoLine(LinesList[i]);
Old_point1 := CurLine.ActualPoints[1];
Old_point2 := CurLine.ActualPoints[2];
New_point1 := ScalePoint(rPoint, Old_point1, percentx, percenty);
New_point2 := ScalePoint(rPoint, Old_point2, percentx, percenty);
if not CurLine.FConnectingLine then
begin
// Move
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1);
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2);
// Îïðåäåëåíèå ïåðåìåùàþùèõñÿ êîííåêòîðîâ
// -1-
if TConnectorObject(CurLine.JoinConnector1).JoinedConnectorsList.Count > 0 then
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1).JoinedConnectorsList[0];
if TConnectorObject(CurLine.JoinConnector1).FConnRaiseType <> crt_None then
if TConnectorObject(CurLine.JoinConnector1).FObjectFromRaise <> nil then
MovedConnector1 := TConnectorObject(CurLine.JoinConnector1).FObjectFromRaise;
// -2-
if TConnectorObject(CurLine.JoinConnector2).JoinedConnectorsList.Count > 0 then
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2).JoinedConnectorsList[0];
if TConnectorObject(CurLine.JoinConnector2).FConnRaiseType <> crt_None then
if TConnectorObject(CurLine.JoinConnector2).FObjectFromRaise <> nil then
MovedConnector2 := TConnectorObject(CurLine.JoinConnector2).FObjectFromRaise;
// Ïåðåìåùåíèå ÷åðåç êîííåêòîðû
if CheckNoFigureInList(MovedConnector1, MovedList) then
begin
deltax := New_point1.x - Old_point1.x;
deltay := New_point1.y - Old_point1.y;
CanMove := True;
for j := 0 to MovedConnector1.JoinedOrtholinesList.Count - 1 do
if TOrthoLine(MovedConnector1.JoinedOrtholinesList[j]).FConnectingLine then
CanMove := False;
if CanMove then
begin
MovedConnector1.Move(deltax, deltay);
MovedList.Add(MovedConnector1);
end;
end;
if CheckNoFigureInList(MovedConnector2, MovedList) then
begin
deltax := New_point2.x - Old_point2.x;
deltay := New_point2.y - Old_point2.y;
CanMove := True;
for j := 0 to MovedConnector2.JoinedOrtholinesList.Count - 1 do
if TOrthoLine(MovedConnector2.JoinedOrtholinesList[j]).FConnectingLine then
CanMove := False;
if CanMove then
begin
MovedConnector2.Move(deltax, deltay);
MovedList.Add(MovedConnector2);
end;
end;
end;
CurLine.ResetRegion;
end;
end;
Changed := True;
CreateMetafile;
ResetRegion;
FreeAndNil(AllConnsList);
FreeAndNil(LinesList);
FreeAndNil(ConnsList);
FreeAndNil(MovedList);
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.scale', E.Message);
end;
end;
procedure TSCSFigureGrp.Delete;
var
i: Integer;
FFigure: TFigure;
CurLine: TOrthoLine;
CurConn: TConnectorObject;
begin
try
if Not Deleted then
begin
// Tolik -- 14/03/2016 --
{i := 0;
while i < InFigures.Count do
begin
FFigure := TFigure(InFigures[i]);
if CheckFigureByClassName(FFigure, cTConnectorObject) then
begin
CurConn := TConnectorObject(FFigure);
if Assigned(CurConn.CaptionsGroup) then
CurConn.CaptionsGroup.Delete;
if Assigned(CurConn.NotesGroup) then
CurConn.NotesGroup.Delete;
if Assigned(CurConn.DrawFigure) then
CurConn.DrawFigure.Delete;
DeleteObjectFromPM(CurConn.ID, CurConn.Name);
RemoveFromGrp(CurConn); //28.04.2011 InFigures.Remove(CurConn);
FreeAndNil(CurConn);
end
else
if CheckFigureByClassName(FFigure, cTOrthoLine) then
begin
CurLine := TOrthoLine(FFigure);
if Assigned(CurLine.CaptionsGroup) then
CurLine.CaptionsGroup.Delete;
if Assigned(CurLine.NotesGroup) then
CurLine.NotesGroup.Delete;
if Assigned(CurLine.MultilineCaptionBox) then
TText/od(CurLine.MultilineCaptionBox).Delete;
if Assigned(CurLine.FSingleBlock) then
begin
CurLine.DrawFigure.RemoveFromGrp(CurLine.FSingleBlock); //28.04.2011 CurLine.DrawFigure.InFigures.Remove(CurLine.FSingleBlock);
CurLine.FSingleBlock.Delete;
end;
if Assigned(CurLine.DrawFigure) then
CurLine.DrawFigure.Delete;
DeleteObjectFromPM(CurLine.ID, CurLine.Name);
RemoveFromGrp(CurLine); //28.04.2011 InFigures.Remove(CurLine);
FreeAndNil(CurLine);
end
else
i := i + 1;
end;}
for i := 0 to InFigures.count - 1 do
begin
FFigure := TFigure(InFigures[i]);
if CheckFigureByClassName(FFigure, cTConnectorObject) then
TConnectorObject(FFigure).Delete
else
if CheckFigureByClassName(FFigure, cTOrthoLine) then
TOrthoLine(FFigure).Delete;
end;
InFigures.Clear;
//
Deleted := True;
GCadForm.PCad.Figures.Remove(Self);
FreeAndNil(Self);
RefreshCAD(GCadForm.Pcad);
end;
except
on E: Exception do addExceptionToLogEx('TSCSFigureGrp.Delete', E.Message);
end;
end;
procedure TConnectorObject.SetConnectedLinesDrawShadow(X, Y: Double);
var
i, j, k: Integer;
JoinedLine: TOrthoLine;
JoinedConn: TConnectorObject;
RaiseConn: TConnectorObject;
JoinedLinesByVerticals: TList; // Tolik -- 12/04/2018 --
ConnFound: Boolean;
begin
if self.Id = -1 then
exit;
try
// Tolik 16/04/2018 --
//if (FJoinedOrthoLinesByVerticals = nil) or ((FJoinedOrthoLinesByVerticals <> nil) and (FJoinedOrthoLinesByVerticals.Count = 0)) then
//begin
//FModConnsOtherSides := GetConnectorsOtherSides(Self);
//end;
// ïóñòûå ñîåäèíèòåëè ÷åðåç òðàññû
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(GTempJoinedOrtholinesList[i]);
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
if not JoinedLine.FIsRaiseUpDown then
if not JoinedLine.FisVertical then // Tolik --02/04/2018 --
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
// Tolik 16/04/2018 --
//if JoinedLine.JoinConnector1 = Self then
if JoinedLine.JoinConnector1.ID = Self.ID then
//
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
//Tolik 16/04/2018 --
//if JoinedLine.JoinConnector2 = Self then
if JoinedLine.JoinConnector2.ID = Self.ID then
//
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end
else
begin
// Tolik -- 16/04/2018 --
ConnFound := False;
if FModConnsOtherSides <> nil then
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
if JoinedConn.JoinedConnectorsList.count > 0 then
JoinedConn := TConnectorObject(JoinedConn.JoinedConnectorsList[0]);
if FModConnsOtherSides.IndexOf(JoinedConn) <> -1 then
begin
ConnFound := True;
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
begin
JoinedConn := TConnectorObject(JoinedLine.JoinConnector2);
if JoinedConn.JoinedConnectorsList.count > 0 then
JoinedConn := TConnectorObject(JoinedConn.JoinedConnectorsList[0]);
if FModConnsOtherSides.IndexOf(JoinedConn) <> -1 then
begin
ConnFound := True;
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
end;
end;
//
// èñêàòü ÷åðåç ãëîáàëüíûé óêàçàòåëü
if not ConnFound then //Tolik 16/04/2018 --
begin
if JoinedLine.JoinConnector1 = GLastConnector then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2 = GLastConnector then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end
end;
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
// Îáúåêòû
if GTempJoinedConnectorsList <> nil then
begin
for k := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(GTempJoinedConnectorsList[k]);
for i := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[i]);
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
if not JoinedLine.FIsRaiseUpDown then
if not JoinedLine.FIsVertical then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
if JoinedLine.JoinConnector1 = JoinedConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2 = JoinedConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
end;
// òðàññû ÷åðåç ñ-ï
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
// Tolik -- 18/04/2018 -- à åñëè íà âåðøèíå ðàéçà ïîèíò áóäåò...ïèñåö... íå íàéäåò íè÷åãî
if RaiseConn.ConnectorType = ct_Clear then
begin
//
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
if not JoinedLine.FIsRaiseUpDown then
if not JoinedLine.FisVertical then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
if JoinedLine.JoinConnector1 = RaiseConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2 = RaiseConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end
else // Tolik 18/04/2018 -- ýòî åñëè ïîèíò íà âåðøèíå...
begin
for i := 0 to RaiseConn.JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(RaiseConn.JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
if not JoinedLine.FIsRaiseUpDown then
if not JoinedLine.FisVertical then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
if JoinedLine.JoinConnector1.ID = JoinedConn.ID then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2.ID = JoinedConn.ID then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
end;
end
else
begin
RaiseConn := GetRaiseConn(GLastConnector);
if RaiseConn <> nil then
begin
// Tolik -- 18/04/2018 --
if RaiseConn.ConnectorType = ct_Clear then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
if not JoinedLine.FIsRaiseUpDown then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
if JoinedLine.JoinConnector1 = RaiseConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2 = RaiseConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end
else
begin
for i := 0 to RaiseConn.JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(RaiseConn.JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrthoLinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if FJoinedOrthoLinesByVerticals.IndexOf(JoinedLine) = -1 then
begin
if not JoinedLine.FIsRaiseUpDown then
if not JoinedLine.FisVertical then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
if JoinedLine.JoinConnector1 = JoinedConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
if JoinedLine.JoinConnector2 = JoinedConn then
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
end;
end;
end;
//Tolik 02/04/2018 --
if FJoinedOrthoLinesByVerticals <> nil then
begin
//if Self.ConnectorType = ct_Clear then
begin
for i := 0 to FJoinedOrthoLinesByVerticals.Count - 1 do
begin
JoinedLine := TOrthoLine(FJoinedOrthoLinesByVerticals[i]);
//if not JoinedLine.tmpDrawShadow then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := True;
JoinedConn := TConnectorObject(JoinedLine.JoinConnector1);
{ if JoinedConn.JoinedConnectorsList.Count > 0 then
JoinedConn := TConnectorObject(JoinedConn.JoinedConnectorsList[0]);}
if FModConnsOtherSides.IndexOf(JoinedConn) = -1 then
begin
JoinedLine.tmpShadowP1 := DoublePoint(X, Y);
JoinedLine.tmpShadowP2 := DoublePoint(JoinedLine.ActualPoints[2].x, JoinedLine.ActualPoints[2].y);
end
else
begin
begin
JoinedLine.tmpShadowP1 := DoublePoint(JoinedLine.ActualPoints[1].x, JoinedLine.ActualPoints[1].y);
JoinedLine.tmpShadowP2 := DoublePoint(X, Y);
end
end;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetConnectedLinesDrawShadow', E.Message);
end;
end;
// Tolik -- 22/04/2017 --
procedure TConnectorObject.SkipConnectedLinesDrawShadow;
var
i, j: Integer;
JoinedLine: TOrthoLine;
JoinedConn: TConnectorObject;
RaiseConn: TConnectorObject;
RaiseLine: TOrthoLine;
begin
try
if deleted then
exit;
if Self.ConnectorType = ct_Clear then
begin
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedOrtholinesList[i]);
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end
else
if Self.ConnectorType = ct_NB then
begin
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
// òðàññû ÷åðåç ñ-ï
// IGOR - Òîëÿí áûë çàêîìåíòèë âåñü êóñîê òðàññû ÷åðåç ñ-ï, íî îíî òàêè íàäî
// èáî âîçíèêàþò âèçóàëüíî îòîðâàííûå òðàññû åñëè ðåçêî äåðãàòü çà ÓÃÎøêè ñî ñ/ï
// è ïîëó÷èì òàêîå: "X:\Projects\Ýêñïåðò-ÑÊÑ\! Screens\" bug_SkipConnectedLinesDrawShadow.JPG
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
if not JoinedLine.FIsRaiseUpDown then
begin
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
// Tolik 02/04/2018 -- ïî âåðòèêàëè --
if FJoinedOrthoLinesByVerticals <> nil then
begin
for i := 0 to FJoinedOrthoLinesByVerticals.Count - 1 do
begin
JoinedLine := TOrthoLine(FJoinedOrthoLinesByVerticals[i]);
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
FreeAndNil(FJoinedOrthoLinesByVerticals);
if FModConnsOtherSides <> nil then
FreeAndNil(FModConnsOtherSides);
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SkipConnectedLinesDrawShadow', E.Message);
end;
end;
//
{
procedure TConnectorObject.SkipConnectedLinesDrawShadow;
var
i, j: Integer;
JoinedLine: TOrthoLine;
JoinedConn: TConnectorObject;
RaiseConn: TConnectorObject;
RaiseLine: TOrthoLine;
begin
try
for i := 0 to JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedOrtholinesList[i]);
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
for i := 0 to JoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(JoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
// òðàññû ÷åðåç ñ-ï
RaiseConn := GetRaiseConn(Self);
if RaiseConn <> nil then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
begin
JoinedLine := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
if not JoinedLine.FIsRaiseUpDown then
begin
if JoinedLine.tmpDrawShadow then
begin
JoinedLine.tmpDrawShadow := False;
JoinedLine.Draw(GCadForm.PCad.DEngine, False);
end;
end;
end;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SkipConnectedLinesDrawShadow', E.Message);
end;
end;
}
procedure TConnectorObject.SetDrawFigurePercent(aPercent: Double);
var
MapScale: Double;
Bnd: TDoubleRect;
begin
try
MapScale := GCadForm.PCad.MapScale;
Scale(aPercent / 100, aPercent / 100, ActualPoints[1]);
DrawFigure.Scale(aPercent / 100, aPercent / 100, ActualPoints[1]);
except
on E: Exception do addExceptionToLogEx('TConnectorObject.SetDrawFigurePercent', E.Message);
end;
end;
function TConnectorObject.GetPosWithAngle(aX, aY, aAngle: Double): TDoublePoint;
var
i, j: Integer;
Trace: TOrthoLine;
X1, Y1: Double;
X, Y: Double;
Len_X, Len_Y: double;
Angle: double;
AngleRad: Double;
SetAngle: Double;
SetAngleRad: Double;
PartCount: Integer;
RestCount: Double;
deltaA: Double;
oPoint, cPoint, p: TDoublePoint;
JoinedConn: TConnectorObject;
RaiseConn: TConnectorObject;
begin
try
Result := DoublePoint(aX, aY);
Trace := nil;
if ConnectorType = ct_Clear then
begin
for i := 0 to GTempJoinedOrtholinesList.Count - 1 do
begin
if not TOrthoLine(GTempJoinedOrtholinesList[i]).FIsRaiseUpDown then
begin
Trace := TOrthoLine(GTempJoinedOrtholinesList[i]);
if Trace.JoinConnector1 = GLastConnector then
begin
X1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].y;
end
else
if Trace.JoinConnector2 = GLastConnector then
begin
X1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].y;
end;
Break;
end;
end;
end
else
begin
// íà îäíîì óðîâíå
for i := 0 to GTempJoinedConnectorsList.Count - 1 do
begin
JoinedConn := TConnectorObject(GTempJoinedConnectorsList[i]);
for j := 0 to JoinedConn.JoinedOrtholinesList.Count - 1 do
begin
if not TOrthoLine(JoinedConn.JoinedOrtholinesList[j]).FIsRaiseUpDown then
begin
Trace := TOrthoLine(JoinedConn.JoinedOrtholinesList[j]);
if Trace.JoinConnector1 = JoinedConn then
begin
X1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].y;
end
else
if Trace.JoinConnector2 = JoinedConn then
begin
X1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].y;
end;
end;
end;
if Trace <> nil then
Break;
end;
// ÷åðåç ñ-ï
if Trace = nil then
begin
RaiseConn := GetRaiseConn(GLastConnector);
if RaiseConn <> nil then
begin
for i := 0 to RaiseConn.JoinedOrtholinesList.Count - 1 do
begin
if not TOrthoLine(RaiseConn.JoinedOrtholinesList[i]).FIsRaiseUpDown then
begin
Trace := TOrthoLine(RaiseConn.JoinedOrtholinesList[i]);
if Trace.JoinConnector1 = RaiseConn then
begin
X1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector2).ActualPoints[1].y;
end
else
if Trace.JoinConnector2 = RaiseConn then
begin
X1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].x;
Y1 := TConnectorObject(Trace.JoinConnector1).ActualPoints[1].y;
end;
Break;
end;
end;
end;
end;
end;
if Trace <> nil then
begin
X := GCurrMousePos.x;
Y := GCurrMousePos.y;
Len_X := abs(X1 - X);
Len_Y := abs(Y1 - Y);
AngleRad := Trace.GetAngleInRad(X1, Y1, X, Y);
Angle := AngleRad * 180 / pi;
PartCount := round(Angle) div round(aAngle);
RestCount := round(Angle) mod round(aAngle);
if RestCount > (aAngle / 2) then
PartCount := PartCount + 1;
// set angle
SetAngle := PartCount * aAngle;
SetAngleRad := SetAngle * pi / 180;
deltaA := SetAngleRad - AngleRad;
// ïîâåðíóòü òî÷êó íà óãîë
cPoint := DoublePoint(X1, Y1);
oPoint := DoublePoint(X, Y);
oPoint := DoublePoint(oPoint.x - cpoint.x, oPoint.y - cPoint.y);
p.y := oPoint.x * sin(deltaA) + oPoint.y * cos(deltaA);
p.x := oPoint.x * cos(deltaA) - oPoint.y * sin(deltaA);
p := DoublePoint(p.x + cpoint.x, p.y + cpoint.y);
Result.X := p.x;
Result.Y := p.y;
end;
except
on E: Exception do addExceptionToLogEx('TConnectorObject.GetPosWithAngle', E.Message);
end;
end;
function TOrthoLine.GetAngleInRad(aX1, aY1, aX2, aY2: Double): Double;
var
dx, dy: Double;
ang: Double;
begin
try
Result := 0;
dx := abs(aX2 - aX1);
dy := abs(aY2 - aY1);
if (dx = 0) and (dy = 0) then // error
begin
result := 0;
exit;
end;
if dx = 0 then
begin
if aY2 > aY1 then
result := pi / 2
else
result := pi * 1.5;
end
else
if dy = 0 then
begin
if aX2 > aX1 then
result := 0
else
result := pi;
end
else
begin
ang := arctan(dy / dx);
if (aX2 > aX1) and (aY2 > aY1) then
begin
ang := ang;
end
else
if (aX2 < aX1) and (aY2 > aY1) then
begin
ang := pi - ang;
end
else
if (aX2 < aX1) and (aY2 < aY1) then
begin
ang := pi + ang;
end
else
if (aX2 > aX1) and (aY2 < aY1) then
begin
ang := 2 * PI - ang;
end;
Result := ang;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetAngleInRad', E.Message);
end;
end;
function TOrthoLine.CheckTraceNotHaveConnect(CheckAll: boolean = True): Boolean;
var
Conn1, Conn2: TConnectorObject;
begin
try
Result := True;
Conn1 := TConnectorObject(JoinConnector1);
Conn2 := TConnectorObject(JoinConnector2);
if (Conn1 <> nil) and (Conn2 <> nil) then
begin
if CheckAll then
begin
if CheckFigureByClassName(Conn1, cTConnectorObject) and CheckFigureByClassName(Conn2, cTConnectorObject) then
if ((Conn1.JoinedConnectorsList.Count > 0) or (Conn1.JoinedOrtholinesList.Count > 1)) and
((Conn2.JoinedConnectorsList.Count > 0) or (Conn2.JoinedOrtholinesList.Count > 1)) then
Result := False;
end
else
begin
if CheckFigureByClassName(Conn1, cTConnectorObject) and CheckFigureByClassName(Conn2, cTConnectorObject) then
if ((Conn1.JoinedConnectorsList.Count > 0) or (Conn1.JoinedOrtholinesList.Count > 1)) or
((Conn2.JoinedConnectorsList.Count > 0) or (Conn2.JoinedOrtholinesList.Count > 1)) then
Result := False;
end;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.CheckTraceNotHaveConnect', E.Message);
end;
end;
function TOrthoLine.DrawFigureRemoveCalc(TBGrpCP, OldAP1, OldAP2, NewAP1, NewAP2: TDoublePoint; aH: Double): TDoublePoint;
var
OldA, OldB, OldC: Double;
NewA, NewB, NewC: Double;
OldPart1, OldPart2: Double;
NewPart1, NewPart2: Double;
H, P: Double;
KoefPart: Double;
AngleDegrees: Double;
AngleRad: Double;
dx, dy: Double;
divPoint: TDoublePoint;
begin
try
Result := DoublePoint(0, 0);
if FIsRaiseUpDown then
begin
Result.x := TBGrpCP.x + (NewAP1.x - OldAP1.x);
Result.y := TBGrpCP.y + (NewAP1.y - OldAP1.y);
end
else
begin
OldA := SQRT(SQR(OldAP1.x - OldAP2.x) + SQR(OldAP1.y - OldAP2.y));
if OldA = 0 then
begin
Result.x := DrawFigure.CenterPoint.x;
Result.y := DrawFigure.CenterPoint.y;
Exit;
end;
OldB := SQRT(SQR(OldAP1.x - TBGrpCP.x) + SQR(OldAP1.y - TBGrpCP.y));
if OldB < 0.00001 then
OldB := 0;
OldC := SQRT(SQR(OldAP2.x - TBGrpCP.x) + SQR(OldAP2.y - TBGrpCP.y));
if OldC < 0.00001 then
OldC := 0;
P := (OldA + OldB + OldC) / 2;
if P < 0.00001 then
P := 0;
{
try
H := (2 * SQRT(P * (P - OldA) * (P - OldB) * (P - OldC))) / OldA;
except
H := 0;
end;
}
H := aH;
//
if (H > OldB) or (H > OldC) then
H := 0;
OldPart1 := SQRT(SQR(OldB) - SQR(H));
OldPart2 := SQRT(SQR(OldC) - SQR(H));
/////////////////////////////////////
NewA := SQRT(SQR(NewAP1.x - NewAP2.x) + SQR(NewAP1.y - NewAP2.y));
KoefPart := NewA / OldA;
NewPart1 := KoefPart * OldPart1;
NewPart2 := KoefPart * OldPart2;
NewB := SQRT(SQR(NewPart1) + SQR(H));
NewC := SQRT(SQR(NewPart2) + SQR(H));
// ïîëó÷èòü òî÷êó ïåðåñå÷åíèÿ
//Tolik
//AngleDegrees := GetAngle(NewAP1.x, NewAP1.y, NewAP2.x, NewAP2.y);
AngleDegrees := GetAngleDF(NewAP1.x, NewAP1.y, NewAP2.x, NewAP2.y);
//
// Tolik 22/10/2015 îêðóãëåíèå ìîæåò ñäâèíóòü óãîøêó íå òóäà
if AngleDegrees >= 360 then
AngleDegrees := AngleDegrees - 360;
//
AngleRad := AngleDegrees * pi / 180;
dx := NewPart1 * Cos(AngleRad);
dy := NewPart1 * Sin(AngleRad);
divPoint.x := NewAP1.x + dx;
divPoint.y := NewAP1.y + dy;
// ïîëó÷èòü òî÷êó äëÿ ïåðåìåùåíèÿ
AngleDegrees := AngleDegrees + 90;
// Tolik 22/10/2015 îêðóãëåíèå ìîæåò ñäâèíóòü óãîøêó íå òóäà
if AngleDegrees >= 360 then
begin
AngleDegrees := AngleDegrees - 360;
end;
AngleRad := AngleDegrees * pi / 180;
dx := H * Cos(AngleRad);
dy := H * Sin(AngleRad);
if (AngleDegrees >= 0) and (AngleDegrees < 180) then
begin
dx := -dx;
dy := -dy;
end;
// åñëè ïîâîðîò íà 180 òî ïåðåáðîñèòü ëèíèþ íà äðóãóþ ñòîðîíó
if FIsRotated then
begin
dx := -dx;
dy := -dy;
end;
Result.x := divPoint.x + dx;
Result.y := divPoint.y + dy;
end;
except
Result.x := DrawFigure.CenterPoint.x;
Result.y := DrawFigure.CenterPoint.y;
// on E: Exception do addExceptionToLogEx('TOrthoLine.DrawFigureRemoveCalc', E.Message);
end;
end;
function TOrthoLine.CalcHDrawFigure: Double;
var
A, B, C: Double;
H, P: Double;
KoefPart: Double;
begin
try
A := SQRT(SQR(ActualPoints[1].x - ActualPoints[2].x) + SQR(ActualPoints[1].y - ActualPoints[2].y));
if A = 0 then
begin
Result := 0;
Exit;
end;
B := SQRT(SQR(ActualPoints[1].x - DrawFigure.CenterPoint.x) + SQR(ActualPoints[1].y - DrawFigure.CenterPoint.y));
if B < 0.00001 then
B := 0;
C := SQRT(SQR(ActualPoints[2].x - DrawFigure.CenterPoint.x) + SQR(ActualPoints[2].y - DrawFigure.CenterPoint.y));
if C < 0.00001 then
C := 0;
P := (A + B + C) / 2;
if P < 0.00001 then
P := 0;
//
try
H := (2 * SQRT(P * (P - A) * (P - B) * (P - C))) / A;
except
H := 0;
end;
Result := H;
except
Result := 0;
// on E: Exception do addExceptionToLogEx('TOrthoLine.CalcHDrawFigure', E.Message);
end;
end;
function TOrthoLine.CalcHCaptionsGroup: Double;
var
A, B, C: Double;
H, P: Double;
KoefPart: Double;
begin
try
A := SQRT(SQR(ActualPoints[1].x - ActualPoints[2].x) + SQR(ActualPoints[1].y - ActualPoints[2].y));
if A = 0 then
begin
Result := 0;
Exit;
end;
// Tolik -- 22/12/2016--
// if CaptionsGroup <> nil then
if ((CaptionsGroup <> nil) and (tmpCaptionsGroup <> nil)) then
begin
if CaptionsGroup <> nil then
B := SQRT(SQR(ActualPoints[1].x - CaptionsGroup.CenterPoint.x) + SQR(ActualPoints[1].y - CaptionsGroup.CenterPoint.y))
else
B := SQRT(SQR(ActualPoints[1].x - tmpCaptionsGroup.CenterPoint.x) + SQR(ActualPoints[1].y - tmpCaptionsGroup.CenterPoint.y));
if B < 0.00001 then
B := 0;
if CaptionsGroup <> nil then
C := SQRT(SQR(ActualPoints[2].x - CaptionsGroup.CenterPoint.x) + SQR(ActualPoints[2].y - CaptionsGroup.CenterPoint.y))
else
C := SQRT(SQR(ActualPoints[2].x - tmpCaptionsGroup.CenterPoint.x) + SQR(ActualPoints[2].y - tmpCaptionsGroup.CenterPoint.y));
end
else
begin
// Tolik -- 04/04/2017 --
if ((CaptionsGroup <> nil) and (tmpCaptionsGroup = nil)) then
begin
B := SQRT(SQR(ActualPoints[1].x - CaptionsGroup.CenterPoint.x) + SQR(ActualPoints[1].y - CaptionsGroup.CenterPoint.y));
if B < 0.00001 then
B := 0;
C := SQRT(SQR(ActualPoints[2].x - CaptionsGroup.CenterPoint.x) + SQR(ActualPoints[2].y - CaptionsGroup.CenterPoint.y));
end
else
begin
//
Result := 0;
Exit;
end;
end;
if C < 0.00001 then
C := 0;
P := (A + B + C) / 2;
if P < 0.00001 then
P := 0;
//
try
H := (2 * SQRT(P * (P - A) * (P - B) * (P - C))) / A;
except
H := 0;
end;
Result := H;
except
Result := 0;
// on E: Exception do addExceptionToLogEx('TOrthoLine.CalcHCaptionsGroup', E.Message);
end;
end;
function TOrthoLine.GetBreakPointOnShadowTrace(P1, P2: TDoublePoint; aCtrl: Boolean): TDoublePoint;
begin
try
// ãîðèçîíòàëü - âåðòèêàëü
if aCtrl then
begin
Result.x := P1.x;
Result.y := P2.y;
end
else
// âåðòèêàëü - ãîðèçîíòàëü
begin
Result.x := P2.x;
Result.y := P1.y;
end;
except
on E: Exception do addExceptionToLogEx('TOrthoLine.GetBreakPointOnShadowTrace', E.Message);
end;
end;
function TOrthoLine.ConnectorByNum(aNum: Integer): TConnectorObject;
begin
Result := nil;
case aNum of
1: Result := TConnectorObject(JoinConnector1); // ñîåäèíèòåëü 1
2: Result := TConnectorObject(JoinConnector2); // ñîåäèíèòåëü 2
end;
end;
procedure TOrthoLine.SetNewLength(aVal: Double);
var
i: Integer;
p1Idx, p2Idx: Integer;
Conn1, Conn2: TConnectorObject;
//MConn: TConnectorObject; // Move Connector
//Conn: TConnectorObject; // Connector
CurrPt, NewPt: TDoublepoint;
dx, dy: Double;
begin
if FLineRaiseType = lrt_None then
begin
Conn1 := ConnectorByNum(1);
Conn2 := ConnectorByNum(2);
if Assigned(Conn1) = Assigned(Conn2) then
if Conn1.ActualZOrder[1] = Conn2.ActualZOrder[1] then
begin
// Åñëè âòîðàÿ òî÷êà áëèæå ê íà÷àëó êîîðäèíàò
if GetLineLength(Conn2.ActualPoints[1], Doublepoint(0,0)) < GetLineLength(Conn1.ActualPoints[1], Doublepoint(0,0)) then
ExchangeObjects(Conn1, Conn2);
NewPt := MPoint(Conn2.ActualPoints[1], Conn1.ActualPoints[1], -1*(aVal-FLength) * 1000/TPowerCad(Owner).MapScale);
//NewPt := MPoint(Conn2.ActualPoints[1], Conn1.ActualPoints[1], -1*(aVal-FLength));
CurrPt := Conn2.ActualPoints[1];
dx := NewPt.x - CurrPt.x;
dy := NewPt.y - CurrPt.y;
//Tolik
//Conn2.Move(dx, dy);
if Conn2.JoinedConnectorsList.Count = 0 then
Conn2.Move(dx, dy)
else
begin
for i := 0 to Conn2.JoinedConnectorsList.Count - 1 do
begin
if TConnectorObject(Conn2.JoinedConnectorsList[i]).ConnectorType = ct_NB then
begin
TConnectorObject(Conn2.JoinedConnectorsList[i]).Move(dx,dy);
Break; //// BREAK ////;
end;
end;
end;
//
if Assigned(TPowerCad(Owner).OnFigureMoved) then
TPowerCad(Owner).OnFigureMoved(Owner, Self, dx, dy);
end;
end;
end;
procedure TConnectorObject.DeSelect;
begin
try
inherited;
//DeSelectSCSFigureInPM(ID);
except
on E: Exception do AddExceptionToLogEx('TConnectorObject.DeSelect', E.Message);
end;
end;
constructor TFigureGrpMod.create(LHandle: Integer; aOwner: TComponent);
begin
try
inherited;
fFromApproach := nil;
fFromHouse := nil;
fRMode := false;
fTraceMod := false;
fHasParent := true;
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.create', E.Message);
end;
end;
function TFigureGrpMod.EndRotate(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): boolean;
var
s: Integer;
a1, a2, a: Double;
isCreate: Boolean;
begin
try
if (fFromApproach = nil) or (fFromHouse = nil) then
exit;
if mp.SeqNbr = 5 then
begin
RotPoint := TraceFigure.RotPoint;
end
else
begin
a1 := GetRadOfLine(rotPoint,DoublePoint(mp.CoordX ,mp.CoordY));
a2 := GetRadOfLine(rotPoint,DoublePoint(x,y));
a := a2-a1;
s := sign(a);
a := abs(a);
if abs(a - 0) < (pi / 180) * 5 then
a := 0;
if abs(a - pi / 2) < (pi / 180) * 5 then
a := pi / 2;
if abs(a - 3 * (pi / 2)) < (pi / 180) * 5 then
a := 3 * (pi / 2);
if abs(a - pi) < (pi / 180) * 5 then
a := pi;
if abs(a - 2 * pi) < (pi / 180) * 5 then
a := 2 * pi;
Rotate(s * a, RotPoint);
isCreate := True;
{ if not fFromHouse.IsPointInRegion(ap1.x, ap1.y) then
isCreate := False;
if not fFromHouse.IsPointInRegion(ap2.x, ap2.y) then
isCreate := False;
if not fFromHouse.IsPointInRegion(ap3.x, ap3.y) then
isCreate := False;
if not fFromHouse.IsPointInRegion(ap4.x, ap4.y) then
isCreate := False; }
//Tolik
if not fFromHouse.IsPointInRegionByRegObj(ap1.x, ap1.y) then
isCreate := False;
if not fFromHouse.IsPointInRegionByRegObj(ap2.x, ap2.y) then
isCreate := False;
if not fFromHouse.IsPointInRegionByRegObj(ap3.x, ap3.y) then
isCreate := False;
if not fFromHouse.IsPointInRegionByRegObj(ap4.x, ap4.y) then
isCreate := False;
//
if not isCreate then
begin
ShowMessage(cHouse_Mes1);
Rotate(- s * a, RotPoint);
end;
end;
rMode := false;
fRMode := false;
Deselect;
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.EndRotate', E.Message);
end;
end;
function TFigureGrpMod.TraceModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x, y: double;
Shift: TShiftState): boolean;
var
GRect: TDoubleRect;
isTrace: Boolean;
p1_in: boolean;
p2_in: boolean;
begin
try
if (fFromApproach = nil) or (fFromHouse = nil) then
exit;
If MP.SeqNbr in [3,4,5] then
begin
{ p1_in := fFromHouse.IsPointInRegion(x,TraceFigure.ActualPoints[2].y);
p2_in := fFromHouse.IsPointInRegion(x,TraceFigure.ActualPoints[3].y);}
//Tolik
p1_in := fFromHouse.IsPointInRegionByRegObj(x,TraceFigure.ActualPoints[2].y);
p2_in := fFromHouse.IsPointInRegionByRegObj(x,TraceFigure.ActualPoints[3].y);
//
if p1_in and p2_in then
begin
TraceFigure.ActualPoints[2] := DoublePoint(x,TraceFigure.ActualPoints[2].y);
TraceFigure.ActualPoints[3] := DoublePoint(x,TraceFigure.ActualPoints[3].y);
end;
end
else
if MP.SeqNbr in [1,8,7] then
begin
{ p1_in := fFromHouse.IsPointInRegion(x,TraceFigure.ActualPoints[1].y);
p2_in := fFromHouse.IsPointInRegion(x,TraceFigure.ActualPoints[4].y);}
//Tolik
p1_in := fFromHouse.IsPointInRegionByRegObj(x,TraceFigure.ActualPoints[1].y);
p2_in := fFromHouse.IsPointInRegionByRegObj(x,TraceFigure.ActualPoints[4].y);
//
if p1_in and p2_in then
begin
TraceFigure.ActualPoints[1] := DoublePoint(x,TraceFigure.ActualPoints[1].y);
TraceFigure.ActualPoints[4] := DoublePoint(x,TraceFigure.ActualPoints[4].y);
end;
end;
If mp.SeqNbr in [1,2,3] then
begin
{p1_in := fFromHouse.IsPointInRegion(TraceFigure.ActualPoints[1].x,y);
p2_in := fFromHouse.IsPointInRegion(TraceFigure.ActualPoints[2].x,y);}
//Tolik
p1_in := fFromHouse.IsPointInRegionByRegObj(TraceFigure.ActualPoints[1].x,y);
p2_in := fFromHouse.IsPointInRegionByRegObj(TraceFigure.ActualPoints[2].x,y);
//
if p1_in and p2_in then
begin
TraceFigure.ActualPoints[1] := DoublePoint(TraceFigure.ActualPoints[1].x,y);
TraceFigure.ActualPoints[2] := DoublePoint(TraceFigure.ActualPoints[2].x,y);
end;
end
else
if mp.SeqNbr in [5,6,7] then
begin
{p1_in := fFromHouse.IsPointInRegion(TraceFigure.ActualPoints[3].x,y);
p2_in := fFromHouse.IsPointInRegion(TraceFigure.ActualPoints[4].x,y);}
//Tolik
p1_in := fFromHouse.IsPointInRegionByRegObj(TraceFigure.ActualPoints[3].x,y);
p2_in := fFromHouse.IsPointInRegionByRegObj(TraceFigure.ActualPoints[4].x,y);
//
if p1_in and p2_in then
begin
TraceFigure.ActualPoints[3] := DoublePoint(TraceFigure.ActualPoints[3].x,y);
TraceFigure.ActualPoints[4] := DoublePoint(TraceFigure.ActualPoints[4].x,y);
end;
end;
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.TraceModification', E.Message);
end;
end;
function TFigureGrpMod.EndModification(CadControl: Pointer; mp: TModPoint; TraceFigure: TFigure; x, y: double;
Shift: TShiftState): boolean;
var
Bnd: TDoubleRect;
begin
try
if (fFromApproach = nil) or (fFromHouse = nil) then
exit;
inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
fTraceMod := False;
Deselect;
Bnd := GetBoundRect;
fFromApproach.GrpSizeX := Bnd.Right - Bnd.Left;
fFromApproach.GrpSizeY := Bnd.Bottom - Bnd.Top;
fFromApproach.FOriginalSizeX := fFromApproach.GrpSizeX;
fFromApproach.FOriginalSizeY := fFromApproach.GrpSizeY;
fFromApproach.ActualPoints[1] := DoublePoint((Bnd.Left + Bnd.Right) / 2, (Bnd.Top + Bnd.Bottom) / 2);
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.EndModification', E.Message);
end;
end;
procedure TFigureGrpMod.move(deltax, deltay: double);
begin
try
inherited;
except
on E: Exception do AddExceptionToLogEx('TFigureGrpMod.move', E.Message);
end;
end;
function TConnectorObject.IsApproachInHouse(adeltax, adeltay: double): Boolean;
var
isMove: boolean;
p1, p2, p3, p4: TDoublePoint;
begin
try
isMove := True;
if DrawFigure <> nil then
begin
p1 := DoublePoint(ActualPoints[1].x - GrpSizeX / 2, ActualPoints[1].y - GrpSizeY / 2);
p2 := DoublePoint(ActualPoints[1].x + GrpSizeX / 2, ActualPoints[1].y - GrpSizeY / 2);
p3 := DoublePoint(ActualPoints[1].x + GrpSizeX / 2, ActualPoints[1].y + GrpSizeY / 2);
p4 := DoublePoint(ActualPoints[1].x - GrpSizeX / 2, ActualPoints[1].y + GrpSizeY / 2);
end
else
begin
p1 := ActualPoints[1];
p2 := ActualPoints[1];
p3 := ActualPoints[1];
p4 := ActualPoints[1];
end;
{ if not fHouse.IsPointInRegion(p1.x + adeltax, p1.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegion(p2.x + adeltax, p2.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegion(p3.x + adeltax, p3.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegion(p4.x + adeltax, p4.y + adeltay) then
isMove := False;}
//Tolik
if not fHouse.IsPointInRegionByRegObj(p1.x + adeltax, p1.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegionByRegObj(p2.x + adeltax, p2.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegionByRegObj(p3.x + adeltax, p3.y + adeltay) then
isMove := False;
if not fHouse.IsPointInRegionByRegObj(p4.x + adeltax, p4.y + adeltay) then
isMove := False;
//
Result := isMove;
except
on E: Exception do AddExceptionToLogEx('TConnectorObject.IsApproachInHouse', E.Message);
end;
end;
procedure TConnectorObject.RotateByParams(aAngleRad: Double; aPoint: TDoublePoint);
var
PointObject: TConnectorObject;
//AngleRad: Double;
AngleDeg: Double;
Bnd: TDoubleRect;
FFigure: TFigure;
CurrCaptionAngle: Double;
DrawFigureAngle: Double;
SavedPtCount: Integer;
begin
PointObject := Self;
AngleDeg := RadToDeg(aAngleRad);
if (AngleDeg > 360) or (AngleDeg < 0) then
begin
AngleDeg := CorrectAngle(AngleDeg);
aAngleRad := DegToRad(AngleDeg);
end;
if CheckTrunkObject(PointObject) then
begin
RotateTrunkObject(PointObject, AngleDeg);
Exit;
end;
//AngleRad := Angle / 180 * pi;
SavedPtCount := PointCount;
PointCount := 1;
try
PointObject.Rotate(aAngleRad, aPoint);
finally
PointCount := SavedPtCount;
end;
PointObject.DrawFigure.Rotate(aAngleRad, aPoint); // PointObject.CenterPoint
PointObject.FDrawFigureAngle := PointObject.FDrawFigureAngle + aAngleRad;
if PointObject.FDrawFigureAngle >= 2 * pi then
PointObject.FDrawFigureAngle := PointObject.FDrawFigureAngle - 2 * pi;
// Êîððåêòèðóåì óãîë åñëè íå â 0..360
DrawFigureAngle := RadToDeg(PointObject.FDrawFigureAngle);
if (DrawFigureAngle > 360) or (DrawFigureAngle < 0) then
begin
DrawFigureAngle := CorrectAngle(DrawFigureAngle);
PointObject.FDrawFigureAngle := DegToRad(DrawFigureAngle);
end;
// Tolik --
//Bnd := PointObject.DrawFigure.GetBoundRect;
Bnd := PointObject.DrawFigure.GetBoundRectWithoutAutoCreatedFigures;
//
PointObject.GrpSizeX := Bnd.Right - Bnd.Left;
PointObject.GrpSizeY := Bnd.Bottom - Bnd.Top;
//
// Åñëè íå modFigure â ðåæèìå âðàùåíèÿ
if Not FIsRotating then
begin
{CurrCaptionAngle := 0; //#From Oleg# //14.09.2010
if PointObject.FCaptionsViewType = cv_Right then
CurrCaptionAngle := 0;
if PointObject.FCaptionsViewType = cv_Down then
CurrCaptionAngle := 90;
if PointObject.FCaptionsViewType = cv_Left then
CurrCaptionAngle := 180;
if PointObject.FCaptionsViewType = cv_Up then
CurrCaptionAngle := 270;
CurrCaptionAngle := CurrCaptionAngle + Angle;
CurrCaptionAngle := round(CurrCaptionAngle) mod 360;}
if (AngleDeg >= 0) and (AngleDeg <= 45) then
PointObject.FCaptionsViewType := cv_Right
else
if (AngleDeg > 45) and (AngleDeg < 135) then
PointObject.FCaptionsViewType := cv_Down
else
if (AngleDeg >= 135) and (AngleDeg <= 225) then
PointObject.FCaptionsViewType := cv_Left
else
if (AngleDeg > 225) and (AngleDeg < 315) then
PointObject.FCaptionsViewType := cv_Up
else
if (AngleDeg >= 315) and (AngleDeg <= 360) then
PointObject.FCaptionsViewType := cv_Right;
Self.DefRaizeDrawFigurePos;
//
RefreshCAD(GCadForm.PCad);
PointObject.ReCreateCaptionsGroup(false, false);
end;
end;
procedure TConnectorObject.DefRaizeDrawFigurePos;
var
RaiseLine: TOrthoLine;
deltax, deltay: Double;
BlockBnd: TDoubleRect;
DrawFigureBnd: TDoubleRect;
DrawFigureKoeff: Double;
BasisPoint, CrossPoint1, CrossPoint2: TDoublePoint;
begin
RaiseLine := GetRaiseLine(Self);
if RaiseLine <> nil then
begin
if not RaiseLine.Deleted then //Tolik 27/11/2020 --
begin
if RaiseLine.FSingleBlock.InFigures.Count = 0 then
begin
BlockBnd := RaiseLine.FSingleBlock.GetBoundRect;
end
else
begin
BlockBnd := TFigure(RaiseLine.FSingleBlock.InFigures[0]).GetBoundRect;
end;
DrawFigureBnd := RaiseLine.DrawFigure.GetBoundRect;
DrawFigureKoeff := RaiseLine.FDrawFigurePercent/100;
// GetRaiseConn(Self).FObjectFromRaise
if RaiseLine.FObjectFromRaisedLine <> nil then
begin
BasisPoint := GetBasisPointByObjFromRaise(RaiseLine.FObjectFromRaisedLine);
//if FObjectFromRaisedLine.DrawFigure.InFigures.Count > 0 then
begin
BasisPoint.x := BasisPoint.x - 1;
BasisPoint.y := BasisPoint.y + 1;
end;
end
else
begin
BasisPoint.x := (RaiseLine.ActualPoints[1].x + RaiseLine.ActualPoints[2].x) / 2;
BasisPoint.y := (RaiseLine.ActualPoints[1].y + RaiseLine.ActualPoints[2].y) / 2;
end;
CrossPoint1.x := BasisPoint.x;
CrossPoint1.y := BasisPoint.y;
//CrossPoint2.x := BasisPoint.x + Round(4*DrawFigureKoeff);
//CrossPoint2.y := BasisPoint.y - Round(4*DrawFigureKoeff);
CrossPoint2.x := BasisPoint.x + Round4(4 * DrawFigureKoeff);
CrossPoint2.y := BasisPoint.y - Round4(4 * DrawFigureKoeff);
RaiseLine.DrawFigure.ActualPoints[1] := DoublePoint((DrawFigureBnd.Left + DrawFigureBnd.Right) / 2,
(BlockBnd.Top + BlockBnd.Bottom) / 2);
deltax := BasisPoint.x - RaiseLine.DrawFigure.ActualPoints[1].x;
deltay := BasisPoint.y - RaiseLine.DrawFigure.ActualPoints[1].y;
deltax := deltax + 2.7 * DrawFigureKoeff;
deltay := deltay - 2.7 * DrawFigureKoeff;
//FDrawFigure := TFigureGrpMod(GCadForm.PCad.AddCustomFigure (GLN(LayerHandle), DrawFigure, False));
RaiseLine.DrawFigure.move(deltax, deltay);
//RaiseLine.DrawFigure.LockModify := True;
//RaiseLine.MoveTextBox(RaiseLine.DrawFigure, CrossPoint1, CrossPoint2, True);
end;
end;
end;
{Procedure TConnectorObject.Rotate(aAngle: Double; cPoint: TDoublePoint);
var
Bnd: TDoubleRect;
DrawFigureAngle: Double;
PointObject: TConnectorObject;
begin
inherited;
PointObject := Self;
PointObject.DrawFigure.Rotate(aAngle, cPoint); // PointObject.CenterPoint
PointObject.FDrawFigureAngle := PointObject.FDrawFigureAngle + aAngle;
if PointObject.FDrawFigureAngle >= 2 * pi then
PointObject.FDrawFigureAngle := PointObject.FDrawFigureAngle - 2 * pi;
// Êîððåêòèðóåì óãîë åñëè íå â 0..360
DrawFigureAngle := RadToDeg(PointObject.FDrawFigureAngle);
if (DrawFigureAngle > 360) or (DrawFigureAngle < 0) then
begin
DrawFigureAngle := CorrectAngle(DrawFigureAngle);
PointObject.FDrawFigureAngle := DegToRad(DrawFigureAngle);
end;
Bnd := PointObject.DrawFigure.GetBoundRect;
PointObject.GrpSizeX := Bnd.Right - Bnd.Left;
PointObject.GrpSizeY := Bnd.Bottom - Bnd.Top;
end;}
procedure TSCSFigureGrp.getboundsWithOutGrpSize(var figMaxX, figMaxY,
figMinX, figMinY: double);
begin
getbounds(figMaxX, figMaxY, figMinX, figMinY);
end;
{ TCabinetExt }
constructor TCabinetExt.create(Points: TDoublePointArr; w, s, c, abrs, abrc: integer; row: integer; aClosed: Boolean;
LHandle: LongInt; aDrawStyle: TDrawStyle; aOwner: TComponent);
var
p: TDoublePoint;
begin
try
Inherited;
FSCSID := -1;
FIndex := -1;
FType := ct_Virtual;
FNumberObject := nil;
FNumberObjectIndex := -1;
//Tolik
FCabinetSquare := -1;
//
Visible := False;
if aDrawStyle <> dsTrace then
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
CabinetConfig.aWorkRoom := true;
cabinetconfig.POintCount := Self.PointCount;
CabinetConfig.NumRadius := 3;
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.create', E.Message);
end;
end;
class function TCabinetExt.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
var
ObjParams: TObjectParams;
GetSCSID, GetIndex: Integer;
points: TDoublePointArr;
a: integer;
cad: TPCDrawing;
begin
try
// ñîçäàíèå ñ òóëñû íà ïàíåëè ÊÀÄ
Result := nil;
if Shadow.PointCount < 4 then
exit;
// *UNDO*
if GCadForm.FCanSaveForUndo then
begin
GCadForm.SaveForUndo(uat_None, True, False);
GCadForm.FCanSaveForUndo := False;
end;
SetLength(points,Shadow.PointCount-2);
for a := 1 to Shadow.PointCount - 2 do
points[a - 1] := Shadow.ActualPoints[a];
cad := TPCDrawing(aOwner);
Result := TCabinetExt.create(points, 2, ord(psSolid), clMaroon, ord(bsClear), clBlack, 0, true, LHandle, mydsNormal, aOwner);
TCabinetExt(Result).FType := ct_Visual;
ObjParams := CreateRoomFromCADToPM(GCadForm.FCADListID);
GetSCSID := ObjParams.ID;
GetIndex := ObjParams.MarkID;
TCabinetExt(Result).FSCSID := GetSCSID;
TCabinetExt(Result).ID := GetSCSID; //08.11.2011
TCabinetExt(Result).FIndex := GetIndex;
TCabinetExt(Result).FNumberObject := CreateNumberObjectOnCAD(TCabinetExt(Result), GCadForm.FShowCabinetsNumbers);
TCabinetExt(Result).FNumberObject.IsCabinetExt := True;
TCabinetExt(Result).FNumberObject.FPositionIndex := 1;
TCabinetExt(Result).FNumberObject.CircleRadius := 3;
//Tolik
TCabinetExt(Result).FCabinetSquare := -1;
//
GCadForm.PCad.AddCustomFigure (GLN(LHandle), Result, False);
GCadForm.AddSCSFigure(Result); //08.11.2011
MoveObjectsToCabinetOnCreate(TCabinetExt(Result));
if GCadForm.FShowCabinetsBounds then
TCabinetExt(Result).Visible := True;
Result := nil;
// *UNDO*
GCadForm.FCanSaveForUndo := True;
TF_CAD(TPowerCad(aOwner).Owner).FNeedUpdateCheckedFigures := True;
//Tolik
SetLength(points,0);
//
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.CreateFromShadow', E.Message);
end;
end;
procedure TCabinetExt.Delete;
var
AFigure: TFigure;
j: Integer;
begin
try
if not Self.Deleted then
begin
if Owner <> nil then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).RemoveSCSFigure(Self);
Deleted := True;
// Tolik
//GCadForm.FRemFigures.Add(Self);
TF_CAD(TPowerCad(Owner).Owner).FRemFigures.Add(Self);
//
if FNumberObject <> nil then
FNumberObject.Delete;
//Ïðîâåðêà ôèãóðû íà âõîæäåíèå â êàáèíåò
GCadForm.UpdateCheckedFigures;
for j := 0 to GCadForm.FCheckedFigures.Count - 1 do
begin
aFigure := TFigure(GCadForm.FCheckedFigures[j]);
GCadForm.Pcad.CheckFigureInsideCabinet(GCadForm.FCheckedFigures, aFigure);
end;
end;
except
on E: Exception do addExceptionToLogEx('TCabinetExt.Delete', E.Message);
end;
end;
procedure TCabinetExt.Draw(DEngine: TPCDrawEngine; isFlue: Boolean);
var
CabCP: TDoublePoint;
CabCP2: TDoublePoint;
ConnPoint: TDoublePoint;
aHRGN: HRGN;
aFont: TFont;
SCSList: TSCSList;
RoomObject: TSCSCatalog;
aText: string;
xCanvas: TMetafileCanvas;
h, w: double;
aFontSize: integer;
aFontName: string;
MaxX, MaxY, MinX, MinY: Double;
begin
try
if fType = ct_Visual then
if Visible then
begin
aText := '';
SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(TF_CAD(TPowerCad(Owner).Owner).FCADListID);
if SCSList <> nil then
begin
RoomObject := SCSList.GetCatalogFromReferencesBySCSID(self.FSCSID);
if RoomObject <> nil then
aText := RoomObject.NameShort;
end;
if (aText <> '')and(CabinetConfig.CabinetSignPos <> 0) then
begin
aFont := TFont.Create;
aFont.Name := TF_CAD(TPowerCad(Owner).Owner).PCad.Font.Name; //TF_CAD(TPowerCad(Owner).Owner).Font.Name;
aFont.Size := 10;
aFont.color := clMaroon; //clBlack;
aFontSize := aFont.Size;
aFontName := aFont.Name;
GetTextSize(aFontSize, [], aFontName, aText, nil, h, w);
ConnPOint := Self.ActualPoints[CabinetConfig.CabinetSignPos];
CabCP := ConnPOint;
Self.getbounds(MaxX, MaxY, MinX, MinY);
{CabCP2.x := CabCP.x + w;
CabCP2.y := CabCP.y - h/2; }
if CabCP.x = MaxX then
begin
CabCP2.x := CabCP.x - w;
end
else
begin
CabCP2.x := CabCP.x + w;
end;
if ((CabCP.y - h/2)<MinY) then
CabCP2.y := CabCP.y + h + 1.5
else
CabCP2.y := CabCP.y - h/2;
DEngine.DrawLabel(CabCP, CabCP2, aText, aFont, h, clNone, RoundUp(w), ord(psClear), clNone, ord(bsClear), aHRGN);
FreeAndNil(aFont);
end;
inherited;
end;
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.Draw', E.Message);
end;
end;
function TCabinetExt.Edit: Boolean;
begin
Result := False;
ShowRoomPropsInCAD(GCadForm.FCADListID, FSCSID);
end;
function TCabinetExt.EndModification(CadControl: Pointer; mp: TModPoint;
TraceFigure: TFigure; x, y: Double; Shift: TShiftState): boolean;
//var
// CP: TDoublePoint;
// MaxX, MaxY, MinX, MinY: Double;
begin
try
Result := false;
Result := inherited EndModification(CadControl, mp, TraceFigure, x, y, Shift);
//if FNumberObject <> nil then
// begin
// getbounds(MaxX, MaxY, MinX, MinY);
// CP.x := (MinX + MaxX) / 2;
// CP.y := (MinY + MaxY) / 2;
// FNumberObject.move(CP.x - FNumberObject.CenterPoint.x, CP.y - FNumberObject.CenterPoint.y);
// end;
CenterNumberObject;
MoveObjectsToCabinetOnMove(Self);
except
on E: Exception do addExceptionToLogEx('TCabinet.EndModification', E.Message);
end;
end;
function TCabinetExt.isPointIn(x, y: Double): boolean;
var
a : integer;
lp: Integer;
begin
try
result := false;
if closed then
lp := PointCount
else
lp := pointcount-1;
For a := 1 to lp do
begin
if IsPointInSegment(a, x, y) then
begin
result := true;
SelectedPoint := a;
exit;
end;
end;
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.isPointIn', E.Message);
end;
end;
function TCabinetExt.isPointInMod(x, y: Double): boolean;
var
i, count: Integer;
points: TDoublePointArr;
begin
try
Result := false;
{if IsPointInRegion(x, y) then
result := true;}
//Tolik
result := IsPointInRegionByRegObj(x, y);
//
if not Result then
begin
count := Length(actuals);
SetLength(points, count);
for i := 0 to count - 1 do
points[i] := ActualPoints[i + 1];
if PtInPolygon(Points, DoublePoint(x, y)) then
result := true;
end;
//Tolik
SetLength(points, 0);
//
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.isPointInMod', E.Message);
end;
end;
procedure TCabinetExt.Move(deltax, deltay: Double);
begin
try
inherited;
if FNumberObject <> nil then
if not FNumberObject.Selected then
FNumberObject.move(deltax, deltay);
MoveObjectsToCabinetOnMove(Self);
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.Move', E.Message);
end;
end;
procedure TCabinetExt.RaiseProperties(CadFigList: TList);
var
LHandle9: Integer;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
//Tolik
// FiguresList := GCadForm.PCad.Figures;
FiguresList := CadFigList;
//
if FNumberObjectIndex = - 1 then
FNumberObject := Nil
else
begin
FNumberObject := TCabinetNumber(FiguresList.Items[FNumberObjectIndex]);
FNumberObject.Visible := CabinetConfig.AworkRoom;
FNumberObject.CircleRadius := CabinetConfig.NumRadius;
FNumberObject.IsCabinetExt := True;
FNumberObject.FPositionIndex := CabinetConfig.CabinetNumPos;
end;
Visible := False;
// åñëè íà ñòàðîì ñëîå - ïåðåíåñòè íà íîâûé
LHandle9 := GCadForm.PCad.GetLayerHandle(9);
if LayerHandle <> LHandle9 then
begin
LayerHandle := LHandle9;
if FNumberObject <> nil then
FNumberObject.LayerHandle := LHandle9;
end;
except
on E: Exception do addExceptionToLogEx('TCabinet.RaiseProperties', E.Message);
end;
end;
procedure TCabinetExt.select;
begin
try
if fType = ct_Visual then
if Visible then
inherited;
except
on E: Exception do AddExceptionToLogEx('TCabinetExt.select', E.Message);
end;
end;
procedure TCabinetExt.SetPropertyFromStream(xCode: Byte; data: Pointer;
size: Integer);
var
xInt: Integer;
xBool: Boolean;
xDbl: Double;
begin
try
inherited;
case xCode of
30: begin
xInt := pInt(data)^;
FSCSID := xInt;
FFalseFloorHeight := GCadForm.FFalseFloorHeight;
ID := xInt; //08.11.2011
if ID <> 0 then //08.11.2011
TF_CAD(TPowerCad(Owner).Owner).AddSCSFigure(Self);
end;
31: begin
xInt := pInt(data)^;
FIndex := xInt;
end;
32: begin
xInt := pInt(data)^;
FType := TCabinetType(xInt);
end;
33: begin
xInt := pInt(data)^;
FNumberObjectIndex := xInt;
end;
230:begin
xDbl := pDouble(data)^;
FFalseFloorHeight := xDbl;
end;
240:begin
CabinetConfig := PRoomConfig(data)^;
end;
241:begin
xDbl := pDouble(data)^;
FCabinetSquare := xDbl;
end;
end;
TF_CAD(TPowerCad(Owner).Owner).FNeedUpdateCheckedFigures := True;
except
on E: Exception do addExceptionToLogEx('TCabinetExt.SetPropertyFromStream', E.Message);
end;
end;
procedure TCabinetExt.WriteToStream(Stream: TStream);
var
xInt: Integer;
xBool: Boolean;
xDbl: Double;
FiguresList: TList;
begin
try
if GCadForm.FUndoStatus then
FiguresList := GCadForm.FUndoFiguresList
else
FiguresList := GCadForm.PCad.Figures;
inherited;
xInt := FSCSID;
WriteField(30, Stream, xInt, sizeof(xInt));
xInt := FIndex;
WriteField(31, Stream, xInt, sizeof(xInt));
xInt := Ord(FType);
WriteField(32, Stream, xInt, sizeof(xInt));
if FNumberObject <> nil then
begin
xInt := FiguresList.IndexOf(FNumberObject);
WriteField(33, Stream, xInt, sizeof(xInt));
end
else
begin
xInt := -1;
WriteField(33, Stream, xInt, sizeof(xInt));
end;
xDbl := FFalseFloorHeight;
WriteField(230, Stream, xDbl, sizeof(xDbl));
WriteField(240, Stream, CabinetConfig, sizeof(CabinetConfig));
//Tolik
WriteField(241, Stream, FCabinetSquare, sizeof(FCabinetSquare));
//
except
on E: Exception do addExceptionToLogEx('TCabinetExt.WriteToStream', E.Message);
end;
end;
procedure TCabinetExt.Initialize;
begin
inherited;
FClassIndex := ciCabinetExt;
CabinetConfig.aWorkRoom := true;
cabinetconfig.IsCabinetExt := True;
cabinetconfig.POintCount := Self.PointCount;
CabinetConfig.CabinetNumPos := 1;
CabinetConfig.CabinetSignPos := 0;
CabinetConfig.NumRadius := 3;
FCabinetSquare := -1;
end;
procedure TCabinetExt.CenterNumberObject;
var
CP: TDoublePoint;
MaxX, MaxY, MinX, MinY: Double;
begin
if FNumberObject <> nil then
begin
getbounds(MaxX, MaxY, MinX, MinY);
CP.x := (MinX + MaxX) / 2;
CP.y := (MinY + MaxY) / 2;
FNumberObject.move(CP.x - FNumberObject.CenterPoint.x, CP.y - FNumberObject.CenterPoint.y);
end;
end;
procedure TOrthoLine.DrawVertical(ADEngine: TPCDrawEngine);
var
CrossPoint1, CrossPoint2: TDoublePoint;
BasisPoints: TDoublePoint;
Points: TDoublePointArr;
PenStyle: TPenStyle;
RaiseLine: TOrthoLine;
isDrawRaise: Boolean;
GetConn: TConnectorObject;
begin
try
ADEngine.Canvas.Brush.Color := clMaroon;
ADEngine.Canvas.Brush.Style := bsClear;
PenStyle := ADEngine.Canvas.Pen.Style;
ADEngine.Canvas.Pen.Style := psSolid;
ADEngine.Canvas.Pen.Color := clMaroon;
ADEngine.Canvas.Pen.Width := 2;
if JoinConnector1 <> nil then
begin
if TConnectorObject(JoinConnector1).JoinedConnectorsList.Count = 0 then
GetConn := TConnectorObject(JoinConnector1)
else
GetConn := TConnectorObject(TConnectorObject(JoinConnector1).JoinedConnectorsList[0]);
BasisPoints.x := GetConn.ActualPoints[1].x;
BasisPoints.y := GetConn.ActualPoints[1].y;
end
else
begin
BasisPoints.x := ActualPoints[1].x;
BasisPoints.y := ActualPoints[1].y;
end;
{
// ÑÒÐÅËÊÀÌÈ ------------------
CrossPoint1.x := BasisPoints.x;
CrossPoint1.y := BasisPoints.y;
CrossPoint2.x := BasisPoints.x + 4;
CrossPoint2.y := BasisPoints.y - 4;
ADEngine.drawline(CrossPoint1, CrossPoint2);
SetLength(Points, 4);
Points[0] := DoublePoint(BasisPoints.x + 2, BasisPoints.y - 3);
Points[1] := DoublePoint(BasisPoints.x + 4, BasisPoints.y - 4);
Points[2] := DoublePoint(BasisPoints.x + 3, BasisPoints.y - 2);
Points[3] := DoublePoint(BasisPoints.x + 2, BasisPoints.y - 3);
ADEngine.drawpolyline(Points, True);
BasisPoints.x := BasisPoints.x + 1;
BasisPoints.y := BasisPoints.y + 0;
CrossPoint1.x := BasisPoints.x;
CrossPoint1.y := BasisPoints.y;
CrossPoint2.x := BasisPoints.x + 4;
CrossPoint2.y := BasisPoints.y - 4;
ADEngine.drawline(CrossPoint1, CrossPoint2);
SetLength(Points, 4);
Points[0] := DoublePoint(BasisPoints.x + 1, BasisPoints.y - 2);
Points[1] := DoublePoint(BasisPoints.x, BasisPoints.y);
Points[2] := DoublePoint(BasisPoints.x + 2, BasisPoints.y - 1);
Points[3] := DoublePoint(BasisPoints.x + 1, BasisPoints.y - 2);
ADEngine.drawpolyline(Points, True);
}
ADEngine.DrawCircle(BasisPoints, 1);
CrossPoint1 := DoublePoint(BasisPoints.x, BasisPoints.y - 0.6);
CrossPoint2 := DoublePoint(BasisPoints.x, BasisPoints.y + 0.6);
ADEngine.drawline(CrossPoint1, CrossPoint2);
CrossPoint1 := DoublePoint(BasisPoints.x - 0.6, BasisPoints.y);
CrossPoint2 := DoublePoint(BasisPoints.x + 0.6, BasisPoints.y);
ADEngine.drawline(CrossPoint1, CrossPoint2);
ADEngine.Canvas.Pen.Style := PenStyle;
except
on E: Exception do AddExceptionToLogEx('TOrthoLine.DrawVertical', E.Message);
end;
end;
{ TBetweenFloorDownVertex }
class function TBetweenFloorDownVertex.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
var
CAD: TF_CAD;
//ListParams: TListParams;
RaiseOnFigure, RaiseConn, RaiseConnPassage: TConnectorObject;
SavedFlag: Boolean;
ListToPassage: TF_CAD;
SelectedFigure: TFigure;
i: Integer;
SCSList: TSCSList;
SCSCatalog: TSCSCatalog;
SCSTopCompon: TSCSComponent;
PassCompons: TSCSComponents;
DefSelId: Integer;
begin
CAD := TF_CAD(TPowerCad(aOwner).Owner);
//ListParams := GetListParams(CAD.FCADListID);
RaiseOnFigure := CAD.CreateConnForFloorRaise(shadow.ap1.x, shadow.ap1.y, CAD.FLineHeight, LHandle);
GPopupFigure := RaiseOnFigure;
SavedFlag := ShowCreateRaiseQuery;
ShowCreateRaiseQuery := false;
try
FSCS_Main.aCreateFloorRaiseDown.Execute;
// Ïîñëå ïðåäëîãàåè ïîäêëþ÷èòñÿ ê ÒÎ
RaiseConn := GetRaiseConn(RaiseOnFigure);
if RaiseConn <> nil then
begin
ListToPassage := GetListByID(RaiseConn.FID_ListToPassage);
RaiseConnPassage := TConnectorObject(GetFigureByID(ListToPassage, RaiseConn.FID_ConnToPassage));
if RaiseConnPassage <> nil then
begin
SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(RaiseConn.FID_ListToPassage);
if SCSList <> nil then
begin
PassCompons := TSCSComponents.Create(false);
DefSelId := 0;
for i := 0 to SCSList.ChildCatalogReferences.Count - 1 do
begin
SCSCatalog := SCSList.ChildCatalogReferences[i];
if SCSCatalog.ItemType = itSCSConnector then
if SCSCatalog.SCSComponents.Count > 0 then
begin
SCSTopCompon := SCSCatalog.SCSComponents[0];
PassCompons.Add(SCSTopCompon);
if DefSelId = 0 then
if SCSTopCompon.ComponentType.SysName = ctsnCupBoard then
DefSelId := SCSTopCompon.ID;
end;
end;
if PassCompons.Count > 0 then
begin
ListToPassage.BringToFront;
//F_ProjMan.F_InputBox.SelectComponentFromList('qqqq', PassCompons);
SCSTopCompon := F_ProjMan.SelectComponentFromList(PassCompons, '', cCadClasses_Mes35_1, cCadClasses_Mes35_2, '', 0, [], nil, nil, DefSelId);
if SCSTopCompon <> nil then
begin
SCSCatalog := SCSTopCompon.GetFirstParentCatalog;
if SCSCatalog <> nil then
begin
SelectedFigure := GetFigureByID(ListToPassage, SCSCatalog.SCSID);
if (SelectedFigure <> nil) and (SelectedFigure is TConnectorObject) then
begin
GCadForm := ListToPassage;
try
GCadForm.PCad.DeselectAll(0);
//SelectedFigure.Select;
//RaiseConnPassage.Select;
CreateTraceByConnectors(GCadForm, TConnectorObject(SelectedFigure), RaiseConnPassage.FObjectFromRaise);
//AutoCreateTraces;
FSCS_Main.SetFigureAsEndObject(GCadForm, TConnectorObject(SelectedFigure));
finally
GCadForm := CAD;
end;
end;
end;
end;
CAD.BringToFront;
end;
FreeAndNil(PassCompons);
end;
end;
end;
finally
ShowCreateRaiseQuery := SavedFlag;
GPopupFigure := nil;
end;
Result := nil;
end;
{ TBetweenFloorUpVertex }
class function TBetweenFloorUpVertex.CreateFromShadow(aOwner: TComponent;
LHandle: Integer; Shadow: TFigure): TFigure;
var
CAD: TF_CAD;
//ListParams: TListParams;
RaiseOnFigure, RaiseConn, RaiseConnPassage: TConnectorObject;
SavedFlag: Boolean;
IDFloorDown: Integer;
ListDown: TF_CAD;
ListToPassage: TF_CAD;
SelectedFigure, SelFigureToPassage: TFigure;
JoinComponOtherFigure: TFigure;
JoinFigPoint: TDoublePoint;
i: Integer;
SCSList, SCSListToPassage: TSCSList;
SCSCatalog, SCSCatalogToPassage: TSCSCatalog;
JoinCompon, JoinComponOther: TSCSComponent;
IDIdx: Integer;
// Tolik
ComponId: Integer;
PointFigure : TFigure;
//
function SelectListJoinCompon(aList: TSCSList; const aCaption, aMsg: String; aSelId: Integer=0): TSCSComponent;
var
Compons: TSCSComponents;
SCSTopCompon: TSCSComponent;
DefSelId: Integer;
i: Integer;
begin
Result := nil;
Compons := TSCSComponents.Create(false);
DefSelId := aSelId;
for i := 0 to SCSList.ChildCatalogReferences.Count - 1 do
begin
SCSCatalog := SCSList.ChildCatalogReferences[i];
if SCSCatalog.ItemType = itSCSConnector then
if SCSCatalog.SCSComponents.Count > 0 then
begin
SCSTopCompon := SCSCatalog.SCSComponents[0];
if IsComunicationComponEx(SCSTopCompon) then
begin
Compons.Add(SCSTopCompon);
if DefSelId = 0 then
if SCSTopCompon.ComponentType.SysName = ctsnCupBoard then
DefSelId := SCSTopCompon.ID;
end;
end;
end;
if Compons.Count > 0 then
Result := F_ProjMan.SelectComponentFromList(Compons, '', aCaption, aMsg, '', 0, [], nil, nil, DefSelId);
FreeAndNil(Compons);
end;
begin
CAD := TF_CAD(TPowerCad(aOwner).Owner);
{IDFloorDown := GetListIDForCreatePassage(GCadForm.FCADListID, 1);
if IDFloorDown <> 0 then
begin
ListDown := GetListByID(IDFloorDown);
if ListDown <> nil then
begin
GCadForm := ListDown;
SavedFlag := ShowCreateRaiseQuery;
ShowCreateRaiseQuery := false;
try
ListDown.BringToFront;
RaiseOnFigure := ListDown.CreateConnForFloorRaise(shadow.ap1.x, shadow.ap1.y, ListDown.FLineHeight, LHandle);
GPopupFigure := RaiseOnFigure;
FSCS_Main.aCreateFloorRaiseUp.Execute;
finally
ShowCreateRaiseQuery := SavedFlag;
GPopupFigure := nil;
GCadForm := CAD;
GCadForm.BringToFront;
end;
end;
end;}
RaiseOnFigure := CAD.CreateConnForFloorRaise(shadow.ap1.x, shadow.ap1.y, CAD.FLineHeight, LHandle);
GPopupFigure := RaiseOnFigure;
SavedFlag := ShowCreateRaiseQuery;
ShowCreateRaiseQuery := false;
try
FSCS_Main.aCreateFloorRaiseUp.Execute;
// Ïîñëå ïðåäëîãàåè ïîäêëþ÷èòñÿ ê ÒÎ
RaiseConn := GetRaiseConn(RaiseOnFigure);
if RaiseConn <> nil then
begin
ListToPassage := GetListByID(RaiseConn.FID_ListToPassage);
SCSList := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(CAD.FCADListID);
if SCSList <> nil then
begin
JoinCompon := SelectListJoinCompon(SCSList, cCadClasses_Mes35_1, cCadClasses_Mes35_2);
if JoinCompon <> nil then
begin
SCSCatalog := JoinCompon.GetFirstParentCatalog;
if SCSCatalog <> nil then
begin
SelectedFigure := GetFigureByID(CAD, SCSCatalog.SCSID);
if (SelectedFigure <> nil) and (SelectedFigure is TConnectorObject) then
begin
GCadForm.PCad.DeselectAll(0);
//SelectedFigure.Select;
//RaiseConnPassage.Select;
CreateTraceByConnectors(GCadForm, TConnectorObject(SelectedFigure), RaiseOnFigure, true);
//AutoCreateTraces;
FSCS_Main.SetFigureAsEndObject(GCadForm, TConnectorObject(SelectedFigure));
//04.07.2013 - èùåì òàêîé æå îáúåêò íà âåðõíåì ëèñòå (åñëè ºòî á³ëà êîïèÿ, òî îí åñòü íà íåé)
if ListToPassage <> nil then
begin
RaiseConnPassage := TConnectorObject(GetFigureByID(ListToPassage, RaiseConn.FID_ConnToPassage));
if RaiseConnPassage <> nil then
begin
SCSListToPassage := F_ProjMan.GSCSBase.CurrProject.GetListBySCSID(ListToPassage.FCADListID);
if SCSListToPassage <> nil then
begin
IDIdx := -1;
if SCSListToPassage.FObjIDsBeforeCopy <> nil then
IDIdx := SCSListToPassage.FObjIDsBeforeCopy.IndexOf(SCSCatalog.ID);
if IDIdx <> -1 then
begin
SCSCatalogToPassage := SCSListToPassage.GetCatalogFromReferences(SCSListToPassage.FObjIDsAfterCopy[IDIdx]);
if SCSCatalogToPassage <> nil then
begin
SelFigureToPassage := GetFigureByID(ListToPassage, SCSCatalogToPassage.SCSID);
ListToPassage.BringToFront;
if GCadForm = ListToPassage then
begin
CreateTraceByConnectors(ListToPassage, TConnectorObject(SelFigureToPassage), RaiseConnPassage.FObjectFromRaise, true);
end;
end;
end
else
begin
{//08.07.2013
ListToPassage.BringToFront;
if GCadForm = ListToPassage then
begin
SelFigureToPassage := ListToPassage.CreateConnector(SelectedFigure.ap1.x, SelectedFigure.ap1.y, CAD.FLineHeight, ListToPassage.PCad.GetLayerHandle(lnSCSCommon), ct_Clear, cCadClasses_Mes12);
if SelFigureToPassage <> nil then
CreateTraceByConnectors(ListToPassage, TConnectorObject(SelFigureToPassage), RaiseConnPassage.FObjectFromRaise);
end;}
//08.07.2013 - âûáîð îáúåêòà äëÿ ñîçäàíèÿ íà íîâîì ëèñòå, ÷òîáû ïîäêëþ÷èòü ê íåìó ì-ý
JoinFigPoint := SelectedFigure.ap1; // ñíà÷àëà êîîðäèíàòû ïî âûáðàíîìó îáúåêòó íà èñõîäíîì ëèñòå
JoinComponOther := SelectListJoinCompon(SCSList, cCadClasses_Mes35_1_1, cCadClasses_Mes35_3, JoinCompon.ID);
{JoinComponOtherFigure := nil;
if JoinComponOther <> nil then
begin
JoinComponOtherFigure := GetFigureByID(CAD, JoinComponOther.GetFirstParentCatalog.SCSID);
if JoinComponOtherFigure <> nil then
JoinFigPoint := JoinComponOtherFigure.ap1;
end;}
ListToPassage.BringToFront;
if GCadForm = ListToPassage then
begin
if JoinComponOther <> nil then // Tolik 11/05/2018 --
begin
// Tolik -- 06/12/2017 -- íå ñ òîãî ëèñòà âçÿòû íàñòðîéêè (âûñîòà ðàçìåùåíèÿ ëèíèé)
//SelFigureToPassage := ListToPassage.CreateConnector(JoinFigPoint.x, JoinFigPoint.y, CAD.FLineHeight, ListToPassage.PCad.GetLayerHandle(lnSCSCommon), ct_Clear, cCadClasses_Mes12);
SelFigureToPassage := ListToPassage.CreateConnector(JoinFigPoint.x, JoinFigPoint.y, ListToPassage.FLineHeight, ListToPassage.PCad.GetLayerHandle(lnSCSCommon), ct_Clear, cCadClasses_Mes12);
if SelFigureToPassage <> nil then
begin
if JoinComponOther <> nil then
begin
SCSCatalogToPassage := SCSListToPassage.GetCatalogFromReferencesBySCSID(SelFigureToPassage.ID);
if SCSCatalogToPassage <> nil then
begin
RefreshCAD(ListToPassage.PCad);
// Tolik -- 22/09/2016 --
CopyComponentToPMSCSObject(JoinComponOther, SCSCatalogToPassage, true);
PointFigure := GetFigureByID(GCadForm, SCSCatalogToPassage.SCSId);
// ComponId := CopyComponentToSCSObject(JoinComponOther.ID, SCSCatalogToPassage.ID, False);
//
end;
end;
CreateTraceByConnectors(ListToPassage, TConnectorObject(SelFigureToPassage), RaiseConnPassage.FObjectFromRaise, true);
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
if ListToPassage <> nil then
ListToPassage.BringToFront;
end;
finally
ShowCreateRaiseQuery := SavedFlag;
GPopupFigure := nil;
end;
Result := nil;
end;
//======================07.11.2013 ñàìûêîâ==================================
procedure TConnectorObject.SetIsSnap(const Value: Boolean);
begin
if FisSnap = Value then
exit;
FisSnap := Value;
if Value then
Draw(GCadForm.PCad.DEngine, false)
else
begin
FFindSnapEnable := true;
//if (GCadForm.PCad.Selection <> nil) and (GCadForm.PCad.Selection.Count > 0) and (GCadForm.PCad.Selection[0] <> nil)
// and (TConnectorObject(GCadForm.PCad.Selection[0]).FindSnapTimer <> nil)
// and (TConnectorObject(GCadForm.PCad.Selection[0]).FindSnapTimer.tag = 1)
//then
// GCadForm.PCad.FirstDrag:=false;
GCadForm.PCad.Refresh;
if (CheckFigureByClassName(GCadForm.PCad.TraceFigure, 'TOrthoLine')) then
GCadForm.PCad.TraceFigure.NotNeedToDraw := True;
GCadForm.PCad._DrawTrace; //äëÿ îòðèñîâêè íîâîé trace shadow
if (CheckFigureByClassName(GCadForm.PCad.TraceFigure, 'TOrthoLine')) then
GCadForm.PCad.TraceFigure.NotNeedToDraw := false;
end;
end;
procedure TOrthoLine.SetIsSnap(const Value: Boolean);
begin
if FisSnap=Value then
exit;
FisSnap := Value;
if Value then
Draw(GCadForm.PCad.DEngine, false)
else
begin
GCadForm.PCad.Refresh;
if (CheckFigureByClassName(GCadForm.PCad.TraceFigure, 'TOrthoLine')) then
GCadForm.PCad.TraceFigure.NotNeedToDraw := True;
GCadForm.PCad._DrawTrace; //äëÿ îòðèñîâêè íîâîé trace shadow
if (CheckFigureByClassName(GCadForm.PCad.TraceFigure, 'TOrthoLine')) then
GCadForm.PCad.TraceFigure.NotNeedToDraw := false;
end;
end;
//======================07.11.2013 ñàìûêîâ==================================
procedure TConnectorObject.OnFindSnapTimer(Sender: TObject); //13.11.2013 ñàìûêîâ
begin
if not FFindSnapEnable then
exit;
// Tolik -- 15/03/2017 -- áûâàåò, ÷òî òàéìåð íå óñïåâàåò ñðàáàòûâàòü è ïîëó÷àåì âìåñòî TConnectorObject
// TRectangle (TraceFigure)? ïîòîì ìîæåò ïðîèçîéòè óäàëåíèå êîííåêòîðà (ïðîñòî òàê), òàê ÷òî âî èçáåæàíèå
// äîáàâëåíà ïðîâåðêà íà èìÿ êëàññà
// if GCadForm.PCad.TraceFigure = nil then
if (GCadForm.PCad.TraceFigure = nil) or (GCadForm.PCad.TraceFigure.ClassName <> cTConnectorObject) then
exit;
//GCadForm.mProtocol.Lines.Add('timer');
FFindSnapEnable:=false;
if FindSnapTimer.tag = 1 then
begin //call from tracemodification
GFigureSnap := TConnectorObject(GCadForm.PCad.TraceFigure).FindSnapObject(GCadForm.PCad.TraceFigure.ActualPoints[1].x, GCadForm.PCad.TraceFigure.ActualPoints[1].y);
if (GPrevFigureSnap <> nil) AND (GPrevFigureSnap <> GFigureSnap) then
DrawSnapFigures(GPrevFigureSnap, False);
if GFigureSnap <> nil then
begin
DrawSnapFigures(GFigureSnap, True);
GPrevFigureSnap := GFigureSnap;
// Tolik 10/04/2017 --
//end;
end
else
begin
// IGOR - íå íóæíî òóò ðåôðåø êàäà - Òîëÿí áûë äîáàâèë, íî íå èçâåñòíî çà÷åì (÷òî ýòèì ðèõòîâàëîñü?)
// åñëè äåëàòü ðåôðåø - ïîëó÷èì òàêîå:
//Íåáîëüøîé áàã - ïðè ïåðåìåùåíèè çà êîííåòîð ÓÃÎ - ïðîïàäàåò êâàäðàòèê ñèíèé è èçíà÷àëüíàÿ òðàññà
//"X:\Projects\Ýêñïåðò-ÑÊÑ\! Screens\" bug_move_connector240.JPG
//GCadForm.PCad.Refresh;
end;
end
else
FindObjectsOnMove(FDeltaPoint.x, FDeltaPoint.y);
FFindSnapEnable:=true;
FindSnapTimer.Enabled:=false;
end;
procedure TConnectorObject.CreateSnapTimer(CheckDrawStyle: Boolean = True);
begin
//if CheckDrawStyle and (DrawStyle <> dsTrace) then
// exit;
if FindSnapTimer <> nil then
exit;
FindSnapTimer := TTimer.Create(nil);
FindSnapTimer.Enabled:=false;
FindSnapTimer.OnTimer:=OnFindSnapTimer;
if (GCadForm <> nil) and (GCadForm.PCad <> nil) then
begin
//if TPowerCad(GCadForm.PCad).Figures.Count > 1000 then
if GCadForm.FCheckedFigures.Count > 1000 then
FindSnapTimer.Interval := 150
else
FindSnapTimer.Interval := 50;
end
else
FindSnapTimer.Interval := 150;
FFindSnapEnable:=true;
end;
procedure TOrthoLine.GetBoundsWithOutGrpSize(var figMaxX, figMaxY, figMinX,
figMinY: Double);
begin
GetBounds(figMaxX, figMaxY, figMinX, figMinY);
end;
procedure TTextMod.GetBoundsWithoutGrpSize(var figMaxX, figMaxY, figMinX,
figMinY: Double);
begin
GetBounds(figMaxX, figMaxY, figMinX, figMinY);
end;
procedure TFigureGrpMod.GetBoundsWithoutGrpSize(var figMaxX, figMaxY,
figMinX, figMinY: Double);
begin
GetBounds(figMaxX, figMaxY, figMinX, figMinY);
end;
initialization
if FigureClasses.IndexOf(TBetweenFloorDownVertex) = -1 then
FigureClasses.Add(TBetweenFloorDownVertex);
if FigureClasses.IndexOf(TBetweenFloorUpVertex) = -1 then
FigureClasses.Add(TBetweenFloorUpVertex);
end.