Sistem Değişkenleri
Bu sayfa, MLightCAD'da sistem değişkenlerinin nasıl çalıştığını, kullanıcıların bunları komut satırından nasıl değiştirebileceğini ve AcDbSystemVariables ile AcDbSysVarManager aracılığıyla nasıl uygulandığını açıklar.
Sistem Değişkeni Nedir
Bir system variable (sistem değişkeni), CAD sisteminin belirli bölümlerinin nasıl davrandığını kontrol eden genel bir ayardır.
Komutlar genellikle bir eylem başlatır, geometri oluşturur veya bir iletişim kutusu açar. Sistem değişkenleri farklı bir şey yapar: komut davranışını, varsayılan değerleri, çizim durumunu veya kullanıcı arayüzü davranışını kontrol ederler.
Tipik örnekler şunları içerir:
- yeni varlıkların hangi katmanda oluşturulacağı
- hangi varsayılan rengin, çizgi kalınlığının veya çizgi tipi ölçeğinin kullanılacağı
- bir görüntüleme modunun etkin olup olmadığı
- düzenleyicinin veya görüntüleyicinin görsel olarak nasıl tepki vereceği
Bu, kasıtlı olarak AutoCAD'e benzer. MLightCAD'da, değişken adını ve ardından yeni değerini girerek bir sistem değişkenini doğrudan komut satırından ayarlayabilirsiniz.
Örneğin:
Command: PICKBOX
New value for PICKBOX <3>: 5Bu, komut satırının sistem değişkeni adının kendisini, o ayarı güncellemek için kullanılan komut olarak ele aldığı anlamına gelir.
MLightCAD bu modeli benimser; böylece çalışma zamanı ayarları komut mantığına gömülmek yerine tek ve tutarlı bir mekanizma üzerinden okunabilir, değiştirilebilir ve izlenebilir.
Komut Satırından Sistem Değişkeni Ayarlama
Komut satırı iş akışı basittir:
- Sistem değişkeni adını yazın.
- Enter'a basın.
- Yeni değeri girin.
- Uygulamak için tekrar Enter'a basın.
Bu, birçok CAD kullanıcısının AutoCAD'den zaten bildiği aynı etkileşim düzenidir.
Örneğin, geçerli katmanı değiştirmek için:
Command: CLAYER
New value for CLAYER <0>: WallsSeçim kutusu boyutunu değiştirmek için:
Command: PICKBOX
New value for PICKBOX <3>: 10Başka bir deyişle, bir sistem değişkenine değer atamak ayrı bir SETVAR tarzı iş akışı gerektirmez. Sistem değişkeni adını doğrudan komut satırına girip ona yeni bir değer atayabilirsiniz.
Sistem Değişkenleri Komut Olarak Nasıl Kaydedilir
MLightCAD'da sistem değişkenleri komut satırından kullanılabilir; çünkü uygulama başlatılırken normal komutlar olarak kaydedilirler.
Kayıt işlemi AcApDocManager içinde gerçekleşir. AcDbSysVarManager içindeki tüm sistem değişkeni tanımlayıcılarını yükler ve her değişken adını bir komut olarak kaydeder:
const sysVars = AcDbSysVarManager.instance().getAllDescriptors()
sysVars.forEach(sysVar => {
register.addCommand(
AcEdCommandStack.SYSTEMT_COMMAND_GROUP_NAME,
sysVar.name,
sysVar.name,
new AcApSysVarCmd()
)
})Bu şu anlama gelir:
- kaydedilen her sistem değişkeni otomatik olarak bir komut haline gelir
- komut adı,
CLAYERveyaPICKBOXgibi sistem değişkeni adının kendisidir - bu komutların tümü aynı komut uygulamasını paylaşır:
AcApSysVarCmd
AcApSysVarCmd belirli bir değişkeni sabit kodlamaz. Bunun yerine çalıştığında, eşleşen sistem değişkeni tanımlayıcısını bulmak için geçerli komut adını (this.globalName) kullanır, kullanıcıdan yeni bir değer ister ve ardından setVar(...) çağrısını yapar.
Akışı özetle şöyledir:
girilen sistem değişkeni adı -> AcApSysVarCmd.execute() -> değer istemi -> AcDbSysVarManager.setVar(...)
Yani iki katman devrededir:
AcDbSysVarManagerçalışma zamanında hangi sistem değişkenlerinin var olduğuna karar verirAcApDocManagerbu çalışma zamanı değişkenlerini komut satırı komutları olarak sunar
Bu nedenle yeni bir sistem değişkeni için destek eklemek genellikle tanımlayıcısını AcDbSysVarManager içinde kaydetmekle başlar. getAllDescriptors() içine dahil edildiğinde, komut yığınına da kaydedilebilir ve doğrudan komut satırından kullanılabilir.
MLightCAD'da Nasıl Tasarlanmıştır
Mevcut uygulama iki dosya üzerine kuruludur:
Farklı amaçlara hizmet ederler.
1. AcDbSystemVariables
AcDbSystemVariables, sistem değişkeni adı sabitlerinin kanonik listesidir.
Başlıca rolleri şunlardır:
- değişken adları için tek bir doğruluk kaynağı sağlamak
- kod tabanında sabit kodlanmış metinlerden kaçınmak
- çağıranlara değişkenlere tip güvenli bir şekilde başvurma imkânı vermek
AcDbSystemVariableNamegibi türetilmiş tipleri desteklemek
Bunu, MLightCAD'daki sistem değişkeni adı kayıt defteri olarak anlamak en doğrusudur.
2. AcDbSysVarManager
AcDbSysVarManager, sistem değişkenleri için çalışma zamanı yöneticisidir. Şunlardan sorumludur:
- değişken tanımlayıcılarını kaydetmek
- tip ve varsayılan değer üst verilerini saklamak
- birleşik
getVarvesetVarerişimi sunmak - veritabanında yer almayan değişkenleri önbelleğe almak
- değişiklik olaylarını dağıtmak
Aslında sistem değişkenleri için kayıt defteri, erişim katmanı ve olay merkezidir.
İki Tür Sistem Değişkeni
Mevcut tasarımda sistem değişkenleri iki kategoriye ayrılır.
Veritabanında yer alan değişkenler
Bu değişkenler AcDbDatabase üzerinde yaşar. AcDbSysVarManager, değişken adını bir veritabanı alanına eşleyerek bunları okur ve yazar.
Şu anda kayıtlı örnekler şunlardır:
CECOLORCELTSCALECELWEIGHTCLAYERLWDISPLAY
Bunlar çizim durumuna ve varsayılan çizim özelliklerine daha yakındır.
Veritabanında yer almayan değişkenler
Bu değişkenler doğrudan AcDbDatabase üzerinde saklanmaz. AcDbSysVarManager içinde önbelleğe alınırlar.
Şu anda kayıtlı örnekler şunlardır:
COLORTHEMEPICKBOXWHITEBKCOLOR
Bunlar düzenleyici davranışına veya arayüz durumuna daha yakındır.
Bu Ayrım Neden Önemlidir
İki tür değişkeni ayırmanın iki acil faydası vardır:
- çizimle ilgili ayarlar veritabanı modeline bağlı kalabilir
- ana uygulama veya arayüzle ilgili ayarların veritabanı katmanına zorlanması gerekmez
Bu, sistem değişkenlerinin hem veri modeline hem de düzenleyici katmanına temiz bir şekilde hizmet etmesini sağlar.
Mevcut Uygulamadaki Temel Yetenekler
Birleşik erişim
Çağıranların bir değişkenin veritabanında mı yoksa yöneticiye ait çalışma zamanı önbelleğinde mi saklandığını bilmesi gerekmez. Her iki durumda da aynı erişim API'sini kullanabilirler:
const sysVarManager = AcDbSysVarManager.instance()
const currentLayer = sysVarManager.getVar('CLAYER', db)
sysVarManager.setVar('CLAYER', 'Walls', db)
sysVarManager.setVar('PICKBOX', 12, db)Tip dönüşümü
setVar, kayıtlı tanımlayıcı tipine göre temel dönüşüm gerçekleştirir. Mevcut uygulama aşağıdaki gibi değerler için dönüşümü destekler:
numberbooleancolor
Bu, değerler komut satırı girdisinden, formlardan veya betiklerden geldiğinde ve başlangıçta metin olarak ulaştığında kullanışlıdır.
Değişiklik bildirimi
AcDbSysVarManager, üst düzey modüllerin sistem değişkeni güncellemelerine tepki verebilmesi için bir sysVarChanged olayı sunar.
AcDbSysVarManager.instance().events.sysVarChanged.addEventListener(args => {
console.log(args.name, args.oldVal, args.newVal)
})Mevcut uygulamada bu olay öncelikle veritabanında yer almayan değişken değişiklikleri için dağıtılır; bu da onu özellikle düzenleyici ve arayüz senkronizasyonu için uygun hale getirir.
Örnek: PICKBOX
PICKBOX, seçim kutusunun piksel cinsinden yarı boyutunu temsil eder. Veritabanında yer almayan bir değişkendir, ancak kullanıcı etkileşimi davranışını doğrudan etkiler.
cad-viewer içinde AcEdCursorManager, PICKBOX değişikliklerini dinler. Değer değiştiğinde, artı işareti imlecinin dikdörtgen kısmını yeniden oluşturur ve etkin imleci hemen yeniden uygular. Bu, bir sistem değişkeninin yalnızca depolanan yapılandırma verisi olmadığını; canlı arayüz davranışı için bir sürücü olarak da işlev görebileceğini gösterir.
Başvuru uygulaması:
Akış şöyledir:
setVar('PICKBOX', ...) -> sysVarChanged olayı -> imleç yöneticisi imleç görünümünü günceller
Bu, soyutlamanın neden kullanışlı olduğunun en açık örneklerinden biridir.
Mevcut Kodda Önemli Bir Ayrıntı
AcDbSystemVariables.ts, tanınan değişken adlarının kanonik kümesini tanımlar, ancak AcDbSysVarManager şu anda bunların yalnızca bir alt kümesini kurucusunda kaydeder.
Başka bir deyişle:
AcDbSystemVariablesad kataloğudurAcDbSysVarManager.registryçalışma zamanında hangi değişkenlerin gerçekten desteklendiğini belirler
Bu makul bir evrim yoludur: önce adları tanımlayın, ardından her değişken desteklendikçe tip üst verisini, varsayılanları, depolama stratejisini ve davranışı kademeli olarak ekleyin.
Önerilen Genişletme Deseni
Gelecekte daha fazla sistem değişkeni eklerken önerilen iş akışı şudur:
- Değişken adı sabitini
AcDbSystemVariablesiçine ekleyin - Tanımlayıcıyı
AcDbSysVarManageriçinde kaydedin - Veritabanında mı yoksa yalnızca çalışma zamanında mı yer alacağına karar verin
- Tipini, varsayılan değerini ve açıklamasını tanımlayın
- Komutları veya arayüzü etkilemesi gerekiyorsa, iş mantığında sabit kodlanmış kontroller yerine olay tabanlı entegrasyonu tercih edin
Yeni Bir Sistem Değişkeni Nasıl Eklenir
Yeni bir sistem değişkeni eklemek genellikle beş adım içerir.
1. Değişken adını AcDbSystemVariables içine ekleyin
Önce AcDbSystemVariables içine yeni bir kanonik ad sabiti ekleyin.
Bu, değişken adını merkezileştirir ve kod tabanına sabit kodlanmış metinlerin dağılmasını önler.
Örneğin:
export const MYNEWVAR = 'MYNEWVAR'2. Tanımlayıcıyı AcDbSysVarManager içinde kaydedin
Ardından değişkeni AcDbSysVarManager içinde kaydedin. Değişkeni çalışma zamanında gerçekten desteklenir hale getiren adım budur.
Kaydederken şunları tanımlayın:
- adı
- tipi
- varsayılan değeri
- değerinin
AcDbDatabaseüzerinde mi yoksa yalnızca yönetici önbelleğinde mi saklandığı - tanımlayıcı modelinin gerektirdiği açıklama veya üst veri
Bu en önemli adımdır. Bir değişken yalnızca AcDbSystemVariables içinde varsa ancak AcDbSysVarManager içinde kaydedilmemişse, yalnızca bir ad sabitidir; kullanılabilir bir sistem değişkeni değildir.
AcApDocManager, başlatma sırasında kayıtlı tüm sistem değişkenlerini otomatik olarak bir komut olarak kaydeder.
Bu, yeni eklenen bir değişkenin genellikle özel bir komut sınıfı yazmaya gerek kalmadan komut satırından kullanılabileceği anlamına gelir.
Komut satırı akışı şu hale gelir:
Command: MYNEWVAR
New value for MYNEWVAR <default>: ...3. Depolama modelini seçin
Ardından yeni değişkenin şu olup olmadığına karar vermelisiniz:
- çizim durumuna veya çizim varsayılanlarına aitse veritabanında yer alan
- düzenleyici davranışına, arayüz tercihlerine veya uygulama çalışma zamanı durumuna aitse veritabanında yer almayan
Veritabanında yer alıyorsa, AcDbSysVarManager bunu AcDbDatabase üzerindeki bir alana eşleyebilmelidir.
Veritabanında yer almıyorsa, AcDbSysVarManager bunu dahili çalışma zamanı önbelleğinde tutabilir.
Genel bir kural olarak:
- geçerli katman veya geçerli renk gibi şeyler için veritabanında yer alan değişkenleri kullanın
- seçim kutusu boyutu veya renk teması gibi şeyler için veritabanında yer almayan değişkenleri kullanın
4. Gerekirse davranışı bağlayın
Değişkenin değiştirilmesi arayüzü veya düzenleyici davranışını hemen etkilemeliyse, ilgili mantığı tüketici modüle ekleyin.
Tercih edilen desen, değişkeni birçok yerde manuel olarak kontrol etmek yerine sysVarChanged olayına tepki vermektir.
PICKBOX bu desenin iyi bir örneğidir:
- değişken
AcDbSysVarManageriçinde kaydedilir - komut sistemi onu komut satırında sunar
AcEdCursorManagerdeğişiklikleri dinler ve imleci hemen günceller
Yani pratikte yeni bir değişken için asgari yol şudur:
- Adını
AcDbSystemVariablesiçinde tanımlayın - Tanımlayıcısını
AcDbSysVarManageriçinde kaydedin - Depolama stratejisine karar verin
- İsteğe bağlı olarak değerine tepki veren dinleyicileri veya iş mantığını bağlayın
Bundan sonra, yerleşik sistem değişkenleriyle aynı birleşik getVar / setVar iş akışına katılabilir.
Özet
MLightCAD'da sistem değişkenleri, gevşek bir ayar koleksiyonundan daha fazlasıdır. Uygulama durumu için birleşik bir soyutlama oluştururlar:
- aşağıya doğru, çizimle ilgili veritabanı durumuna eşlenirler
- yukarıya doğru, düzenleyici ve arayüz davranışını yönlendirirler
- ortada, merkezi erişim, tip kısıtlamaları ve değişiklik bildirimi sağlarlar
Bir komut "ne yapılacağını" yanıtlıyorsa, bir sistem değişkeni "hangi ayarlar veya mod altında yapılacağını" yanıtlar.