Nesne Yakalama (OSNAP)
Bu sayfa, cad-viewer içinde realdwg-web verileriyle OSNAP'in nasıl çalıştığını açıklar.
Arka Plan
AutoCAD/ObjectARX'te her varlık, belirli bir yakalama modu için aday yakalama noktaları döndürmek üzere getOsnapPoints(...) metodunu geçersiz kılabilir.
realdwg-web içinde, her varlık sınıfında subGetOsnapPoints(...) ile benzer bir desen kullanıyoruz.cad-viewer, arayüzde yakalama gerçekleştirmek için döndürülen bu noktaları tüketir.
Başvuru:
- AutoCAD ObjectARX
getOsnapPoints: https://help.autodesk.com/view/OARX/2024/ENU/?guid=OARX-RefGuide-__OVERLOADED_getOsnapPoints_AcDbEntity
realdwg-web içindeki Temel API
Temel tanım:
AcDbEntity.subGetOsnapPoints(osnapMode, pickPoint, lastPoint, snapPoints, gsMark?)
Parametreler:
osnapMode: her çağrıda tek modpickPoint: geçerli imleç dünya noktasılastPoint: komut akışında önceden onaylanmış noktasnapPoints: aday noktaların ekleneceği çıktı dizisigsMark(isteğe bağlı): alt varlık kimliği; şu andaINSERT(AcDbBlockReference) alt varlık yakalaması için önemlidir
Desteklenen OSNAP modları
AcDbOsnapMode içinde tanımlıdır:
EndPoint = 1MidPoint = 2Center = 3Node = 4Quadrant = 5Insertion = 7Perpendicular = 8Tangent = 9Nearest = 10Centroid = 11
Önemli:
- Bu değerler bit bayrağı değil, sıralı kimliklerdir.
- Maske dönüşümü için
acdbOsnapModesToMask(...)veacdbMaskToOsnapModes(...)kullanın.
cad-viewer Arayüzünde Mevcut Sunum
Durum çubuğu (MlOsnapButton.vue) şu anda şunları sunar:
- EndPoint
- MidPoint
- Center
- Node
- Quadrant
- Insertion
Henüz arayüzde sunulmayanlar (yorum satırına alınmış):
- Perpendicular
- Tangent
- Nearest
- Centroid
Ayarlardaki varsayılan etkin maske (AcApSettingManager):
- EndPoint + MidPoint + Center
cad-simple-viewer içindeki Çalışma Zamanı Akışı
AcEdFloatingInput.getPosition()çağrısıgetOsnapPoint()metodunu çağırır.getOsnapPoint()çağrısıgetOsnapPoints()metodunu çağırır.getOsnapPoints()çağrısıview.pick(point, hitRadius)çalıştırır.- Seçilen her öğe için:
- model alanı varlığını
item.idile çözümleyin item.childrenvarsa, varlık osnap'inigsMark = child.idile çağırın- aksi halde varlık osnap'ini
gsMarkolmadan çağırın
- Geçerli maskedeki her etkin mod için
entity.subGetOsnapPoints(...)çağırın. - İmlece en yakın döndürülen noktayı seçin.
- Ekran
hitRadiusdeğerinden (varsayılan 20 px) dönüştürülen dünya mesafesi eşiğini uygulayın. - Kabul edilirse imleci yakalayın ve işaretçiyi gösterin.
Varlık Uygulaması Özeti (realdwg-web kodundan)
AcDbLine: EndPoint, MidPoint, Nearest, Perpendicular (Tangentdalı vardır ancak nokta yok)AcDbArc: EndPoint, MidPoint, Nearest, Tangent (Perpendiculardalı vardır ancak nokta yok)AcDbCircle: Center, Centroid, Quadrant, Nearest, TangentAcDbEllipse: EndPoint (yalnızca açık yay), MidPoint (yalnızca açık yay), Quadrant (yalnızca kapalı elips)AcDbPolyline: EndPointAcDb2dPolyline: EndPointAcDb3dPolyline: EndPointAcDbPoint: NodeAcDbText: InsertionAcDbMText: InsertionAcDbBlockReference(INSERT): Insertion +gsMarküzerinden devredilen alt varlık yakalama- Sınırlı desteğe sahip ek varlıklar:
AcDbRay: EndPoint (temel nokta)AcDbFace: EndPoint (köşe noktaları)AcDbTrace: EndPoint (köşe noktaları)AcDbSpline: EndPoint
INSERT (AcDbBlockReference) OSNAP Mantığı
subGetOsnapPoints iki yola sahiptir:
Insertionmodu:
- doğrudan blok referansı ekleme noktasını (
this._position) ekler
- Diğer modlar:
- yalnızca
gsMarksağlandığında çalışır subEntityGetOsnapPoints(...)metoduna devreder
Devretme akışı (subEntityGetOsnapPoints):
- Koruma:
gsMark === this.objectIdise dön (özyinelemeyi önle) - Varlığı
blockTable.getEntityById(gsMark)ile çözümle - O alt varlığın
subGetOsnapPoints(...)metodunu çağır - Döndürülen noktaları bu blok referansının
blockTransformdeğeriyle dönüştür - Dönüştürülen noktaları çıktıya ekle
INSERT yakalaması neden başarısız olabilir (mevcut davranış)
gsMarkyok:
Insertiondışındaki modlarda,gsMarkeksikseAcDbBlockReferencehiçbir şey döndürmez.
gsMarkmodeli basitleştirilmiştir:
- Mevcut
gsMark, uzamsal alt isabetlerden gelen alt varlık nesne kimliğidir; tam AutoCAD GS işaretçi semantiği değildir.
- INSERT için katman gruplu işleme:
- İşleme, bir INSERT'i aynı üst nesne kimliğine sahip birden fazla katman tabanlı işleme grubuna bölebilir.
- Seçim, alt varlık kimliklerini kurtarmak için hiyerarşik alt kutulara dayanır.
- Karmaşık/iç içe/kenar dönüşümler:
- Devretme, geçerli INSERT'in
blockTransformdeğerini uygular. - Kenar durumları (örneğin iç içe blok senaryoları veya varsayılan dışı normal/ekstrüzyon durumları) yine de yanlış veya eksik yakalama noktaları üretebilir.
Bu, README.md içindeki bilinen yol haritası notuyla uyumludur:
- INSERT için uç nokta yakalama henüz tamamen güvenilir değildir.
Bilinen Sınırlamalar / TODO
- OSNAP kapsamı varlığa bağlıdır; birçok mod/varlık kombinasyonu kasıtlı olarak henüz uygulanmamıştır.
- INSERT'in ekleme dışı yakalaması, doğru alt isabet ->
gsMarkyayılımına bağlıdır. - Mevcut işaretçi mekanizması nesne kimliği tabanlıdır ve tam AutoCAD GS işaretçi davranışı değildir.
- INSERT için, özellikle iç içe bloklar ve dönüştürülmüş bloklar için daha fazla regresyon testi gereklidir.
Önerilen Katkı Yönü
- INSERT için alt isabetten
gsMarkeşlemesinin sağlamlığını iyileştirin. - EndPoint/MidPoint/Center/Nearest/Tangent durumları için iç içe blok regresyon testleri ekleyin.
- Varlık başına mod kapsamını kademeli olarak genişletin.
- Mümkün olduğunda işaretçi modelini AutoCAD GS işaretçi semantiğine daha da yaklaştırın.