UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Linkable.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Core/EntityGeom.h"
7
8namespace UE::CADKernel
9{
10
11class FModelMesh;
12
13template<typename EntityType, typename LinkType>
15{
16protected:
18
19public:
20 TLinkable() = default;
21
22 virtual ~TLinkable() override
23 {
24 TLinkable::Empty();
25 }
26
27 void Finalize()
28 {
30 TopologicalLink = FEntity::MakeShared<LinkType>((EntityType&)(*this));
31 }
32
33 virtual void Serialize(FCADKernelArchive& Ar) override
34 {
35 FTopologicalEntity::Serialize(Ar);
36 SerializeIdent(Ar, TopologicalLink);
37 }
38
39 virtual void Empty() override
40 {
41 TopologicalLink.Reset();
42 }
43
45 {
47 EntityType* ActiveEntity = TopologicalLink->GetActiveEntity();
48 return StaticCastSharedRef<EntityType>(ActiveEntity->AsShared());
49 }
50
52 {
54 EntityType* ActiveEntity = TopologicalLink->GetActiveEntity();
55 return StaticCastSharedRef<EntityType>(ActiveEntity->AsShared());
56 }
57
58 bool IsActiveEntity() const
59 {
61
62 if (TopologicalLink->GetTwinEntityNum() == 1)
63 {
64 return true;
65 }
66
67 return (TopologicalLink->GetActiveEntity() == this);
68 }
69
70 void Activate()
71 {
73 TopologicalLink->ActivateEntity(*this);
74 }
75
77 {
79 return TopologicalLink;
80 }
81
83 {
85 return TopologicalLink;
86 }
87
89 {
90 TopologicalLink.Reset();
91 TopologicalLink = FEntity::MakeShared<LinkType>((EntityType&)(*this));
92 }
93
94 bool IsLinkedTo(const TSharedRef<EntityType>& Entity) const
95 {
96 if (this == &*Entity)
97 {
98 return true;
99 }
100 return (Entity->TopologicalLink == TopologicalLink);
101 }
102
103 bool IsLinkedTo(const EntityType& Entity) const
104 {
105 if (this == &Entity)
106 {
107 return true;
108 }
109 return (Entity.TopologicalLink == TopologicalLink);
110 }
111
113 {
115 return TopologicalLink->GetTwinEntityNum();
116 }
117
118 bool HasTwin() const
119 {
120 return GetTwinEntityCount() != 1;
121 }
122
124 {
126 return TopologicalLink->GetTwinEntities();
127 }
128
129 virtual void RemoveFromLink()
130 {
132 TopologicalLink->RemoveEntity((EntityType&)*this);
133 ResetTopologicalLink();
134 }
135
140 {
141 TArray<EntityType*> Twins = GetTwinEntities();
142 for (EntityType* Entity : Twins)
143 {
144 Entity->ResetTopologicalLink();
145 }
146 }
147
148 const bool IsThinZone() const
149 {
150 return ((States & EHaveStates::ThinZone) == EHaveStates::ThinZone);
151 }
152
153 virtual void SetThinZoneMarker()
154 {
155 States |= EHaveStates::ThinZone;
156 }
157
158 virtual void ResetThinZone()
159 {
160 States &= ~EHaveStates::ThinZone;
161 }
162
163 virtual void ResetMarkersRecursively() const override
164 {
165 TopologicalLink->ResetMarkersRecursively();
166 }
167
168
169protected:
170
171 void MakeLink(EntityType& Twin)
172 {
174 TSharedPtr<LinkType> Link2 = Twin.TopologicalLink;
175
176 ensureCADKernel(Link1.IsValid() && Link2.IsValid());
177
178 if (Link1 == Link2)
179 {
180 return;
181 }
182
183 if (Link2->GetTwinEntityNum() > Link1->GetTwinEntityNum())
184 {
185 Swap(Link1, Link2);
186 }
187
188 Link1->AddEntities(Link2->GetTwinEntities());
189 for (EntityType* Entity : Link2->GetTwinEntities())
190 {
191 Entity->SetTopologicalLink(Link1);
192 }
193 Link2->Delete();
194 }
195
196protected:
201};
202
203} // namespace UE::CADKernel
204
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
Definition Array.h:670
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition CADKernelArchive.h:19
Definition TopologicalEntity.h:16
Definition Linkable.h:15
TSharedRef< EntityType > GetLinkActiveEntity()
Definition Linkable.h:51
bool IsActiveEntity() const
Definition Linkable.h:58
void ResetTopologicalLink()
Definition Linkable.h:88
void Finalize()
Definition Linkable.h:27
TSharedPtr< LinkType > TopologicalLink
Definition Linkable.h:17
virtual ~TLinkable() override
Definition Linkable.h:22
void Activate()
Definition Linkable.h:70
bool IsLinkedTo(const TSharedRef< EntityType > &Entity) const
Definition Linkable.h:94
virtual void Serialize(FCADKernelArchive &Ar) override
Definition Linkable.h:33
const TArray< EntityType * > & GetTwinEntities() const
Definition Linkable.h:123
bool IsLinkedTo(const EntityType &Entity) const
Definition Linkable.h:103
void MakeLink(EntityType &Twin)
Definition Linkable.h:171
virtual void ResetMarkersRecursively() const override
Definition Linkable.h:163
const bool IsThinZone() const
Definition Linkable.h:148
virtual TSharedPtr< LinkType > GetLink() const
Definition Linkable.h:76
virtual void Empty() override
Definition Linkable.h:39
virtual void ResetThinZone()
Definition Linkable.h:158
void SetTopologicalLink(TSharedPtr< LinkType > Link)
Definition Linkable.h:197
void UnlinkTwinEntities()
Definition Linkable.h:139
virtual TSharedPtr< LinkType > GetLink()
Definition Linkable.h:82
const TSharedRef< const EntityType > GetLinkActiveEntity() const
Definition Linkable.h:44
virtual void RemoveFromLink()
Definition Linkable.h:129
virtual void SetThinZoneMarker()
Definition Linkable.h:153
bool HasTwin() const
Definition Linkable.h:118
int32 GetTwinEntityCount() const
Definition Linkable.h:112
Definition CADEntity.cpp:23