mirror of
https://github.com/mcneel/opennurbs.git
synced 2026-03-01 03:26:09 +08:00
1459 lines
51 KiB
C++
1459 lines
51 KiB
C++
//
|
|
// Copyright (c) 1993-2022 Robert McNeel & Associates. All rights reserved.
|
|
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
|
|
// McNeel & Associates.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
|
|
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
|
|
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
|
|
//
|
|
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
#include "opennurbs.h"
|
|
|
|
#if !defined(ON_COMPILING_OPENNURBS)
|
|
// This check is included in all opennurbs source .c and .cpp files to insure
|
|
// ON_COMPILING_OPENNURBS is defined when opennurbs source is compiled.
|
|
// When opennurbs source is being compiled, ON_COMPILING_OPENNURBS is defined
|
|
// and the opennurbs .h files alter what is declared and how it is declared.
|
|
#error ON_COMPILING_OPENNURBS must be defined when compiling opennurbs
|
|
#endif
|
|
|
|
#include "opennurbs_internal_V2_annotation.h"
|
|
#include "opennurbs_internal_V5_annotation.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// This file contains code that translates current annotation object
|
|
// definitions to and from obsolete V2 and V5 annotation object definitions.
|
|
// This code is used to read and write old file formats.
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// text justification
|
|
//
|
|
#pragma region
|
|
|
|
ON::TextVerticalAlignment ON::TextVerticalAlignmentFromV5Justification(
|
|
unsigned int v5_justification_bits
|
|
)
|
|
{
|
|
ON::TextVerticalAlignment valign = ON::TextVerticalAlignment::Top;
|
|
|
|
const unsigned int v5_valign_mask
|
|
= ON_OBSOLETE_V5_TextObject::eTextJustification::tjBottom
|
|
| ON_OBSOLETE_V5_TextObject::eTextJustification::tjMiddle
|
|
| ON_OBSOLETE_V5_TextObject::eTextJustification::tjTop
|
|
| ON_OBSOLETE_V5_TextObject::eTextJustification::tjUndefined;
|
|
|
|
if (ON_OBSOLETE_V5_TextObject::eTextJustification::tjTop == (v5_justification_bits & v5_valign_mask))
|
|
valign = ON::TextVerticalAlignment::Top;
|
|
else if (ON_OBSOLETE_V5_TextObject::eTextJustification::tjMiddle == (v5_justification_bits & v5_valign_mask))
|
|
valign = ON::TextVerticalAlignment::Middle;
|
|
else if (ON_OBSOLETE_V5_TextObject::eTextJustification::tjBottom == (v5_justification_bits & v5_valign_mask))
|
|
valign = ON::TextVerticalAlignment::Bottom;
|
|
|
|
return valign;
|
|
}
|
|
|
|
ON::TextHorizontalAlignment ON::TextHorizontalAlignmentFromV5Justification(
|
|
unsigned int v5_justification_bits
|
|
)
|
|
{
|
|
ON::TextHorizontalAlignment halign = ON::TextHorizontalAlignment::Left;
|
|
|
|
const unsigned int v5_halign_mask
|
|
= ON_OBSOLETE_V5_TextObject::eTextJustification::tjLeft
|
|
| ON_OBSOLETE_V5_TextObject::eTextJustification::tjCenter
|
|
| ON_OBSOLETE_V5_TextObject::eTextJustification::tjRight;
|
|
|
|
if (ON_OBSOLETE_V5_TextObject::eTextJustification::tjCenter == (v5_justification_bits & v5_halign_mask))
|
|
halign = ON::TextHorizontalAlignment::Center;
|
|
else if (ON_OBSOLETE_V5_TextObject::eTextJustification::tjRight == (v5_justification_bits & v5_halign_mask))
|
|
halign = ON::TextHorizontalAlignment::Right;
|
|
|
|
return halign;
|
|
}
|
|
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// annotation base class
|
|
//
|
|
#pragma region
|
|
|
|
ON_Annotation* ON_Annotation::CreateFromV2Annotation(
|
|
const class ON_OBSOLETE_V2_Annotation& V2_annotation,
|
|
const class ON_3dmAnnotationContext* annotation_context
|
|
)
|
|
{
|
|
ON_OBSOLETE_V5_Annotation* V5_annotation = ON_OBSOLETE_V5_Annotation::CreateFromV2Annotation(V2_annotation, annotation_context);
|
|
if (nullptr == V5_annotation)
|
|
return nullptr;
|
|
ON_Annotation* V6_annotation = ON_Annotation::CreateFromV5Annotation(*V5_annotation, annotation_context);
|
|
delete V5_annotation;
|
|
return V6_annotation;
|
|
}
|
|
|
|
void ON_Annotation::Internal_SetDimStyleFromV5Annotation(
|
|
const class ON_OBSOLETE_V5_Annotation& V5_annotation,
|
|
const class ON_3dmAnnotationContext* annotation_context
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_UUID parent_dim_style_id
|
|
= (nullptr == annotation_context)
|
|
? ON_nil_uuid
|
|
: annotation_context->ParentDimStyleId();
|
|
SetDimensionStyleId( parent_dim_style_id );
|
|
const ON_DimStyle* override_candidate
|
|
= (ON_nil_uuid == parent_dim_style_id || nullptr == annotation_context || false == annotation_context->IsOverrideDimStyle())
|
|
? nullptr
|
|
: &annotation_context->DimStyle();
|
|
if (nullptr != override_candidate)
|
|
{
|
|
ON_DimStyle* ds = new ON_DimStyle(*override_candidate);
|
|
ds->SetParentId(parent_dim_style_id);
|
|
ds->ClearId();
|
|
ds->ClearIndex();
|
|
ds->ClearName();
|
|
SetOverrideDimensionStyle(ds);
|
|
if (nullptr != ds && ds != m_override_dimstyle)
|
|
delete ds;
|
|
}
|
|
}
|
|
|
|
ON_Annotation* ON_Annotation::CreateFromV5Annotation(
|
|
const class ON_OBSOLETE_V5_Annotation& V5_annotation,
|
|
const class ON_3dmAnnotationContext* annotation_context
|
|
)
|
|
{
|
|
const ON_OBSOLETE_V5_TextObject* V5_text_object = ON_OBSOLETE_V5_TextObject::Cast(&V5_annotation);
|
|
if (nullptr != V5_text_object)
|
|
return ON_Text::CreateFromV5TextObject(*V5_text_object, annotation_context, nullptr);
|
|
|
|
const ON_OBSOLETE_V5_Leader* V5_leader = ON_OBSOLETE_V5_Leader::Cast(&V5_annotation);
|
|
if ( nullptr != V5_leader )
|
|
return ON_Leader::CreateFromV5Leader(*V5_leader, annotation_context, nullptr);
|
|
|
|
const ON_OBSOLETE_V5_DimLinear* V5_dim_linear = ON_OBSOLETE_V5_DimLinear::Cast(&V5_annotation);
|
|
if ( nullptr != V5_dim_linear )
|
|
return ON_DimLinear::CreateFromV5DimLinear(*V5_dim_linear, annotation_context, nullptr);
|
|
|
|
const ON_OBSOLETE_V5_DimAngular* V5_dim_angle = ON_OBSOLETE_V5_DimAngular::Cast(&V5_annotation);
|
|
if ( nullptr != V5_dim_angle )
|
|
return ON_DimAngular::CreateFromV5DimAngular(*V5_dim_angle, annotation_context, nullptr);
|
|
|
|
const ON_OBSOLETE_V5_DimRadial* V5_dim_radial = ON_OBSOLETE_V5_DimRadial::Cast(&V5_annotation);
|
|
if ( nullptr != V5_dim_radial )
|
|
return ON_DimRadial::CreateFromV5DimRadial(*V5_dim_radial, annotation_context, nullptr);
|
|
|
|
const ON_OBSOLETE_V5_DimOrdinate* V5_dim_ordinate = ON_OBSOLETE_V5_DimOrdinate::Cast(&V5_annotation);
|
|
if ( nullptr != V5_dim_ordinate )
|
|
return ON_DimOrdinate::CreateFromV5DimOrdinate(*V5_dim_ordinate, annotation_context, nullptr);
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
void ON_OBSOLETE_V5_Annotation::Internal_InitializeFromV2Annotation(
|
|
const class ON_OBSOLETE_V2_Annotation& V2_annotation,
|
|
const class ON_3dmAnnotationContext* annotation_context
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
//const ON_3dmAnnotationSettings& annotation_settings = annotation_context->AnnotationSettings();
|
|
|
|
SetTextFormula(nullptr);
|
|
|
|
ON_wString text
|
|
= (V2_annotation.m_usertext.IsNotEmpty())
|
|
? V2_annotation.m_usertext
|
|
: V2_annotation.m_defaulttext;
|
|
text.TrimLeftAndRight();
|
|
|
|
SetTextValue(text);
|
|
|
|
// 30 Oct 2013 - Lowell - changed to copy the number of points in V2_annotation.PointCount() instead of always 5
|
|
const int V2_point_count = V2_annotation.PointCount();
|
|
const ON_2dVector v
|
|
= (V2_point_count > 0 && V2_annotation.m_points[0].IsValid() && ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAngular != V2_annotation.m_type)
|
|
? (ON_2dPoint::Origin - V2_annotation.m_points[0])
|
|
: ON_2dVector::ZeroVector;
|
|
|
|
m_points.SetCount(0);
|
|
m_points.Reserve(V2_point_count);
|
|
if (V2_point_count > 0)
|
|
m_points.Append(ON_2dPoint::Origin);
|
|
for (int i = 1; i < V2_point_count; i++)
|
|
{
|
|
const ON_2dPoint V2_point = V2_annotation.Point(i);
|
|
ON_2dPoint v5_point
|
|
= V2_point.IsValid()
|
|
? V2_point + v
|
|
: V2_point;
|
|
SetPoint(i, v5_point);
|
|
}
|
|
|
|
m_plane = V2_annotation.Plane();
|
|
m_plane.UpdateEquation();
|
|
if (false == m_plane.IsValid())
|
|
m_plane = ON_Plane::World_xy;
|
|
else if (v.IsNotZero())
|
|
{
|
|
m_plane.origin = m_plane.PointAt(-v.x, -v.y);
|
|
m_plane.UpdateEquation();
|
|
}
|
|
|
|
m_textheight = 1.0;
|
|
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode text_display_mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kNormal;
|
|
bool bUserPositionedText = false;
|
|
int min_point_count = -1;
|
|
int max_point_count = -1;
|
|
|
|
switch (V2_annotation.m_type)
|
|
{
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtNothing:
|
|
m_textdisplaymode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kNormal;
|
|
break;
|
|
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimLinear:
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAligned:
|
|
text_display_mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kAboveLine;
|
|
min_point_count = ON_OBSOLETE_V5_DimLinear::dim_pt_count;
|
|
max_point_count = ON_OBSOLETE_V5_DimLinear::dim_pt_count;
|
|
break;
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAngular:
|
|
bUserPositionedText = V2_annotation.UserPositionedText() ? true : false;
|
|
text_display_mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kAboveLine;
|
|
min_point_count = 2;
|
|
max_point_count = 3;
|
|
break;
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimDiameter:
|
|
bUserPositionedText = V2_annotation.UserPositionedText() ? true : false;
|
|
break;
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimRadius:
|
|
bUserPositionedText = V2_annotation.UserPositionedText() ? true : false;
|
|
break;
|
|
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtLeader:
|
|
bUserPositionedText = false;
|
|
text_display_mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kInLine;
|
|
min_point_count = 2;
|
|
break;
|
|
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtTextBlock:
|
|
break;
|
|
|
|
case ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimOrdinate:
|
|
break;
|
|
|
|
default:
|
|
m_textdisplaymode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kNormal;
|
|
break;
|
|
}
|
|
|
|
m_textdisplaymode = text_display_mode;
|
|
m_userpositionedtext = bUserPositionedText;
|
|
|
|
if (max_point_count > 0 && max_point_count >= min_point_count && m_points.Count() > max_point_count)
|
|
m_points.SetCount(max_point_count);
|
|
else if (min_point_count >= 0 && m_points.Count() < min_point_count)
|
|
m_points.SetCount(0);
|
|
|
|
SetV5_3dmArchiveDimStyleIndex(annotation_context->V5_ArchiveDimStyleIndex());
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// text object
|
|
//
|
|
#pragma region
|
|
|
|
void ON_Text::Internal_SetObsoleteV5TextObjectInformation(
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
const class ON_OBSOLETE_V5_TextObject& V5_text_object
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
const ON_DimStyle& dim_style = annotation_context->DimStyle();
|
|
|
|
const ON::LengthUnitSystem V5_model_space_object_unit_system = annotation_context->ModelLengthUnitSystem();
|
|
|
|
const double obsolete_V5_text_object_height = V5_text_object.Height();
|
|
const double obsolete_V5_model_space_text_scale
|
|
= annotation_context->AnnotationSettings().Is_V5_AnnotationScalingEnabled()
|
|
? annotation_context->AnnotationSettings().WorldViewTextScale()
|
|
: 1.0;
|
|
|
|
// Set m_obsolete_V5_text_object_height
|
|
for (;;)
|
|
{
|
|
if (!ON_IsValid(obsolete_V5_text_object_height))
|
|
break;
|
|
if (!(obsolete_V5_text_object_height > 0.0))
|
|
break;
|
|
|
|
const double unit_scale = ON::UnitScale(V5_model_space_object_unit_system, dim_style.UnitSystem());
|
|
if (false == ON_IsValidPositiveNumber(unit_scale))
|
|
break;
|
|
|
|
const double V6_object_text_height = unit_scale*obsolete_V5_text_object_height;
|
|
if (!ON_IsValid(V6_object_text_height))
|
|
break;
|
|
if (!(V6_object_text_height > 0.0))
|
|
break;
|
|
|
|
const double dim_style_text_height = dim_style.TextHeight();
|
|
if (!ON_IsValid(dim_style_text_height))
|
|
break;
|
|
if (!(dim_style_text_height > 0.0))
|
|
break;
|
|
|
|
if (fabs(V6_object_text_height - dim_style_text_height) <= dim_style_text_height*0.01)
|
|
break;
|
|
|
|
// override text height setting
|
|
SetTextHeight(&parent_dim_style, V6_object_text_height);
|
|
break;
|
|
}
|
|
|
|
SetAllowTextScaling(V5_text_object.m_annotative_scale);
|
|
|
|
// Set m_obsolete_V5_model_space_text_scale
|
|
for (;;)
|
|
{
|
|
if (!V5_text_object.m_annotative_scale)
|
|
break;
|
|
|
|
if (false == annotation_context->AnnotationSettings().Is_V5_AnnotationScalingEnabled())
|
|
break;
|
|
|
|
if (!ON_IsValid(obsolete_V5_model_space_text_scale))
|
|
break;
|
|
if (!(obsolete_V5_model_space_text_scale > 0.0))
|
|
break;
|
|
|
|
const double dim_style_model_space_text_scale = dim_style.DimScale();
|
|
if (!ON_IsValid(dim_style_model_space_text_scale))
|
|
break;
|
|
if (!(dim_style_model_space_text_scale > 0.0))
|
|
break;
|
|
|
|
|
|
if (fabs(obsolete_V5_model_space_text_scale - dim_style_model_space_text_scale) <= dim_style_model_space_text_scale*0.01)
|
|
break;
|
|
|
|
// override dim scale setting
|
|
SetDimScale(&parent_dim_style, obsolete_V5_model_space_text_scale);
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
static bool RemoveV5Wrapping(const wchar_t* txt, const ON_DimStyle& dimstyle, double& wrapwidth, ON_wString& newtxt)
|
|
{
|
|
if (nullptr == txt)
|
|
return false;
|
|
|
|
bool wrapped = false;
|
|
int slen = (int)wcslen(txt);
|
|
newtxt.ReserveArray(slen + 1);
|
|
int linestart = 0;
|
|
ON_wString textline;
|
|
wrapwidth = 0.0;
|
|
for (int i = 0; i < slen; i++)
|
|
{
|
|
// throw away \n not after \r
|
|
if (txt[i] == L'\n' && i > 0 && txt[i - 1] != L'\r')
|
|
{
|
|
// Make ON_Text with one wrapped line to measure width
|
|
textline = txt + linestart;
|
|
textline.SetLength(i - linestart);
|
|
if(i < slen-1)
|
|
linestart = i + 1;
|
|
ON_Text* temptext = new ON_Text();
|
|
textline += L' ';
|
|
temptext->Create(textline, &dimstyle, ON_xy_plane);
|
|
ON_3dPoint pts[4];
|
|
temptext->GetText3dCorners(pts);
|
|
delete temptext;
|
|
double w = pts[1].x - pts[0].x;
|
|
if (w > wrapwidth)
|
|
wrapwidth = w;
|
|
|
|
wrapped = true;
|
|
newtxt += L" ";
|
|
continue;
|
|
}
|
|
newtxt += txt[i];
|
|
}
|
|
return wrapped;
|
|
}
|
|
|
|
ON_Text* ON_Text::CreateFromV5TextObject(
|
|
const class ON_OBSOLETE_V5_TextObject& V5_text_object,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_Text* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_DimStyle& dim_style = annotation_context->DimStyle();
|
|
|
|
const unsigned int just = V5_text_object.Justification();
|
|
const ON::TextHorizontalAlignment halign = ON::TextHorizontalAlignmentFromV5Justification(just);
|
|
const ON::TextVerticalAlignment valign = ON::TextVerticalAlignmentFromV5Justification(just);
|
|
|
|
ON_Plane plane = V5_text_object.Plane();
|
|
const double v5height = V5_text_object.Height();
|
|
ON_wString txt = V5_text_object.TextFormula();
|
|
if (txt.IsEmpty())
|
|
txt = V5_text_object.TextValue();
|
|
|
|
ON_Text* V6_text_object = (nullptr != destination)
|
|
? destination
|
|
: new ON_Text();
|
|
|
|
double wrapwidth = 0.0;
|
|
ON_wString newtxt;
|
|
bool wraptext = RemoveV5Wrapping(txt, dim_style, wrapwidth, newtxt);
|
|
|
|
newtxt.Replace(L"\\", L"\\\\");
|
|
|
|
if (wraptext)
|
|
{
|
|
double dimscale = dim_style.DimScale();
|
|
double dsht = dim_style.TextHeight();
|
|
double widthscale = v5height * dimscale / dsht;
|
|
double width = (wrapwidth + (v5height * 0.1)) * widthscale;
|
|
V6_text_object->Create(newtxt, &dim_style, plane, true, width, 0.0);
|
|
}
|
|
else
|
|
V6_text_object->Create(newtxt, &dim_style, plane);
|
|
|
|
// These override settings currently get erased by
|
|
// ON_Annotation::SetDimensionStyleId(ON_UUID dimstyle_id)
|
|
// which deletes any existing override style
|
|
|
|
if (v5height > 0.0 && v5height != dim_style.TextHeight())
|
|
V6_text_object->SetTextHeight(&dim_style, v5height);
|
|
if (halign != dim_style.TextHorizontalAlignment())
|
|
V6_text_object->SetTextHorizontalAlignment(&dim_style, halign);
|
|
if (valign != dim_style.TextVerticalAlignment())
|
|
V6_text_object->SetTextVerticalAlignment(&dim_style, valign);
|
|
|
|
bool setmask = false;
|
|
ON_TextMask mask = dim_style.TextMask();
|
|
bool drawmask = V5_text_object.DrawTextMask();
|
|
if (drawmask != mask.DrawTextMask())
|
|
{
|
|
mask.SetDrawTextMask(drawmask);
|
|
setmask = true;
|
|
}
|
|
if (drawmask)
|
|
{
|
|
double mb = V5_text_object.MaskOffsetFactor() * v5height;
|
|
if (mb != mask.MaskBorder())
|
|
{
|
|
mask.SetMaskBorder(mb);
|
|
setmask = true;
|
|
}
|
|
ON_TextMask::MaskType mt = mask.MaskFillType();
|
|
int mc = V5_text_object.MaskColorSource();
|
|
if ((mt == ON_TextMask::MaskType::BackgroundColor && mc != 0) ||
|
|
(mt == ON_TextMask::MaskType::MaskColor && mc != 1))
|
|
{
|
|
mask.SetMaskFillType(mc == 0 ? ON_TextMask::MaskType::BackgroundColor : ON_TextMask::MaskType::MaskColor);
|
|
setmask = true;
|
|
}
|
|
if (V5_text_object.MaskColor() != mask.MaskColor())
|
|
{
|
|
mask.SetMaskColor(V5_text_object.MaskColor());
|
|
setmask = true;
|
|
}
|
|
}
|
|
if (setmask)
|
|
V6_text_object->SetTextMask(&dim_style, mask);
|
|
|
|
|
|
if (V5_text_object.m_annotative_scale && annotation_context->AnnotationSettingsAreSet())
|
|
{
|
|
if (false == annotation_context->AnnotationSettings().Is_V5_AnnotationScalingEnabled())
|
|
{
|
|
if (!(1.0 == dim_style.DimScale()))
|
|
{
|
|
V6_text_object->SetDimScale(&dim_style, 1.0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!(annotation_context->AnnotationSettings().WorldViewTextScale() == dim_style.DimScale()))
|
|
{
|
|
V6_text_object->SetDimScale(&dim_style, annotation_context->AnnotationSettings().WorldViewTextScale());
|
|
}
|
|
}
|
|
}
|
|
V6_text_object->Internal_SetObsoleteV5TextObjectInformation(
|
|
annotation_context,
|
|
V5_text_object
|
|
);
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
parent_dim_style.ContentHash();
|
|
V6_text_object->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_text_object;
|
|
}
|
|
|
|
ON_OBSOLETE_V5_TextObject* ON_OBSOLETE_V5_TextObject::CreateFromV6TextObject(
|
|
const class ON_Text& V6_text_object,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_TextObject* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
const ON_TextContent* textgeom = V6_text_object.Text();
|
|
if (nullptr == textgeom)
|
|
return nullptr;
|
|
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
ON::TextHorizontalAlignment halign = ON::TextHorizontalAlignment::Left;
|
|
ON::TextVerticalAlignment valign = ON::TextVerticalAlignment::Top;
|
|
V6_text_object.GetAlignment(halign, valign);
|
|
unsigned int justification = 0;
|
|
switch (halign)
|
|
{
|
|
case ON::TextHorizontalAlignment::Left:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjLeft;
|
|
break;
|
|
case ON::TextHorizontalAlignment::Center:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjCenter;
|
|
break;
|
|
case ON::TextHorizontalAlignment::Right:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjRight;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
switch (valign)
|
|
{
|
|
case ON::TextVerticalAlignment::Top:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjTop;
|
|
break;
|
|
case ON::TextVerticalAlignment::Middle:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjMiddle;
|
|
break;
|
|
case ON::TextVerticalAlignment::Bottom:
|
|
justification |= ON_OBSOLETE_V5_Annotation::eTextJustification::tjBottom;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ON_OBSOLETE_V5_TextObject* V5_text_object
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_TextObject();
|
|
|
|
V5_text_object->SetPlane(V6_text_object.Plane());
|
|
|
|
#ifdef RH41840
|
|
const wchar_t* V6textfacename = V6_text_object.Font(&parent_dim_style).FontFaceName();
|
|
const wchar_t* runfacename = nullptr;
|
|
const ON_TextContent* text = V6_text_object.Text();
|
|
if (nullptr != text)
|
|
{
|
|
ON_TextRunArray* runs = text->TextRuns(true);
|
|
if (nullptr != runs)
|
|
{
|
|
int runcount = runs->Count();
|
|
for (int i = 0; i < runcount; i++)
|
|
{
|
|
const wchar_t* run_facename = (*runs)[i]->Font()->FontFaceName();
|
|
if (0 != wcscmp(V6textfacename, run_facename))
|
|
{
|
|
; // Some run on this text uses a font different than the style font
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (textgeom->HasWrappedRuns())
|
|
{
|
|
// RH-64471 - WrappedPlainTextWithFields() adds multiple copies of the entire
|
|
// text string for each wrapped run.
|
|
//const ON_wString plaintextFields = textgeom->WrappedPlainTextWithFields();
|
|
//V5_text_object->SetTextFormula(plaintextFields);
|
|
const ON_wString plaintext = textgeom->WrappedPlainText();
|
|
V5_text_object->SetTextValue(plaintext);
|
|
}
|
|
else
|
|
{
|
|
const ON_wString plaintextFields = textgeom->PlainTextWithFields();
|
|
V5_text_object->SetTextFormula(plaintextFields);
|
|
const ON_wString plaintext = textgeom->PlainText();
|
|
V5_text_object->SetTextValue(plaintext);
|
|
}
|
|
|
|
V5_text_object->SetV5_3dmArchiveDimStyleIndex( annotation_context->V5_ArchiveDimStyleIndex() );
|
|
V5_text_object->m_textheight = V6_text_object.TextHeight(&parent_dim_style);
|
|
V5_text_object->SetAnnotativeScaling(true);
|
|
V5_text_object->SetJustification(justification);
|
|
|
|
V5_text_object->m_annotative_scale = V6_text_object.AllowTextScaling();
|
|
|
|
if (ON::active_space::model_space == annotation_context->ViewContext())
|
|
{
|
|
double v5_text_entity_scale = 1.0;
|
|
if (V6_text_object.AllowTextScaling())
|
|
{
|
|
const ON_3dmAnnotationSettings& annotation_settings = annotation_context->AnnotationSettings();
|
|
if (annotation_settings.Is_V5_AnnotationScalingEnabled()
|
|
&& ON_IsValid(annotation_settings.m_dimscale)
|
|
&& annotation_settings.m_dimscale > 0.0
|
|
)
|
|
{
|
|
//v5_text_entity_scale = annotation_settings.m_dimscale;
|
|
v5_text_entity_scale = annotation_settings.WorldViewTextScale();
|
|
}
|
|
|
|
if (annotation_settings.IsModelSpaceAnnotationScalingEnabled())
|
|
{
|
|
const double dim_style_scale = V6_text_object.DimScale(&parent_dim_style);
|
|
if (ON_IsValid(dim_style_scale) && dim_style_scale > 0.0 && v5_text_entity_scale > 0.0 && dim_style_scale != v5_text_entity_scale)
|
|
{
|
|
const double scale = dim_style_scale / v5_text_entity_scale;
|
|
V5_text_object->m_textheight *= scale;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
break;
|
|
if (false == annotation_context->BinaryArchiveIsSet())
|
|
break;
|
|
const ON_BinaryArchive* archive = annotation_context->BinaryArchive();
|
|
if (nullptr == archive)
|
|
break;
|
|
if (archive->Archive3dmVersion() > 4)
|
|
break;
|
|
if (ON::archive_mode::write3dm != archive->Mode())
|
|
break;
|
|
|
|
// TODO
|
|
// 16 Nov, 2011 - Lowell - Change text to bottom left justified for pre-v5 files rr94270
|
|
//
|
|
// TODO for saveas V4 when we can test it somehow
|
|
//
|
|
////ON_2dPoint ll, lr, ur, ul;
|
|
////ON_3dPoint pt3;
|
|
////...->GetText2dCorners(ll, lr, ur, ul);
|
|
////double h = 0.0, v = 0.0;
|
|
////unsigned int tj = pTob->Justification();
|
|
////if(tj & ON_OBSOLETE_V5_Annotation::tjLeft)
|
|
//// h = 0.0;
|
|
////else if(tj & ON_OBSOLETE_V5_Annotation::tjCenter)
|
|
//// h = (ll.x - lr.x) / 2.0;
|
|
////else if(tj & ON_OBSOLETE_V5_Annotation::tjRight)
|
|
//// h = ll.x - lr.x;
|
|
////if(tj & ON_OBSOLETE_V5_Annotation::tjBottom)
|
|
//// v = 0.0;
|
|
////else if(tj & ON_OBSOLETE_V5_Annotation::tjMiddle)
|
|
//// v = (ll.y - ul.y) / 2.0;
|
|
////else if(tj & ON_OBSOLETE_V5_Annotation::tjTop)
|
|
//// v = ll.y - ul.y;
|
|
|
|
////pt3 = V5_text_object->Plane().PointAt(h, v);
|
|
////ON_Plane plane = V5_text_object->Plane();
|
|
////plane.origin = pt3;
|
|
////plane.UpdateEquation();
|
|
////V5_text_object->SetPlane(plane);
|
|
////V5_text_object->SetJustification(ON_OBSOLETE_V5_Annotation::tjBottomLeft);
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
return V5_text_object;
|
|
}
|
|
|
|
ON_OBSOLETE_V5_TextObject* ON_OBSOLETE_V5_TextObject::CreateFromV2TextObject(
|
|
const class ON_OBSOLETE_V2_TextObject& V2_text_object,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_TextObject* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_3dmAnnotationSettings& annotation_settings = annotation_context->AnnotationSettings();
|
|
const bool bAnnotationSettingsAreSet = annotation_context->AnnotationSettingsAreSet();
|
|
|
|
const ON_DimStyle dim_style = annotation_context->DimStyle();
|
|
const bool bDimStyleIsSet = annotation_context->DimStyleIsSet();
|
|
|
|
ON_OBSOLETE_V5_TextObject* V5_text_object
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_TextObject();
|
|
V5_text_object->Internal_InitializeFromV2Annotation(V2_text_object, annotation_context);
|
|
V5_text_object->m_type = ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtTextBlock;
|
|
|
|
const double dim_style_dim_scale
|
|
= bDimStyleIsSet
|
|
? dim_style.DimScale()
|
|
: 1.0;
|
|
|
|
const double V2_dim_scale
|
|
= (bAnnotationSettingsAreSet && ON_IsValid(annotation_settings.m_dimscale) && annotation_settings.m_dimscale > 0.0)
|
|
? annotation_settings.m_dimscale
|
|
: 1.0;
|
|
|
|
//const double dim_scale
|
|
// = (dim_style_dim_scale != V2_dim_scale && dim_style_dim_scale > 0.0 && V2_dim_scale > 0.0)
|
|
// ? V2_dim_scale / dim_style_dim_scale
|
|
// : 1.0;
|
|
|
|
const double model_view_text_scale
|
|
= (bAnnotationSettingsAreSet && annotation_settings.Is_V5_AnnotationScalingEnabled() && annotation_settings.WorldViewTextScale() > 0.0)
|
|
? annotation_settings.WorldViewTextScale()
|
|
: 1.0;
|
|
|
|
const double V2_to_V5_text_scale
|
|
= (model_view_text_scale > 0.0 && V2_dim_scale > 0.0 && dim_style_dim_scale > 0.0)
|
|
? model_view_text_scale*(V2_dim_scale / dim_style_dim_scale)
|
|
: 1.0;
|
|
|
|
|
|
V5_text_object->SetHeight(V2_text_object.Height()*V2_to_V5_text_scale);
|
|
|
|
// Adjust from top-left justified to baseline-justified
|
|
// 13 November 2006 Dale Lear
|
|
// The code that was here only worked for text entities
|
|
// in the x-y plane.
|
|
//plane.origin.y += -1.11 * pT->Height() * plane.yaxis.y;
|
|
//plane.origin.x += 1.11 * pT->Height() * plane.xaxis.y;
|
|
|
|
// works for any plane
|
|
ON_Plane plane = V2_text_object.m_plane;
|
|
plane.origin += -1.11 * (V2_text_object.Height()*V2_to_V5_text_scale) * plane.yaxis;
|
|
plane.UpdateEquation();
|
|
V5_text_object->SetPlane(plane);
|
|
|
|
|
|
return V5_text_object;
|
|
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// leader
|
|
//
|
|
#pragma region
|
|
|
|
ON_Leader* ON_Leader::CreateFromV5Leader(
|
|
const class ON_OBSOLETE_V5_Leader& V5_leader,
|
|
const ON_3dmAnnotationContext* annotation_context,
|
|
ON_Leader* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
const ON_DimStyle& dim_style = annotation_context->DimStyle();
|
|
|
|
const int pointcount = V5_leader.PointCount();
|
|
|
|
ON_3dPointArray points(pointcount);
|
|
if (0 == pointcount)
|
|
points.Append(ON_3dPoint::Origin);
|
|
else
|
|
{
|
|
for (int i = 0; i < pointcount; i++)
|
|
{
|
|
points.Append(V5_leader.Dim3dPoint(i));
|
|
}
|
|
}
|
|
|
|
const ON_Plane plane = V5_leader.Plane();
|
|
ON_wString ldrtext = V5_leader.TextFormula();
|
|
if (ldrtext.IsEmpty())
|
|
ldrtext = V5_leader.TextValue();
|
|
|
|
ON_Leader* V6_leader = (nullptr != destination)
|
|
? destination
|
|
: new ON_Leader;
|
|
|
|
double wrapwidth = 0.0;
|
|
ON_wString newtxt;
|
|
bool wraptext = RemoveV5Wrapping(ldrtext, dim_style, wrapwidth, newtxt);
|
|
newtxt.Replace(L"\\", L"\\\\");
|
|
|
|
V6_leader->Create(newtxt, &dim_style, points.Count(), points, plane, wraptext, wrapwidth);
|
|
|
|
V6_leader->Internal_SetDimStyleFromV5Annotation(V5_leader,annotation_context);
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
//ON_2dVector textdir;
|
|
//if (V5_leader.GetTextDirection(textdir))
|
|
//{
|
|
// ON_3dVector dir;
|
|
// dir.Set(textdir.x, textdir.y, 0.0);
|
|
// if (0.0 > dir * plane.xaxis)
|
|
// {
|
|
// // override
|
|
// V6_leader->SetLeaderTextHorizontalAlignment(&parent_dim_style, ON::TextHorizontalAlignment::Right);
|
|
// }
|
|
//}
|
|
|
|
// ON::TextHorizontalAlignment::Auto behaves like all V5 leaders did
|
|
V6_leader->SetLeaderTextHorizontalAlignment(&parent_dim_style, ON::TextHorizontalAlignment::Auto);
|
|
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
parent_dim_style.ContentHash();
|
|
V6_leader->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_leader;
|
|
}
|
|
|
|
ON_OBSOLETE_V5_Leader* ON_OBSOLETE_V5_Leader::CreateFromV6Leader(
|
|
const class ON_Leader& V6_leader,
|
|
const ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_Leader* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
//const ON_DimStyle& dim_style = annotation_context->DimStyle();
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
const ON_DimStyle& dim_style = V6_leader.DimensionStyle(parent_dim_style);
|
|
|
|
ON::TextVerticalAlignment valign = V6_leader.TextVerticalAlignment(&parent_dim_style);
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kInLine;
|
|
if (ON::TextVerticalAlignment::Bottom == valign)
|
|
mode = ON_INTERNAL_OBSOLETE::V5_TextDisplayMode::kAboveLine;
|
|
|
|
int pointcount = V6_leader.PointCount();
|
|
ON_2dPointArray dimpoints(pointcount+1);
|
|
for (int i = 0; i < pointcount; i++)
|
|
{
|
|
V6_leader.Point2d(i, dimpoints.AppendNew());
|
|
}
|
|
const double dimscale = V6_leader.DimScale(&parent_dim_style);
|
|
const bool bLeaderHasLanding = V6_leader.LeaderHasLanding(&parent_dim_style);
|
|
if (bLeaderHasLanding)
|
|
{
|
|
ON_Line ll;
|
|
V6_leader.LandingLine2d(&dim_style, dimscale, ll);
|
|
dimpoints.AppendNew() = ll.to;
|
|
}
|
|
|
|
ON_OBSOLETE_V5_Leader* V5_leader
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_Leader();
|
|
|
|
V5_leader->SetTextDisplayMode(mode);
|
|
V5_leader->SetPlane(V6_leader.Plane());
|
|
V5_leader->SetPoints(dimpoints);
|
|
|
|
const ON_TextContent* textgeom = V6_leader.Text();
|
|
if (nullptr != textgeom)
|
|
{
|
|
if (textgeom->HasWrappedRuns())
|
|
{
|
|
const ON_wString plaintextFields = textgeom->WrappedPlainTextWithFields();
|
|
V5_leader->SetTextFormula(plaintextFields);
|
|
const ON_wString plaintext = textgeom->WrappedPlainText();
|
|
V5_leader->SetTextValue(plaintext);
|
|
}
|
|
else
|
|
{
|
|
const ON_wString plaintextFields = textgeom->PlainTextWithFields();
|
|
V5_leader->SetTextFormula(plaintextFields);
|
|
const ON_wString plaintext = textgeom->PlainText();
|
|
V5_leader->SetTextValue(plaintext);
|
|
}
|
|
}
|
|
|
|
V5_leader->m_textheight = V6_leader.TextHeight(&parent_dim_style);
|
|
V5_leader->SetV5_3dmArchiveDimStyleIndex( annotation_context->V5_ArchiveDimStyleIndex() );
|
|
|
|
return V5_leader;
|
|
}
|
|
|
|
ON_OBSOLETE_V2_Leader* ON_OBSOLETE_V2_Leader::CreateFromV5Leader(
|
|
const class ON_OBSOLETE_V5_Leader& V5_leader,
|
|
const ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V2_Leader* destination
|
|
)
|
|
{
|
|
ON_OBSOLETE_V2_Leader* V2_leader
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V2_Leader();
|
|
|
|
V2_leader->Internal_InitializeFromV5Annotation(V5_leader,annotation_context);
|
|
|
|
return V2_leader;
|
|
}
|
|
|
|
|
|
ON_OBSOLETE_V5_Leader* ON_OBSOLETE_V5_Leader::CreateFromV2Leader(
|
|
const class ON_OBSOLETE_V2_Leader& V2_leader,
|
|
const ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_Leader* destination
|
|
)
|
|
{
|
|
ON_OBSOLETE_V5_Leader* V5_leader
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_Leader();
|
|
V5_leader->Internal_InitializeFromV2Annotation(V2_leader, annotation_context );
|
|
V5_leader->m_type = ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtLeader;
|
|
|
|
// sanity check
|
|
for (int i = V5_leader->m_points.Count()-1; i >= 0; i-- )
|
|
{
|
|
if (false == V5_leader->m_points[i].IsValid())
|
|
{
|
|
if (0 == i)
|
|
V5_leader->m_points[0] = ON_2dPoint::Origin;
|
|
else
|
|
V5_leader->m_points.Remove(i);
|
|
}
|
|
}
|
|
|
|
const double too_close_tol = ON_SQRT_EPSILON;
|
|
|
|
for (int i = V5_leader->m_points.Count() - 1; i >= 1; i--)
|
|
{
|
|
if (V5_leader->m_points[i].DistanceTo(V5_leader->m_points[i - 1]) <= too_close_tol)
|
|
{
|
|
if (1 == i )
|
|
{
|
|
if (V5_leader->m_points.Count() > 2)
|
|
V5_leader->m_points.Remove(1);
|
|
}
|
|
else
|
|
V5_leader->m_points.Remove(i - 1);
|
|
}
|
|
}
|
|
|
|
return V5_leader;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// linear dimension
|
|
//
|
|
#pragma region
|
|
|
|
ON_OBSOLETE_V5_DimLinear* ON_OBSOLETE_V5_DimLinear::CreateFromV6DimLinear(
|
|
const class ON_DimLinear& V6_dim_linear,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_DimLinear* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
const ON_DimStyle& xdim_style = V6_dim_linear.DimensionStyle(parent_dim_style);
|
|
|
|
ON_OBSOLETE_V5_DimLinear* V5_dim_linear
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_DimLinear();
|
|
|
|
if (ON::AnnotationType::Aligned == V6_dim_linear.Type())
|
|
V5_dim_linear->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAligned);
|
|
else
|
|
V5_dim_linear->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimLinear);
|
|
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode mode = ON_INTERNAL_OBSOLETE::V5TextDisplayModeFromV6DimStyle(xdim_style);
|
|
V5_dim_linear->SetTextDisplayMode(mode);
|
|
V5_dim_linear->SetPlane(V6_dim_linear.Plane());
|
|
ON_2dPointArray dimpoints(5);
|
|
dimpoints.AppendNew() = V6_dim_linear.DefPoint1();
|
|
dimpoints.AppendNew() = V6_dim_linear.ArrowPoint1();
|
|
dimpoints.AppendNew() = V6_dim_linear.DefPoint2();
|
|
dimpoints.AppendNew() = V6_dim_linear.ArrowPoint2();
|
|
dimpoints.AppendNew() = V6_dim_linear.TextPoint();
|
|
V5_dim_linear->SetPoints(dimpoints);
|
|
V5_dim_linear->SetUserPositionedText(!V6_dim_linear.UseDefaultTextPoint());
|
|
const ON_wString plaintext = V6_dim_linear.PlainUserText();
|
|
V5_dim_linear->SetTextValue(plaintext);
|
|
|
|
V5_dim_linear->SetV5_3dmArchiveDimStyleIndex( annotation_context->V5_ArchiveDimStyleIndex() );
|
|
V5_dim_linear->m_textheight = V6_dim_linear.TextHeight(&parent_dim_style);
|
|
|
|
ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(V5_dim_linear, true);
|
|
if (nullptr != extra)
|
|
{
|
|
extra->SetArrowPosition(0);
|
|
extra->SetDetailMeasured(V6_dim_linear.DetailMeasured());
|
|
extra->SetDistanceScale(V6_dim_linear.DistanceScale());
|
|
}
|
|
|
|
return V5_dim_linear;
|
|
}
|
|
|
|
ON_DimLinear* ON_DimLinear::CreateFromV5DimLinear(
|
|
const class ON_OBSOLETE_V5_DimLinear& V5_dim_linear,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_DimLinear* destination
|
|
)
|
|
{
|
|
ON::AnnotationType v6type;
|
|
ON_INTERNAL_OBSOLETE::V5_eAnnotationType dimtype = V5_dim_linear.Type();
|
|
if (dimtype == ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAligned)
|
|
v6type = ON::AnnotationType::Aligned;
|
|
else if (dimtype == ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimLinear)
|
|
v6type = ON::AnnotationType::Rotated;
|
|
else
|
|
return nullptr;
|
|
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
ON_DimLinear* V6_dim_linear
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_DimLinear();
|
|
|
|
ON_2dPoint arrow1 = V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::arrow0_pt_index);
|
|
ON_2dPoint arrow2 = V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::arrow1_pt_index);
|
|
ON_2dPoint defpt1 = V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::ext0_pt_index);
|
|
ON_2dPoint defpt2 = V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::ext1_pt_index);
|
|
//ON_2dPoint textpt = V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::userpositionedtext_pt_index);
|
|
ON_Plane plane = V5_dim_linear.Plane();
|
|
ON_wString dimtext = V5_dim_linear.TextValue();
|
|
|
|
ON_3dPoint def1point = plane.PointAt(defpt1.x, defpt1.y);
|
|
ON_3dPoint def2point = plane.PointAt(defpt2.x, defpt2.y);
|
|
ON_3dPoint arrow1point = plane.PointAt(arrow1.x, arrow1.y);
|
|
ON_3dPoint arrow2point = plane.PointAt(arrow2.x, arrow2.y);
|
|
ON_3dPoint dimlinepoint = (arrow1point + arrow2point) / 2.0;
|
|
//ON_3dPoint textpoint = plane.PointAt(textpt.x, textpt.y);
|
|
ON_3dVector horizontal = ON_3dVector::XAxis;
|
|
|
|
const ON_UUID dim_style_id = annotation_context->ParentDimStyleId();
|
|
V6_dim_linear->Create(v6type, dim_style_id, plane, horizontal, def1point, def2point, dimlinepoint, 0.0);
|
|
V6_dim_linear->Internal_SetDimStyleFromV5Annotation(V5_dim_linear,annotation_context);
|
|
V6_dim_linear->Set2dTextPoint(V5_dim_linear.Point(ON_OBSOLETE_V5_DimLinear::POINT_INDEX::userpositionedtext_pt_index));
|
|
V6_dim_linear->SetUseDefaultTextPoint(!V5_dim_linear.UserPositionedText());
|
|
ON_wString usrtext = V5_dim_linear.TextFormula();
|
|
usrtext.Replace(L"\\", L"\\\\");
|
|
V6_dim_linear->SetUserText(usrtext.Array());
|
|
|
|
const ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(const_cast<ON_OBSOLETE_V5_DimLinear*>(&V5_dim_linear), false);
|
|
if(nullptr != extra)
|
|
{
|
|
V6_dim_linear->SetDetailMeasured(extra->DetailMeasured());
|
|
V6_dim_linear->SetDistanceScale(extra->DistanceScale());
|
|
}
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
parent_dim_style.ContentHash();
|
|
V6_dim_linear->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_dim_linear;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// angular dimension
|
|
//
|
|
#pragma region
|
|
|
|
ON_OBSOLETE_V5_DimAngular* ON_OBSOLETE_V5_DimAngular::CreateFromV6DimAngular(
|
|
const class ON_DimAngular& V6_dim_angular,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_DimAngular* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
ON_OBSOLETE_V5_DimAngular* V5_dim_angle
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_DimAngular();
|
|
|
|
|
|
V5_dim_angle->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimAngular);
|
|
|
|
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode V5_mode = ON_INTERNAL_OBSOLETE::V5TextDisplayModeFromV6DimStyle(V6_dim_angular.DimensionStyle(parent_dim_style));
|
|
V5_dim_angle->SetTextDisplayMode(V5_mode);
|
|
|
|
ON_3dPoint center, def1, def2, ap1, ap2, dimline, textpt;
|
|
ON_3dVector normal = V6_dim_angular.Plane().Normal();
|
|
|
|
V6_dim_angular.Get3dPoints(¢er, &def1, &def2, &ap1, &ap2, &dimline, &textpt);
|
|
V5_dim_angle->CreateFromPoints(center, def1, def2, dimline, normal);
|
|
|
|
V5_dim_angle->SetUserPositionedText(!V6_dim_angular.UseDefaultTextPoint());
|
|
if (!V6_dim_angular.UseDefaultTextPoint())
|
|
{
|
|
ON_2dPoint tp2;
|
|
V6_dim_angular.Plane().ClosestPointTo(textpt, &tp2.x, &tp2.y);
|
|
V5_dim_angle->SetPoint(ON_OBSOLETE_V5_DimAngular::userpositionedtext_pt_index, tp2);
|
|
}
|
|
ON_wString usertext = V6_dim_angular.PlainUserText();
|
|
usertext.Replace(L"\\", L"\\\\");
|
|
V5_dim_angle->SetTextFormula(usertext);
|
|
|
|
V5_dim_angle->m_textheight = V6_dim_angular.TextHeight(&parent_dim_style);
|
|
V5_dim_angle->SetV5_3dmArchiveDimStyleIndex( annotation_context->V5_ArchiveDimStyleIndex() );
|
|
|
|
return V5_dim_angle;
|
|
};
|
|
|
|
ON_DimAngular* ON_DimAngular::CreateFromV5DimAngular(
|
|
const class ON_OBSOLETE_V5_DimAngular& V5_dim_angle,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_DimAngular* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_UUID dim_style_id = annotation_context->ParentDimStyleId();
|
|
|
|
ON_3dPoint extension1 = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::extension0_pt);
|
|
ON_3dPoint extension2 = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::extension1_pt);
|
|
ON_3dPoint arrow1 = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::arcstart_pt);
|
|
ON_3dPoint arrow2 = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::arcend_pt);
|
|
ON_3dPoint arc_center = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::arccenter_pt);
|
|
ON_3dPoint arc_point = V5_dim_angle.Dim3dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::arcmid_pt);
|
|
ON_2dPoint text_center = V5_dim_angle.Dim2dPoint(ON_OBSOLETE_V5_DimAngular::POINT_INDEX::text_pivot_pt);
|
|
ON_3dVector horizontal = ON_3dVector::XAxis;
|
|
|
|
ON_DimAngular* V6_dim_angle
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_DimAngular();
|
|
|
|
if (arrow1.DistanceTo(extension1) > ON_SQRT_EPSILON && arrow2.DistanceTo(extension2) > ON_SQRT_EPSILON)
|
|
V6_dim_angle->Create(dim_style_id, V5_dim_angle.Plane(), horizontal, extension1, extension2, arrow1, arrow2, arc_point);
|
|
else
|
|
V6_dim_angle->Create(dim_style_id, V5_dim_angle.Plane(), horizontal, arc_center, arrow1, arrow2, arc_point);
|
|
|
|
V6_dim_angle->Internal_SetDimStyleFromV5Annotation(V5_dim_angle, annotation_context);
|
|
|
|
if (V5_dim_angle.UserPositionedText())
|
|
V6_dim_angle->Set2dTextPoint(text_center);
|
|
V6_dim_angle->SetUseDefaultTextPoint(!V5_dim_angle.UserPositionedText());
|
|
ON_wString usrtext = V5_dim_angle.TextFormula();
|
|
usrtext.Replace(L"\\", L"\\\\");
|
|
if (usrtext.Length() > 1 && usrtext[usrtext.Length()-1] == ON_DegreeSymbol)
|
|
usrtext.SetLength(usrtext.Length() - 1);
|
|
V6_dim_angle->SetUserText(usrtext.Array());
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
parent_dim_style.ContentHash();
|
|
V6_dim_angle->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_dim_angle;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// radial dimension
|
|
//
|
|
#pragma region
|
|
ON_OBSOLETE_V5_DimRadial* ON_OBSOLETE_V5_DimRadial::CreateFromV6DimRadial(
|
|
const class ON_DimRadial& V6_dim_radial,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_DimRadial* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
ON_OBSOLETE_V5_DimRadial* V5_dim_radial
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_DimRadial();
|
|
|
|
if (ON::AnnotationType::Radius == V6_dim_radial.Type())
|
|
V5_dim_radial->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimRadius);
|
|
else
|
|
V5_dim_radial->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimDiameter);
|
|
|
|
//ON::TextVerticalAlignment valign = dimstyle->TextVerticalAlignment();
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode mode = ON_INTERNAL_OBSOLETE::V5TextDisplayModeFromV6DimStyle(V6_dim_radial.DimensionStyle(parent_dim_style));
|
|
|
|
V5_dim_radial->SetTextDisplayMode(mode);
|
|
V5_dim_radial->SetPlane(V6_dim_radial.Plane());
|
|
ON_2dPointArray dimpoints(4);
|
|
dimpoints.AppendNew() = V6_dim_radial.CenterPoint();
|
|
dimpoints.AppendNew() = V6_dim_radial.RadiusPoint();
|
|
dimpoints.AppendNew() = V6_dim_radial.DimlinePoint();
|
|
dimpoints.AppendNew() = V6_dim_radial.KneePoint();
|
|
|
|
double ll = 0.0;
|
|
const bool bLeaderHasLanding = V6_dim_radial.LeaderHasLanding(&parent_dim_style);
|
|
const double dim_scale = V6_dim_radial.DimScale(&parent_dim_style);
|
|
const double text_height = V6_dim_radial.TextHeight(&parent_dim_style);
|
|
|
|
if( bLeaderHasLanding )
|
|
ll = V6_dim_radial.LeaderLandingLength(&parent_dim_style) * dim_scale;
|
|
else if (fabs(dimpoints[3].x - dimpoints[2].x) < ON_ZERO_TOLERANCE)
|
|
ll = text_height * dim_scale;
|
|
|
|
if (dimpoints[3].x >= dimpoints[1].x)
|
|
dimpoints[2].x += ll;
|
|
else
|
|
dimpoints[2].x -= ll;
|
|
|
|
V5_dim_radial->SetPoints(dimpoints);
|
|
V5_dim_radial->SetUserPositionedText(!V6_dim_radial.UseDefaultTextPoint());
|
|
|
|
const ON_wString plaintext = V6_dim_radial.PlainUserText();
|
|
V5_dim_radial->SetTextValue(plaintext);
|
|
|
|
V5_dim_radial->m_textheight = text_height;
|
|
|
|
V5_dim_radial->SetV5_3dmArchiveDimStyleIndex(annotation_context->V5_ArchiveDimStyleIndex() );
|
|
|
|
ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(V5_dim_radial, true);
|
|
if (nullptr != extra)
|
|
{
|
|
extra->SetDetailMeasured(V6_dim_radial.DetailMeasured());
|
|
extra->SetDistanceScale(V6_dim_radial.DistanceScale());
|
|
}
|
|
|
|
return V5_dim_radial;
|
|
};
|
|
|
|
ON_DimRadial* ON_DimRadial::CreateFromV5DimRadial(
|
|
const class ON_OBSOLETE_V5_DimRadial& V5_radial_dimension,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_DimRadial* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
ON_DimRadial* V6_dim_radial
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_DimRadial();
|
|
|
|
ON::AnnotationType radial_type = (ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimRadius == V5_radial_dimension.Type())
|
|
? ON::AnnotationType::Radius
|
|
: ON::AnnotationType::Diameter;
|
|
|
|
|
|
const ON_Plane& plane = V5_radial_dimension.Plane();
|
|
ON_2dPoint center_pt = V5_radial_dimension.Point(ON_OBSOLETE_V5_DimRadial::POINT_INDEX::center_pt_index);
|
|
ON_2dPoint arrow_pt = V5_radial_dimension.Point(ON_OBSOLETE_V5_DimRadial::POINT_INDEX::arrow_pt_index);
|
|
ON_2dPoint tail_pt = V5_radial_dimension.Point(ON_OBSOLETE_V5_DimRadial::POINT_INDEX::tail_pt_index);
|
|
//ON_2dPoint knee_pt = V5_radial_dimension.Point(ON_OBSOLETE_V5_DimRadial::POINT_INDEX::knee_pt_index);
|
|
const ON_UUID styleid = parent_dim_style.Id();
|
|
|
|
ON_3dPoint center_point = plane.PointAt(center_pt.x, center_pt.y);
|
|
ON_3dPoint radius_point = plane.PointAt(arrow_pt.x, arrow_pt.y);
|
|
//ON_3dPoint knee_point = plane.PointAt(knee_pt.x, knee_pt.y);
|
|
ON_3dPoint dimline_point = plane.PointAt(tail_pt.x, tail_pt.y);
|
|
|
|
V6_dim_radial->Create(radial_type, styleid, plane, center_point, radius_point, dimline_point);
|
|
V6_dim_radial->Internal_SetDimStyleFromV5Annotation(V5_radial_dimension,annotation_context);
|
|
|
|
|
|
V6_dim_radial->SetUseDefaultTextPoint(!V5_radial_dimension.UserPositionedText());
|
|
ON_wString usrtext = V5_radial_dimension.TextFormula();
|
|
usrtext.Replace(L"\\", L"\\\\");
|
|
V6_dim_radial->SetUserText(usrtext.Array());
|
|
|
|
const ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(const_cast<ON_OBSOLETE_V5_DimRadial*>(&V5_radial_dimension), false);
|
|
if (nullptr != extra)
|
|
{
|
|
V6_dim_radial->SetDetailMeasured(extra->DetailMeasured());
|
|
V6_dim_radial->SetDistanceScale(extra->DistanceScale());
|
|
}
|
|
|
|
// V5 radial dimensions had this behavior which is non-default in V6
|
|
V6_dim_radial->SetDimTextLocation(&parent_dim_style, ON_DimStyle::TextLocation::InDimLine);
|
|
V6_dim_radial->SetLeaderContentAngleStyle(&parent_dim_style, ON_DimStyle::ContentAngleStyle::Horizontal);
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
parent_dim_style.ContentHash();
|
|
V6_dim_radial->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_dim_radial;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ordinate dimension
|
|
//
|
|
#pragma region
|
|
|
|
ON_OBSOLETE_V5_DimOrdinate* ON_OBSOLETE_V5_DimOrdinate::CreateFromV6DimOrdinate(
|
|
const class ON_DimOrdinate& V6_dim_ordinate,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_OBSOLETE_V5_DimOrdinate* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
|
|
ON_OBSOLETE_V5_DimOrdinate* V5_dim_ordinate
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_OBSOLETE_V5_DimOrdinate();
|
|
|
|
ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(V5_dim_ordinate, true);
|
|
V5_dim_ordinate->SetType(ON_INTERNAL_OBSOLETE::V5_eAnnotationType::dtDimOrdinate);
|
|
|
|
ON_INTERNAL_OBSOLETE::V5_TextDisplayMode mode = ON_INTERNAL_OBSOLETE::V5TextDisplayModeFromV6DimStyle(V6_dim_ordinate.DimensionStyle(parent_dim_style));
|
|
V5_dim_ordinate->SetTextDisplayMode(mode);
|
|
V5_dim_ordinate->SetPlane(V6_dim_ordinate.Plane());
|
|
ON_2dPointArray dimpoints(2);
|
|
dimpoints.AppendNew() = V6_dim_ordinate.DefPt();
|
|
dimpoints.AppendNew() = V6_dim_ordinate.LeaderPt();
|
|
V5_dim_ordinate->SetPoints(dimpoints);
|
|
V5_dim_ordinate->SetUserPositionedText(!V6_dim_ordinate.UseDefaultTextPoint());
|
|
|
|
const ON_wString plaintext = V6_dim_ordinate.PlainUserText();
|
|
V5_dim_ordinate->SetTextValue(plaintext);
|
|
|
|
V5_dim_ordinate->SetV5_3dmArchiveDimStyleIndex( annotation_context->V5_ArchiveDimStyleIndex() );
|
|
V5_dim_ordinate->m_textheight = V6_dim_ordinate.TextHeight(&parent_dim_style);
|
|
V5_dim_ordinate->SetKinkOffset(0, V6_dim_ordinate.KinkOffset1());
|
|
V5_dim_ordinate->SetKinkOffset(1, V6_dim_ordinate.KinkOffset2());
|
|
if (nullptr != extra)
|
|
{
|
|
extra->SetDetailMeasured(V6_dim_ordinate.DetailMeasured());
|
|
extra->SetDistanceScale(V6_dim_ordinate.DistanceScale());
|
|
}
|
|
|
|
return V5_dim_ordinate;
|
|
};
|
|
|
|
ON_DimOrdinate* ON_DimOrdinate::CreateFromV5DimOrdinate(
|
|
const class ON_OBSOLETE_V5_DimOrdinate& v5_dim_ordinate,
|
|
const class ON_3dmAnnotationContext* annotation_context,
|
|
ON_DimOrdinate* destination
|
|
)
|
|
{
|
|
if (nullptr == annotation_context)
|
|
annotation_context = &ON_3dmAnnotationContext::Default;
|
|
|
|
ON_DimOrdinate* V6_dim_ordinate
|
|
= (nullptr != destination)
|
|
? destination
|
|
: new ON_DimOrdinate();
|
|
|
|
const ON_UUID dim_style_id = annotation_context->ParentDimStyleId();
|
|
|
|
if (annotation_context->DimStyleIsSet())
|
|
V6_dim_ordinate->SetDimensionStyleId(dim_style_id);
|
|
|
|
const ON_Plane& plane = v5_dim_ordinate.Plane();
|
|
ON_3dPoint def_pt = v5_dim_ordinate.Dim3dPoint(ON_OBSOLETE_V5_DimOrdinate::POINT_INDEX::definition_pt_index);
|
|
ON_3dPoint leader_pt = v5_dim_ordinate.Dim3dPoint(ON_OBSOLETE_V5_DimOrdinate::POINT_INDEX::leader_end_pt_index);
|
|
double koffset1 = v5_dim_ordinate.KinkOffset(0);
|
|
double koffset2 = v5_dim_ordinate.KinkOffset(1);
|
|
ON_DimOrdinate::MeasuredDirection direction = ON_DimOrdinate::MeasuredDirection::Xaxis;
|
|
switch (v5_dim_ordinate.Direction())
|
|
{
|
|
case -1:
|
|
{
|
|
const ON_2dPoint& p0 = v5_dim_ordinate.m_points[0];
|
|
const ON_2dPoint& p1 = v5_dim_ordinate.m_points[1];
|
|
if (fabs(p1.x - p0.x) <= fabs(p1.y - p0.y))
|
|
direction = ON_DimOrdinate::MeasuredDirection::Xaxis; // measures along x axis
|
|
else
|
|
direction = ON_DimOrdinate::MeasuredDirection::Yaxis; // measures along y axis
|
|
}
|
|
break;
|
|
case 0:
|
|
direction = ON_DimOrdinate::MeasuredDirection::Xaxis;
|
|
break;
|
|
case 1:
|
|
direction = ON_DimOrdinate::MeasuredDirection::Yaxis;
|
|
break;
|
|
}
|
|
const ON_DimStyle& parent_dim_style = annotation_context->ParentDimStyle();
|
|
double k = parent_dim_style.TextHeight() * parent_dim_style.DimScale();
|
|
if (koffset1 < k / 10.0)
|
|
koffset1 = k;
|
|
if (koffset2 < k / 10.0)
|
|
koffset2 = k / 2.0;
|
|
|
|
double dist = def_pt.DistanceTo(leader_pt);
|
|
if (koffset1 > dist - 0.05)
|
|
koffset1 = dist * 2.0 / 3.0;
|
|
if (koffset2 > dist - koffset1)
|
|
koffset2 = (dist - koffset1) / 2.0;
|
|
|
|
V6_dim_ordinate->Create(dim_style_id, plane, direction, plane.origin, def_pt, leader_pt, koffset1, koffset2);
|
|
V6_dim_ordinate->Internal_SetDimStyleFromV5Annotation(v5_dim_ordinate,annotation_context);
|
|
V6_dim_ordinate->SetDimTextLocation(&parent_dim_style, ON_DimStyle::TextLocation::InDimLine);
|
|
|
|
const ON_OBSOLETE_V5_DimExtra* extra = ON_OBSOLETE_V5_DimExtra::DimensionExtension(const_cast<ON_OBSOLETE_V5_DimOrdinate*>(&v5_dim_ordinate), false);
|
|
if (nullptr != extra)
|
|
{
|
|
V6_dim_ordinate->SetDetailMeasured(extra->DetailMeasured());
|
|
V6_dim_ordinate->SetDistanceScale(extra->DistanceScale());
|
|
}
|
|
|
|
ON_wString usrtext = v5_dim_ordinate.TextFormula();
|
|
usrtext.Replace(L"\\", L"\\\\");
|
|
V6_dim_ordinate->SetUserText(usrtext.Array());
|
|
|
|
// updates any m_overrides to be current and updates content hash.
|
|
parent_dim_style.ContentHash();
|
|
V6_dim_ordinate->DimensionStyle(parent_dim_style).ContentHash();
|
|
|
|
return V6_dim_ordinate;
|
|
}
|
|
|
|
#pragma endregion
|