2014-06-02

İki Tarih Arasındaki Gün Sayısını Hesaplama

revitforum.org'da takvim family'si ile ilgili dedim ki:

-Şu an iyilik ve kötülük için kullanabilirsiniz. Comments label'ı oluşturun, bir tarih ayarlayın, workshared bir projede view'lara koyun..
İyilik: "Ofis partisini unutma!"
Kötülük: "Evet. Bunların teslim tarihi dündü!

Cevap:
-Yes, for Evil. I have also been thinking about doing some kind of project planning in Revit. For example if you make "Comment Objects" that a project manager or lead designer, with very little Revit experience, can place on drawings and fill in with date and actions they can be scheduled. This gives a clear overview of what needs to be done, by whom, when and if actions have been completed or not. It would be very useful to have Date and Time available as parameters in Revit so that actions approaching deadlines could be shown in ever brighter colours as the moment of death or glory approaches...

Yani kötülük kazandı..


Ya arkadaşım meydan okumayın! Yaparım :)

D_GEN_DEADLINE.rfa (Revit 2015)


Deadline family'sinin 2 veri girme parametresi var:
DateA ve DateB. Family DateA'nın DateB'den önce gerçekleşmesini bekliyor.

2 kontrol parametresi var:
DateAcheck ve DateBcheck. Bunlar girdiğimiz parametrelerin Family tarafından nasıl yorumlandığını gösteriyor.

Ve 6 farklı sonucu olan txtMessage parametresi.


Çözüm için bakınırken wikipedia'da şunu buldum:
Julian Day özellikle astronomlar tarafından kullanılan, Julian döneminden itibaren günlerin kesintisiz sayımıdır.

Her gün için bir sayım demek, bunları birbirinden çıkarır aradaki gün sayısını bulurum demek. Bu seferki tahmin ettiğimden de kolay olacak!

Ayrıca iki tarih için toplamda 6 adet(y/m/d) veri giriş parametresi olsun istemedim. Bu sebeple 2 tane Integer parametresi yaptım. Bunlar y/m/d olarak parse oluyor, DRV(drive) parametreleri ile düzeltiliyor ve check parametrelerinde tekrar birleştiriliyor.

DateA (Integer Parameter)

yıl(en az 1 basamak)ay(2 basamak)gün(2 basamak). Yani girilebilecek en erken tarih 10101.
(Bu tarihten önce bir teslim tarihiniz varsa haberim olsun :)

Parsing  doğru ondalık basamakları alarak yapıldı.

AyearParse = rounddown(DateA / 10000)
AmonthParse = rounddown(DateA / 100) - (AyearParse * 100)
AdayParse = DateA - (AyearParse * 10000) - (AmonthParse * 100)

day / month / yearDRV(drive) parametrelerini Revit Takvimi family'sinden aldım.

Julian Day Number

Önce Julian dönemi başlangıcından itibaren ay ve yılı hesaplamak gerekiyor.


Aa = rounddown((14 - AmonthDRV) / 12)
Ay = AyearDRV + 4800 - Aa
Am = AmonthDRV + (12 * Aa) - 3

Sonra Julian Day bulunuyor:


AJulianDay = AdayDRV + rounddown(((153 * Am) + 2) / 5) + (365 * Ay) + rounddown(Ay / 4) - rounddown(Ay / 100) + rounddown(Ay / 400) - 32045

DateB için aynı işlemleri tekrarladım.
BJulianDay - AJulianDay bize aradığımız gün sayısını veriyor!

Normalde formüller oturduğunda fazla parametre olmaması adına birbirlerinin içine gömerim.
Burada anlaşılır olması için yapmadım.

Hiç yorum yok:

Yorum Gönder