2020年1月3日 星期五

好用又簡單的免費居家裝潢3D繪圖工具

最近因為裝潢需要,要和老婆和小孩討論家具擺設及空間,
但是女生對於這種空間概念似乎比較薄弱,
只好利用 3D 繪圖,再輔助3D虛擬實境的方式跟他們說明會清楚一些,
上網找了一些3D繪圖,還有居家空間設計相關的軟體,
發現 https://www.homestyler.com/ ,可以簡單又快速的建立模型,
首先只要先進入官網,建立帳號,
再來開啟新的設計專案,就可以開始拉物件,
第一步驟就是建立房子的牆面,記得要封好牆面,不然存檔會跳出警告訊息,
網站還能切換簡體中文,看到中文感覺親切多了,

記得左下角選擇你習慣的長度單位,(一開始我沒注意到,還一個一個轉成英呎)


在編輯的同時,還可以切換3D檢視,或鳥瞰圖,

基本元件畫完,可以利用 [渲染] -- [創建全景] ,
將設計圖轉為全景圖(3D虛擬實境),

最好是將每個空間轉成全景圖,(每個全景圖都可以各別分享給朋友觀看),
建議單一全景圖還不用分享,等到全屋漫遊圖完成後,再分享給朋友,
這樣才能一次觀看所有房間

做好全部的全景圖,就可以利用全屋漫遊的功能,將所有全景圖串在一起,
成品可以看到有一個小飛機的符號,還有標籤,只要點選就會進入下一個全景,
先確認可以完整看完全屋,再按下分享(自動生成 QR Code 還有 URL),讓朋友一起討論觀看。

除了電腦版,手機直接開啟也可以看,還能使用 VR 裝置觀看,非常方便簡單。
這次隨手畫了簡單的示意圖,只放上大概的樣示,並轉成全屋漫遊圖,
可以看一下成品大概長這樣,
這個成品圖花了我不到一天的時間,(我還是第一次使用,稍微摸了一下)
頭腦裡先有初步的構想,再找出類似的物件拖拉進來就差不多完成了。

除了 3D 虛擬實境,還可以把房屋格局 (不含裝潢物件) 轉成 AutoCAD 的 DWG 檔,基本功能算是還不錯。

其它功能我還沒試,但目前為止,大致上都很容易使用,成果也不錯,
真的值得推薦新手使用。


2019年11月25日 星期一

利用 MSSQL mdf 檔案,快速將 SQL Server DB 轉移

因為公司一台測試環境電腦的DB突然掛了,
需要將另一個DB快速轉移過來,
怕自己以後忘記,先記錄下來步驟。

將要轉移的DB 複製到本機的資料夾中,
總共有2個檔案
1. xxx.mdf
2. xxx_log.ldf (可有可無)
檔案位置可能路徑如下,
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA

開啟 SQL Server Management Studio 程式

使用預設最高權限登入資料庫


點選 [資料庫] -> 右鍵 (附加)

選擇要附加的資料庫檔名

如果選擇的 DB 沒有 xxx_log.ldf  檔案,會出現找不到檔案的警告,只要移除就可以了

接下來點選 [資料庫] - [新加入的DB名稱] - [安全性] - [使用者]
不能選到主要的 [安全性] ,刪錯就完了
如果裡面有指定 User Name ,必須移除,因為該 User ID 已不能使用,

再重新建立 User (視需求而定,是否要同名稱,或是新的 User 都可以)
這裡要選的是根目錄那層的安全性,不是資料庫裡的

然後根據需求,輸入帳號密碼,還有驗證方式
最後選擇預設資料庫,指到剛才加入的 DB Name

在左邊的選取頁面中,點選 [伺服器角色],勾選 Public (依實際需求)

左邊的選取頁面中,點選 [使用者對應] ,勾選要對應的 DB Name 和角色成員

加入後就可以在原來的
[資料庫] - [新加入的DB名稱] - [安全性] - [使用者]
找到新加入的 User Name 了

最後使用新建立的 UserID / Password 連線資料庫看看,是不是 Table 都可以看到了。

如果資料庫不想用需要缷離,只要點選該資料庫,右鍵 [工作]->[缷離] 就可以了



2019年5月14日 星期二

在64位元環境下動態載入DLL



繼2011年發佈一篇文章
將非 COM 元件的外部 DLL ,包入 .NET 開發的執行檔中
直到現在又遇到問題了,趕緊寫下來記錄
本來專案都 Complier 成 x86,所以在64位元系統下仍然以 32位元在RUN,
但最近公司要求換成 AnyCPU,這下子就出問題了,

''原來的寫法,在64位元系統會取到 IntPtr 值為 0 的問題
    Friend Declare Function GetProcAddress Lib "kernel32" (ByVal ModuleHandle As Integer, ByVal ProcName As String) As Integer
    ''改成 IntPtr ,執行到 GetProcAddress 會有數學運算溢位的錯誤
    Friend Declare Function GetProcAddress Lib "kernel32" (ByVal ModuleHandle As Integer, ByVal ProcName As String) As IntPtr 
    

後來在
https://www.daniweb.com/programming/software-development/threads/207639/getprocaddress-and-function-pointers
的文章發現一個寫法,
    Friend Declare Function GetProcAddress Lib "kernel32" (ByVal ModuleHandle As IntPtr, <[In](), MarshalAs(UnmanagedType.LPStr)> ByVal lpProcName As String) As IntPtr


我一直以為在 64位元 GetProcAddress 回傳的值要改成 IntPtr,漏了傳入參數也要跟著換,
   '最後換成以下寫法就可以
   Friend Declare Function GetProcAddress Lib "kernel32" (ByVal ModuleHandle As IntPtr, ByVal ProcName As String) As IntPtr

換完後,好奇的我再試一下 x86 是否可以通用,
結果是可以的,再查了一下 IntPtr ,才發現這個元件根據 OS 的位元數,所回傳的值也會不同,
也就是從頭到尾只要統一用 IntPtr 就可以了,嗯~又學到一課了!

2019年1月24日 星期四

挑戰 9x9乘法表 練習小程式 (小學數學 加法,減法,乘法 練習)

為了小朋友的9x9乘法表練習,寫了一個挑戰9x9乘法表的小程式,
主要目的是訓練小朋友熟悉9x9乘法表,
可以選擇時間長度,最少1分鐘
再來是要做的題目數多少?


當點撃[開始挑戰] 按鈕時,會進入另一個答題畫面,

只要在答案欄中輸入答案,直接按下 Enter 就可以繼續下一題,
結束後會有統計資料,若是答題錯誤,在右邊的記錄欄可以清楚看到紅色標記

當時間有限,有時又要思考比較久,小朋友可以直接按下 Enter 讓答案空白,
在事後統計時,可以針對答錯的部份再多加練習。
程式中也加了一些音效,增加趣味性,希望小朋友願意多練習!

執行檔下載 (7z 檔案, 173 kB)
程式碼下載 (VB.Net 2015)



2019/10/28 更新
1. 新增加法,減法的練習
2. 新增測驗範圍設定畫面

在程式主畫面中,點選題目範圍的綠色框內容,會跳出設定畫面
預設 加減法最大到99,乘法最大數到10


設定題目最大的數目,若勾選加入測驗,
則出題會包含所選的算式,

如果回答錯誤,右邊記錄欄會順便把正確解答放在後面


V1.0.1.1 執行檔下載 (7z 檔案, 181 kB)
V1.0.1.1 程式碼下載 (VB.Net 2015) (7z 檔案, 162 kB)

檔案壓縮為 7Z 若無法解壓縮請到官網自行下載軟體安裝(免費). https://www.developershome.com/7-zip/

2018年12月7日 星期五

System.IO.Directory.GetFiles 在 C:\ 槽和其它磁碟槽取得的檔案名稱數量不同

一支用很久的程式,今天客戶突然報案說開啟有錯誤發生,
問題是相同的設定檔和檔案,為何在我電腦不會有錯,在客戶端會發生錯誤,
剛好同事也提到,同樣的檔案放到他家裡電腦也發生同樣的錯誤,但在公司電腦不會,
這下子激起我的好奇心想一探究竟。

請同事把發生問題的檔案給我,讓我試試,
因為 Skype 傳來的檔案,我預設放 C:\
結果開啟真的出錯,我再把檔案放到開發專案磁碟槽準備 Debug 結果正常沒錯誤!見鬼了....

將專案 Copy 一份到 C:\ 同時開啟後進入 Debug Mode 看怎麼回事,
看來真的採到 Microsoft 的雷了!

首先在 C:\ 和另一個磁碟槽建立測試用檔案
我把檔案放在 C:\ 和 E:\


然後將程式中斷,在 [即時運算視窗] 中,把資料印出來,
可以發現檔案數量不同,(F3.xml.123 是屬於副檔名 123 不是 XML 所以不會被列出來)
? System.IO.Directory.GetFiles("C:\DEMO_TEST", "*.XML", SearchOption.TopDirectoryOnly)
{Length=5}
    (0): "C:\DEMO_TEST\F1.xml"
    (1): "C:\DEMO_TEST\F2.xml"
    (2): "C:\DEMO_TEST\F3.xml"
    (3): "C:\DEMO_TEST\F3.xml_123"
    (4): "C:\DEMO_TEST\F3.xml123"
? System.IO.Directory.GetFiles("E:\DEMO_TEST", "*.XML", SearchOption.TopDirectoryOnly)
{Length=3}
    (0): "E:\DEMO_TEST\F1.xml"
    (1): "E:\DEMO_TEST\F2.xml"
    (2): "E:\DEMO_TEST\F3.xml"


我同時用 System.IO.Directory.GetFiles 還有 System.IO.Directory.EnumerateFiles 兩個寫法測試,結果一樣,
        '使用 GetFiles 方式
        For Each strFileName As String In System.IO.Directory.GetFiles("E:\DEMO_TEST", "*.XML", SearchOption.TopDirectoryOnly)
            Debug.Print(strFileName)
        Next
        '使用 EnumerateFiles 方式
        Dim fn As Object = System.IO.Directory.EnumerateFiles("E:\DEMO_TEST", "*.XML", SearchOption.TopDirectoryOnly)
        For Each strFileName As String In fn
            Debug.Print(strFileName)
        Next

查了一下官網的 System.IO.Directory.GetFilesSystem.IO.Directory.EnumerateFiles 說明,
原來兩個 SearchPattern 作用相同,難怪結果一樣,

當 SearchPattern 設定的 Extension(副檔名) 剛好為三個字元,
會同時將副檔名符合的三個字元以外的其它檔案也一並找出來,
造成 .XMLxxx 的副檔名都一起被列出來了,
所以官網上的說明符合 C:\ 搜尋的結果,但和我電腦上其它磁碟槽的結果不符!

這個問題還真是擾人呀,
趕快把這個問題記錄下來,不然下次忘記又要踩雷了!!