UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TopologicalEdge.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Geo/Curves/Curve.h"
7#include "Geo/GeoEnum.h"
8#include "Math/Boundary.h"
9#include "Mesh/MeshEnum.h"
10#include "Topo/Linkable.h"
12#include "Utils/Cache.h"
13
14namespace UE::CADKernel
15{
16
18
19class FOrientedEdge;
20class FThinZone2D;
21class FThinZoneSide;
22
27{
31 const double Coordinate = 0;
32 const int32 OppositNodeIndex = -1;
33 double DeltaU = 0;
34
38
39 FImposedCuttingPoint(const double InCoordinate, const int32 NodeIndex1, const double InDeltaU = 0.)
40 : Coordinate(InCoordinate)
41 , OppositNodeIndex(NodeIndex1)
42 , DeltaU(InDeltaU)
43 {
44 };
45};
46
47template<typename FCuttingPointType>
49
50using FAddCuttingPointFunc = TFunction<void(const double, const ECoordinateType, const FPairOfIndex, const double)>;
51
53struct FCuttingPoint;
54
55class FModelMesh;
56class FEdgeMesh;
57class FSurface;
58class FThinZone;
61
62class CADKERNEL_API FTopologicalEdge : public TLinkable<FTopologicalEdge, FEdgeLink>
63{
64 friend class FEntity;
65 friend class FTopologicalLoop;
66 friend class FTopologicalFace;
67
68private:
69 const double FactorToComputeMaxTol = 0.1;
70
71protected:
72
75
80
82 mutable double Length3D = -1.;
83
84 // To avoid huge tolerance in case of degenerated edge, the max tol is defined as Length3D / 10.
85 mutable double Max2DTolerance = -1;
86
88
90
95
100
103
108
113
118
119private:
120
129
130 FTopologicalEdge() = default;
131
132 void SetLoop(FTopologicalLoop& NewBoundary)
133 {
134 Loop = &NewBoundary;
135 }
136
137 void RemoveLoop()
138 {
139 Loop = nullptr;
140 }
141
148 bool CheckVertices();
149
150public:
151
154 static TSharedPtr<FTopologicalEdge> Make(const TSharedRef<FRestrictionCurve>& InCurve, const FLinearBoundary& InBoundary);
156
161
166
167 virtual ~FTopologicalEdge() override
168 {
169 FTopologicalEdge::Empty();
170 }
171
172 virtual void Empty() override;
173
174 virtual void Serialize(FCADKernelArchive& Ar) override
175 {
177 SerializeIdent(Ar, StartVertex);
178 SerializeIdent(Ar, EndVertex);
179 SerializeIdent(Ar, Curve);
180 Ar << Boundary;
181 SerializeIdent(Ar, &Loop);
182 Ar << Length3D;
183 Max2DTolerance = Length3D * FactorToComputeMaxTol;
184 }
185
186 virtual void SpawnIdent(FDatabase& Database) override;
187
188 virtual void ResetMarkersRecursively() const override
189 {
191 StartVertex->ResetMarkersRecursively();
192 EndVertex->ResetMarkersRecursively();
193
194 Curve->ResetMarkersRecursively();;
195 }
196
197#ifdef CADKERNEL_DEV
198 virtual FInfoEntity& GetInfo(FInfoEntity&) const override;
199#endif
200
201 double GetTolerance3D() const
202 {
203 return GetCurve()->GetCarrierSurface()->Get3DTolerance();
204 }
205
206 double GetTolerance2DAt(double Coordinate) const
207 {
208 return FMath::Min(Max2DTolerance, GetCurve()->GetToleranceAt(Coordinate));
209 }
210
211 virtual EEntity GetEntityType() const override
212 {
213 return EEntity::TopologicalEdge;
214 }
215
216 // ====== Topological Function ======
217
218 void LinkVertex();
219
224 bool CheckIfDegenerated() const;
225
231 bool IsLinkableTo(const FTopologicalEdge& Edge, double EdgeLengthTolerance) const;
232
241 void LinkIfCoincident(FTopologicalEdge& OtherEdge, double EdgeLengthTolerance, double SquareJoiningTolerance);
242
249
254 void Disjoin();
255
260 void Unlink()
261 {
262 Disjoin();
263 }
264
265
270
275
277 {
278 if (!TopologicalLink)
279 {
280 return nullptr;
281 }
282
283 if (TopologicalLink->GetTwinEntities().Num() < 2)
284 {
285 return nullptr;
286 }
287
288 FTopologicalEdge* FirstTwinEdge = (TopologicalLink->GetTwinEntities()[0] == this) ? TopologicalLink->GetTwinEntities()[1] : TopologicalLink->GetTwinEntities()[0];
289 return FirstTwinEdge;
290 }
291
293 {
294 const TArray<FTopologicalEdge*>& TwinEdges = GetTwinEntities();
295 if (TwinEdges.Num() > 1)
296 {
297 return TwinEdges[0] == this ? TwinEdges[1] : TwinEdges[0];
298 }
299 return nullptr;
300 }
301
305 bool IsSameDirection(const FTopologicalEdge& Edge) const;
306
310 bool IsTangentAtExtremitiesWith(const FTopologicalEdge & Edge) const;
311
315 bool IsClosed() const
316 {
317 return StartVertex->GetLinkActiveEntity() == EndVertex->GetLinkActiveEntity();
318 }
319
338 void ReplaceEdgeVertex(bool bIsStartVertex, TSharedRef<FTopologicalVertex>& NewVertex);
339
344 {
345 return Loop;
346 }
347
352 {
353 return Loop;
354 }
355
359 FTopologicalFace* GetFace() const;
360
361 // ====== Vertex Functions (Get, Set, ...) ======
362
364 {
365 return (Forward == EOrientation::Front ? StartVertex.ToSharedRef() : EndVertex.ToSharedRef());
366 }
367
369 {
370 return (Forward == EOrientation::Front ? EndVertex.ToSharedRef() : StartVertex.ToSharedRef());
371 }
372
374 {
375 return (Forward ? StartVertex.ToSharedRef() : EndVertex.ToSharedRef());
376 }
377
379 {
380 return (Forward ? EndVertex.ToSharedRef() : StartVertex.ToSharedRef());
381 }
382
384 {
385 return StartVertex.ToSharedRef();
386 }
387
389 {
390 return EndVertex.ToSharedRef();
391 }
392
394 {
395 return StartVertex.ToSharedRef();
396 }
397
399 {
400 return EndVertex.ToSharedRef();
401 }
402
404 {
405 return (Vertex->GetLink() == StartVertex->GetLink() ? EndVertex : (Vertex->GetLink() == EndVertex->GetLink() ? StartVertex : TSharedPtr<FTopologicalVertex>()));
406 }
407
409 {
410 return (Vertex.GetLink() == StartVertex->GetLink() ? EndVertex.Get() : (Vertex.GetLink() == EndVertex->GetLink() ? StartVertex.Get() : nullptr));
411 }
412
414 {
415 return (Vertex.GetLink() == StartVertex->GetLink() ? EndVertex.Get() : (Vertex.GetLink() == EndVertex->GetLink() ? StartVertex.Get() : nullptr));
416 }
417
419 {
420 return (Vertex->GetLink() == StartVertex->GetLink() ? EndVertex : (Vertex->GetLink() == EndVertex->GetLink() ? StartVertex : TSharedPtr<FTopologicalVertex>()));
421 }
422
423 void SetStartVertex(const double NewCoordinate);
424 void SetEndVertex(const double NewCoordinate);
425
426 void SetStartVertex(const double NewCoordinate, const FVector& NewPoint3D);
427 void SetEndVertex(const double NewCoordinate, const FVector& NewPoint3D);
428
429 // ====== Boundary Function ======
430
432 {
433 return Boundary;
434 }
435
437 {
438 return Boundary.GetMin();
439 }
440
442 {
443 return Boundary.GetMax();
444 }
445
450 {
451 return StartVertex->GetBarycenter();
452 }
453
458 {
459 return EndVertex->GetBarycenter();
460 }
461
466 {
467 return StartVertex->GetCoordinates();
468 }
469
474 {
475 return EndVertex->GetCoordinates();
476 }
477
478 void GetTangentsAtExtremities(FVector& StartTangent, FVector& EndTangent, bool bForward) const;
479 void GetTangentsAtExtremities(FVector& StartTangent, FVector& EndTangent, EOrientation Orientation) const
480 {
481 GetTangentsAtExtremities(StartTangent, EndTangent, Orientation == EOrientation::Front);
482 }
483
484 // ====== Meshing Function ======
485
486 const FEdgeMesh* GetMesh() const
487 {
488 if (GetLinkActiveEntity() != AsShared())
489 {
490 return GetLinkActiveEdge()->GetMesh();
491 }
492 if (Mesh.IsValid())
493 {
494 return Mesh.Get();
495 }
496 return nullptr;
497 }
498
499 FEdgeMesh& GetOrCreateMesh(FModelMesh& MeshModel);
500
505 void RemovePreMesh();
506
507 const FTopologicalEdge* GetPreMeshedTwin() const;
509 {
510 return const_cast<FTopologicalEdge*> (static_cast<const FTopologicalEdge*>(this)->GetPreMeshedTwin());
511 }
512
518 void ComputeCrossingPointCoordinates();
519
520 int32 EvaluateCuttingPointNum();
521
523 {
524 int32 Size = CrossingPointUs.Num();
525 ensureCADKernel(Size >= 2);
526 CrossingPointUs.SetNum(Size);
527 CrossingPointDeltaUMins.Init(DOUBLE_SMALL_NUMBER, Size - 1);
528 CrossingPointDeltaUMaxs.Init(2.0 * (GetEndCurvilinearCoordinates() - GetStartCurvilinearCoordinates()), Size - 1);
529 }
530
532 {
533 return CrossingPointUs;
534 }
535
537 {
538 return CrossingPointUs;
539 }
540
542 {
543 return CrossingPointDeltaUMins;
544 }
545
547 {
548 return CrossingPointDeltaUMaxs;
549 }
550
552 {
553 return CrossingPointDeltaUMaxs;
554 }
555
556 double GetDeltaUFor(double Coordinate, int32& Index) const
557 {
558 for (; Index < CrossingPointUs.Num() - 1; ++Index)
559 {
560 if (Coordinate < CrossingPointUs[Index + 1])
561 {
562 if (Coordinate > CrossingPointUs[Index] - DOUBLE_SMALL_NUMBER)
563 {
564 break;
565 }
566 Index = 0;
567 if(Coordinate < CrossingPointUs[1])
568 {
569 break;
570 }
571 }
572 }
573 return CrossingPointDeltaUMaxs[Index];
574 }
575
577 {
578 return CuttingPointUs;
579 };
580
582 {
583 return CuttingPointUs;
584 }
585
587
588 void TransferCuttingPointFromMeshedEdge(bool bOnlyWithOppositeNode, FAddCuttingPointFunc AddCuttingPoint);
589
593 TArray<double> GetPreElementLengths() const;
594
595 // For thin zone purpose
596 void SortImposedCuttingPoints();
597
599 {
600 return ImposedCuttingPointUs;
601 }
602
604 {
606 {
607 ThinZoneSides.AddUnique(InThinZoneSide);
608 ThinZoneBounds.Add(InThinZoneBounds);
609 }
610 }
611
613 {
614 return ThinZoneSides.Num();
615 }
616
618 {
619 return ThinZoneSides;
620 }
621
623 {
624 return ThinZoneBounds;
625 }
626
627 void AddImposedCuttingPointU(const double ImposedCuttingPointU, const int32 OppositeNodeIndex, const double DeltaU);
628 void AddTwinsCuttingPoint(const double Coord, const double DeltaU);
629
630 void GenerateMeshElements(FModelMesh& MeshModel);
631
632 // ====== Curve Functions ======
633
635 {
636 return Curve.ToSharedRef();
637 }
638
640 {
641 return Curve.ToSharedRef();
642 }
643
644 void ComputeLength();
645 double Length() const;
646
650 void Sample(const double DesiredSegmentLength, TArray<double>& OutCoordinates) const;
651
656 void EvaluatePoint(double InCoordinate, int32 Derivative, FCurvePoint& Point) const
657 {
658 Curve->EvaluatePoint(InCoordinate, Point, Derivative);
659 }
660
666 {
667 Curve->EvaluatePoints(InCoordinates, OutPoints, DerivativeOrder);
668 }
669
674 {
675 Curve->Approximate3DPoints(InCoordinates, OutPoints);
676 }
677
682 {
683 return Curve->Approximate2DPoint(InCoordinate);
684 }
685
690 {
691 Curve->Approximate2DPoints(InCoordinates, OutPoints);
692 }
693
698 {
699 Curve->ApproximatePolyline(Polyline);
700 }
701
703 {
704 return Curve->GetTangentAt(InCoordinate);
705 }
706
708 {
709 return Curve->GetTangent2DAt(InCoordinate);
710 }
711
715 FVector GetTangentAt(const FTopologicalVertex& InVertex);
716 FVector2d GetTangent2DAt(const FTopologicalVertex& InVertex);
717
721 template<class PointType>
722 double ProjectPoint(const PointType& InPointToProject, PointType& OutProjectedPoint) const
723 {
724 return Curve->GetCoordinateOfProjectedPoint(Boundary, InPointToProject, OutProjectedPoint);
725 }
726
734
743
748
753
757 template<class PointType>
759 {
760 Curve->GetDiscretizationPoints(Boundary, Orientation, OutPoints);
761 }
762
763 double TransformLocalCoordinateToActiveEdgeCoordinate(const double LocalCoordinate) const;
764 double TransformActiveEdgeCoordinateToLocalCoordinate(const double ActiveEdgeCoordinate) const;
765 double TransformTwinEdgeCoordinateToLocalCoordinate(const FTopologicalEdge& TwinEdge, const double InTwinCoordinate) const;
766
767 void TransformTwinEdgeCoordinatesToLocalCoordinates(const FTopologicalEdge& TwinEdge, const TArray<double>& InActiveEdgeCoordinate, TArray<double>& OutLocalCoordinate) const;
768 void TransformActiveEdgeCoordinatesToLocalCoordinates(const TArray<double>& InActiveEdgeCoordinate, TArray<double>& OutLocalCoordinate) const;
769 void TransformLocalCoordinatesToActiveEdgeCoordinates(const TArray<double>& InLocalCoordinate, TArray<double>& OutActiveEdgeCoordinate) const;
770
774 void ComputeEdge2DProperties(FEdge2DProperties& SlopeCharacteristics);
775
776 void GetExtremities(FSurfacicCurveExtremities& Extremities) const
777 {
778 Curve->GetExtremities(Boundary, Extremities);
779 }
780
781 void Offset2D(const FVector2d& OffsetDirection);
782
783 // ====== Geometrical Functions ======
784
793
799
800 bool IsSharpEdge() const;
801
803 bool HasSameLengthAs(const FTopologicalEdge& Edge, double EdgeLengthTolerance) const;
804
805 // ====== State Functions ======
806
811 virtual bool IsDegenerated() const override
812 {
813 return FHaveStates::IsDegenerated();
814 }
815
829 bool IsThinPeak() const
830 {
831 return ((States & EHaveStates::ThinPeak) == EHaveStates::ThinPeak);
832 }
833
834 virtual void SetThinPeakMarker() const
835 {
836 States |= EHaveStates::ThinPeak;
837 }
838
839 virtual void ResetThinPeakMarker() const
840 {
841 States &= ~EHaveStates::ThinPeak;
842 }
843
844 bool IsVirtuallyMeshed() const
845 {
847 }
848
849 virtual void SetVirtuallyMeshedMarker() const
850 {
852 }
853
854 virtual void ResetVirtuallyMeshedMarker() const
855 {
857 }
858
862 bool IsBorder() const
863 {
864 return GetTwinEntityCount() == 1;
865 }
866
870 bool IsSurfacic() const
871 {
872 return GetTwinEntityCount() == 2;
873 }
874
875 bool IsConnectedTo(const FTopologicalFace* Face) const;
876
877 TArray<FTopologicalFace*> GetLinkedFaces() const;
878
885 static TSharedPtr<FTopologicalEdge> CreateEdgeByMergingEdges(const double SmallEdgeTolerance, TArray<FOrientedEdge>& Edges, const TSharedRef<FTopologicalVertex>& StartVertex, const TSharedRef<FTopologicalVertex>& EndVertex);
886};
887
889{
890 double StandardDeviation = 0;
891 double MediumSlope = 0;
892 double Length3D = 0;
893 EIso IsoType = EIso::UndefinedIso;
894 bool bIsMesh = false;
895 double MeshedLength = 0;
896
897 void Add(double InSlope, double InLength)
898 {
899 double Temp = InSlope * InLength;
900 MediumSlope += Temp;
901 Temp *= InSlope;
902 StandardDeviation += Temp;
903 Length3D += InLength;
904 }
905
906 // Finalize has been done on each Property
908 {
909 StandardDeviation = (FMath::Square(StandardDeviation) + FMath::Square(MediumSlope)) * Length3D + (FMath::Square(Property.StandardDeviation) + FMath::Square(Property.MediumSlope)) * Property.Length3D;
910 MediumSlope = MediumSlope * Length3D + Property.MediumSlope * Property.Length3D;
911 Length3D += Property.Length3D;
912
913 MediumSlope /= Length3D;
914 StandardDeviation /= Length3D;
915 StandardDeviation -= FMath::Square(MediumSlope);
916 StandardDeviation = sqrt(StandardDeviation);
917 }
918
919 // Finalize has not been done on each Property
921 {
922 StandardDeviation += Property.StandardDeviation;
923 MediumSlope += Property.MediumSlope;
924 Length3D += Property.Length3D;
925 }
926
927 void Finalize()
928 {
929 MediumSlope /= Length3D;
930 StandardDeviation /= Length3D;
931 StandardDeviation -= FMath::Square(MediumSlope);
932 if (StandardDeviation < 0)
933 {
934 StandardDeviation = 0;
935 }
936 else
937 {
938 StandardDeviation = sqrt(StandardDeviation);
939 }
940 IsoType = EIso::UndefinedIso;
941
942 if (MediumSlope < 0.2)
943 {
944 if (StandardDeviation < 0.1)
945 {
946 IsoType = EIso::IsoU;
947 }
948 }
949 else if (MediumSlope > 1.8)
950 {
951 if (StandardDeviation < 0.1)
952 {
953 IsoType = EIso::IsoV;
954 }
955 }
956 }
957
958};
959
964{
971 double IsoDeltaU = 0;
972
974 : Coordinate(0)
976 , OppositNodeIndices(FPairOfIndex::Undefined)
977 , IsoDeltaU(HUGE_VAL)
978 {
979 }
980
982 : Coordinate(InCoordinate)
983 , Type(InType)
984 , OppositNodeIndices(FPairOfIndex::Undefined)
985 , IsoDeltaU(HUGE_VAL)
986 {
987 }
988
990 : Coordinate(InCoordinate)
991 , Type(InType)
992 , OppositNodeIndices(InOppositNodeIndices)
993 , IsoDeltaU(DeltaU)
994 {
995 }
996
998 : Coordinate(InCoordinate)
999 , Type(InType)
1000 , OppositNodeIndices(InOppositeNodeId)
1001 , IsoDeltaU(DeltaU)
1002 {
1003 }
1004};
1005
1007{
1009
1011 {
1012 ensureCADKernel(Iso == 0 || Iso == 1);
1013 return Coordinates[Iso];
1014 }
1015
1016 constexpr const TArray<FCuttingPoint>& operator[](EIso Iso) const
1017 {
1018 ensureCADKernel(Iso == 0 || Iso == 1);
1019 return Coordinates[Iso];
1020 }
1021};
1022
1023
1024template<typename FCuttingPointType>
1033
1034
1035} // namespace UE::CADKernel
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ensureCADKernel(InExpression)
Definition Types.h:115
@ Vertex
Definition MetalRHIPrivate.h:223
#define DOUBLE_SMALL_NUMBER
Definition UnrealMathUtility.h:72
uint32 Size
Definition VulkanMemory.cpp:4034
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
UE_FORCEINLINE_HINT SizeType AddUnique(ElementType &&Item)
Definition Array.h:2993
Definition AndroidPlatformMisc.h:14
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT ObjectType * Get() const
Definition SharedPointer.h:1065
TSharedRef< ObjectType, Mode > ToSharedRef() const &
Definition SharedPointer.h:1028
Definition SharedPointer.h:153
Definition CADKernelArchive.h:19
Definition Database.h:17
Definition EdgeMesh.h:12
Definition CADEntity.h:56
Definition ModelMesh.h:21
Definition TopologicalLoop.h:21
Definition Surface.h:27
Definition SurfacicPolyline.h:30
Definition ThinZone2D.h:157
Definition ThinZone2D.h:40
Definition TopologicalEdge.h:63
void Unlink()
Definition TopologicalEdge.h:260
TArray< FCuttingPoint > CuttingPointUs
Definition TopologicalEdge.h:94
bool IsThinPeak() const
Definition TopologicalEdge.h:829
const TArray< FImposedCuttingPoint > & GetImposedCuttingPoints() const
Definition TopologicalEdge.h:598
FTopologicalVertex * GetOtherVertex(FTopologicalVertex &Vertex)
Definition TopologicalEdge.h:408
TArray< double > & GetCrossingPointUs()
Definition TopologicalEdge.h:536
TArray< FThinZoneSide * > ThinZoneSides
Definition TopologicalEdge.h:101
FVector GetTangentAt(const double InCoordinate) const
Definition TopologicalEdge.h:702
TSharedRef< const FTopologicalEdge > GetLinkActiveEdge() const
Definition TopologicalEdge.h:266
FVector GetStartBarycenter()
Definition TopologicalEdge.h:449
virtual void SetVirtuallyMeshedMarker() const
Definition TopologicalEdge.h:849
const TSharedPtr< FTopologicalVertex > GetOtherVertex(const TSharedRef< FTopologicalVertex > &Vertex) const
Definition TopologicalEdge.h:418
virtual EEntity GetEntityType() const override
Definition TopologicalEdge.h:211
const TSharedRef< FTopologicalVertex > GetEndVertex(EOrientation Forward) const
Definition TopologicalEdge.h:368
const FLinearBoundary & GetBoundary() const
Definition TopologicalEdge.h:431
const TArray< double > & GetDeltaUMaxs() const
Definition TopologicalEdge.h:551
TSharedPtr< FTopologicalVertex > EndVertex
Definition TopologicalEdge.h:74
virtual ~FTopologicalEdge() override
Definition TopologicalEdge.h:167
const TSharedRef< FTopologicalVertex > GetStartVertex() const
Definition TopologicalEdge.h:383
TArray< double > & GetDeltaUMins()
Definition TopologicalEdge.h:541
virtual void Serialize(FCADKernelArchive &Ar) override
Definition TopologicalEdge.h:174
const FEdgeMesh * GetMesh() const
Definition TopologicalEdge.h:486
const TArray< FCuttingPoint > & GetCuttingPoints() const
Definition TopologicalEdge.h:581
TArray< FImposedCuttingPoint > ImposedCuttingPointUs
Definition TopologicalEdge.h:99
TArray< double > & GetDeltaUMaxs()
Definition TopologicalEdge.h:546
virtual bool IsDegenerated() const override
Definition TopologicalEdge.h:811
FVector GetStartCoordinate()
Definition TopologicalEdge.h:465
void ProjectPoints(const TArray< FVector > &InPointsToProject, TArray< double > &OutProjectedPointCoords, TArray< FVector > &OutProjectedPoints) const
Definition TopologicalEdge.h:730
void AddThinZone(FThinZoneSide *InThinZoneSide, const FLinearBoundary &InThinZoneBounds)
Definition TopologicalEdge.h:603
void Approximate2DPoints(const TArray< double > &InCoordinates, TArray< FVector2d > &OutPoints) const
Definition TopologicalEdge.h:689
bool IsVirtuallyMeshed() const
Definition TopologicalEdge.h:844
const TArray< FLinearBoundary > & GetThinZoneBounds() const
Definition TopologicalEdge.h:622
TSharedPtr< FTopologicalVertex > GetOtherVertex(const TSharedRef< FTopologicalVertex > &Vertex)
Definition TopologicalEdge.h:403
FLinearBoundary Boundary
Definition TopologicalEdge.h:79
double GetDeltaUFor(double Coordinate, int32 &Index) const
Definition TopologicalEdge.h:556
TArray< double > CrossingPointDeltaUMins
Definition TopologicalEdge.h:112
FTopologicalLoop * GetLoop()
Definition TopologicalEdge.h:351
double GetTolerance3D() const
Definition TopologicalEdge.h:201
bool IsBorder() const
Definition TopologicalEdge.h:862
FVector2d GetTangent2DAt(const double InCoordinate) const
Definition TopologicalEdge.h:707
double GetTolerance2DAt(double Coordinate) const
Definition TopologicalEdge.h:206
virtual void ResetMarkersRecursively() const override
Definition TopologicalEdge.h:188
virtual void ResetThinPeakMarker() const
Definition TopologicalEdge.h:839
FVector2d Approximate2DPoint(const double InCoordinate) const
Definition TopologicalEdge.h:681
TArray< FCuttingPoint > & GetCuttingPoints()
Definition TopologicalEdge.h:576
void GetDiscretization2DPoints(EOrientation Orientation, TArray< PointType > &OutPoints) const
Definition TopologicalEdge.h:758
const TArray< double > & GetCrossingPointUs() const
Definition TopologicalEdge.h:531
void ApproximatePolyline(FSurfacicPolyline &Polyline) const
Definition TopologicalEdge.h:697
const TSharedRef< FTopologicalVertex > GetEndVertex(bool Forward) const
Definition TopologicalEdge.h:378
virtual void SetThinPeakMarker() const
Definition TopologicalEdge.h:834
TSharedRef< FTopologicalEdge > GetLinkActiveEdge()
Definition TopologicalEdge.h:271
TSharedRef< FRestrictionCurve > GetCurve() const
Definition TopologicalEdge.h:634
bool IsSurfacic() const
Definition TopologicalEdge.h:870
TArray< double > CrossingPointDeltaUMaxs
Definition TopologicalEdge.h:117
const FTopologicalLoop * GetLoop() const
Definition TopologicalEdge.h:343
const FTopologicalVertex * GetOtherVertex(const FTopologicalVertex &Vertex) const
Definition TopologicalEdge.h:413
TSharedRef< FRestrictionCurve > GetCurve()
Definition TopologicalEdge.h:639
TSharedPtr< FEdgeMesh > Mesh
Definition TopologicalEdge.h:89
double GetEndCurvilinearCoordinates() const
Definition TopologicalEdge.h:441
FVector GetEndBarycenter()
Definition TopologicalEdge.h:457
void InitDeltaUs()
Definition TopologicalEdge.h:522
int32 GetThinZoneCount() const
Definition TopologicalEdge.h:612
TSharedPtr< FTopologicalVertex > StartVertex
Definition TopologicalEdge.h:73
FVector GetEndCoordinate()
Definition TopologicalEdge.h:473
void ApproximatePoints(const TArray< double > &InCoordinates, TArray< FVector > &OutPoints) const
Definition TopologicalEdge.h:673
TSharedPtr< FRestrictionCurve > Curve
Definition TopologicalEdge.h:81
TArray< FLinearBoundary > ThinZoneBounds
Definition TopologicalEdge.h:102
TArray< double > CrossingPointUs
Definition TopologicalEdge.h:107
bool IsClosed() const
Definition TopologicalEdge.h:315
const TSharedRef< FTopologicalVertex > GetStartVertex(bool Forward) const
Definition TopologicalEdge.h:373
FTopologicalEdge * GetTwinEdge() const
Definition TopologicalEdge.h:292
TSharedRef< FTopologicalVertex > GetEndVertex()
Definition TopologicalEdge.h:398
const TSharedRef< FTopologicalVertex > GetStartVertex(EOrientation Forward) const
Definition TopologicalEdge.h:363
double GetStartCurvilinearCoordinates() const
Definition TopologicalEdge.h:436
void GetTangentsAtExtremities(FVector &StartTangent, FVector &EndTangent, EOrientation Orientation) const
Definition TopologicalEdge.h:479
void ProjectTwinEdgePoints(const TArray< FVector > &InPointsToProject, bool bSameOrientation, TArray< double > &OutProjectedPointCoords) const
Definition TopologicalEdge.h:738
FTopologicalEdge * GetPreMeshedTwin()
Definition TopologicalEdge.h:508
void ComputeIntersectionsWithIsos(const TArray< double > &InIsoCoordinates, const EIso InTypeIso, const FSurfacicTolerance &ToleranceIso, TArray< double > &OutIntersection) const
Definition TopologicalEdge.h:749
void EvaluatePoint(double InCoordinate, int32 Derivative, FCurvePoint &Point) const
Definition TopologicalEdge.h:656
void GetExtremities(FSurfacicCurveExtremities &Extremities) const
Definition TopologicalEdge.h:776
const TArray< FThinZoneSide * > & GetThinZoneSides() const
Definition TopologicalEdge.h:617
virtual void ResetVirtuallyMeshedMarker() const
Definition TopologicalEdge.h:854
FTopologicalEdge * GetFirstTwinEdge() const
Definition TopologicalEdge.h:276
double ProjectPoint(const PointType &InPointToProject, PointType &OutProjectedPoint) const
Definition TopologicalEdge.h:722
TSharedRef< FTopologicalVertex > GetStartVertex()
Definition TopologicalEdge.h:393
const TSharedRef< FTopologicalVertex > GetEndVertex() const
Definition TopologicalEdge.h:388
void EvaluatePoints(const TArray< double > &InCoordinates, int32 DerivativeOrder, TArray< FCurvePoint > &OutPoints) const
Definition TopologicalEdge.h:665
Definition TopologicalFace.h:56
Definition TopologicalLoop.h:60
Definition TopologicalVertex.h:83
Definition Linkable.h:15
Definition CADEntity.cpp:23
EOrientation
Definition GeoEnum.h:82
TTopologicalLink< FTopologicalEdge > FEdgeLink
Definition TopologicalEdge.h:17
ECoordinateType
Definition MeshEnum.h:32
@ OtherCoordinate
Definition MeshEnum.h:38
void GetCuttingPointCoordinates(const TArray< FCuttingPointType > &CuttingPoints, TArray< double > &CuttingPointCoordinates)
Definition TopologicalEdge.h:1025
EIso
Definition GeoEnum.h:66
@ Curve
Definition Visu.h:19
@ Iso
Definition Visu.h:20
EEntity
Definition CADEntity.h:18
U16 Index
Definition radfft.cpp:71
static constexpr UE_FORCEINLINE_HINT T Square(const T A)
Definition UnrealMathUtility.h:578
Definition GeoPoint.h:50
Definition TopologicalEdge.h:1007
constexpr const TArray< FCuttingPoint > & operator[](EIso Iso) const
Definition TopologicalEdge.h:1016
constexpr TArray< FCuttingPoint > & operator[](EIso Iso)
Definition TopologicalEdge.h:1010
Definition TopologicalEdge.h:964
ECoordinateType Type
Definition TopologicalEdge.h:969
FPairOfIndex OppositNodeIndices
Definition TopologicalEdge.h:970
FCuttingPoint(double InCoordinate, ECoordinateType InType)
Definition TopologicalEdge.h:981
FCuttingPoint(double InCoordinate, ECoordinateType InType, int32 InOppositeNodeId, double DeltaU)
Definition TopologicalEdge.h:997
FCuttingPoint()
Definition TopologicalEdge.h:973
double Coordinate
Definition TopologicalEdge.h:968
FCuttingPoint(double InCoordinate, ECoordinateType InType, FPairOfIndex InOppositNodeIndices, double DeltaU)
Definition TopologicalEdge.h:989
Definition TopologicalEdge.h:889
void Add2(FEdge2DProperties &Property)
Definition TopologicalEdge.h:907
void Add(double InSlope, double InLength)
Definition TopologicalEdge.h:897
void Add(FEdge2DProperties &Property)
Definition TopologicalEdge.h:920
void Finalize()
Definition TopologicalEdge.h:927
Definition TopologicalEdge.h:27
FImposedCuttingPoint()
Definition TopologicalEdge.h:35
FImposedCuttingPoint(const double InCoordinate, const int32 NodeIndex1, const double InDeltaU=0.)
Definition TopologicalEdge.h:39
Definition Boundary.h:18
constexpr double GetMin() const
Definition Boundary.h:61
constexpr double GetMax() const
Definition Boundary.h:66
Definition Types.h:33