コンポネート サイズ 表示

コンポネート サイズ 表示

Anonymous
603件の閲覧回数
5件の返信
メッセージ1/6

コンポネート サイズ 表示

Anonymous
適用対象外

コンポネートのサイズ W・D・Hを表示する方法、印字できるアドイン等、アイデアがありましたら、教えて頂きたいです。キャプチャ.PNGキャプチャ2.PNG

 

ちなみにThumbnailBOMみたいなコンポネート一覧が表示できるのが理想です。

宜しくお願い致します。

0 件のいいね
解決済み
604件の閲覧回数
5件の返信
返信 (5)
メッセージ2/6

saito.kh
Autodesk Support
Autodesk Support
解決済み

@Anonymousさん

 

投稿ありがとうございます。

また、ご返信が遅くなりまして申し訳ありません。

 

いろいろと探してみましたが、残念ながら現在までのところ

ご希望の機能を実現するアドインまたスクリプトは見つかりませんでした。

**「Fusion360 アイディア 」ページIdeaStation日本版)に、是非ご要望をご投稿ください!

 

なお、ご参考ではありますが、3Dモデルに寸法を表示する方法の一例として、

ブラウザーのメニューで「寸法を表示」を選択しておくと、

スケッチで作成した寸法を表示しておくことができます。

2018-07-17 10_54_58-Autodesk Fusion 360.png

 

よろしくお願いいたします。

 

Kanehiko SAITO

Product Support Specialist



Fusion Webinars | Tips and Best Practices | Troubleshooting
メッセージ3/6

Anonymous
適用対象外

早速のご返信ありがとうございます。

 

現状はないとの事、残念です。。。

ご参考の意見ありがとうございました。

 

 

0 件のいいね
メッセージ4/6

kandennti
Mentor
Mentor

takeuchi0354さん こんにちは

 

面白そうだったので、テスト的なスプリクトを作ってみました。
APIのComponent Objectには、boundingBoxプロパティが有った為
比較的簡単に出来るかな? と安易な発想です。

 

#fusion360 python

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        des = adsk.fusion.Design.cast(app.activeProduct)   
        
        unitsMgr = des.unitsManager
        _defLenUnit = unitsMgr.defaultLengthUnits
        unit = unitsMgr.convert(1, unitsMgr.internalUnits, _defLenUnit)        
        
        info_lst = []
        for comp in des.allComponents:
            box = comp.boundingBox
            boxmin = box.minPoint
            boxmax = box.maxPoint
            
            info_lst.append('{} - x{:.3f} : y{:.3f} : z{:.3f}'
                .format(comp.name,
                (boxmax.x - boxmin.x) * unit,
                (boxmax.y - boxmin.y) * unit,
                (boxmax.z - boxmin.z) * unit))

        ui.messageBox('\n'.join(info_lst))
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

 

1.png

 

 

まず、50x50x30のボディを作成しスプリクトを実行すると
このような結果です。
疑問1:0.04mm異なる結果となるのは

    何故なのだろう?

 

 

 

2.png

 

 

続いて、先程のデータで表示させているスケッチの拘束を
ボディの外側まで移動させ、スプリクトを実行した

結果です。

疑問2:そう言う事ですか・・・。

 

 

 

 

3.png

 

 

より実際の状態を想定し、コンポーネントを含んだデータで
実行した結果はこちら。

疑問3:何故その順番で表示するの?



 

1コンポーネントに1ボディ、子コンポーネントの有無等 何かしら制約やルールを
元にデータ作成を行っているのであれば、何とかなるかも知れませんが、
中々ハードルが高そうです。

メッセージ5/6

Anonymous
適用対象外

返信ありがとうございます。

スプリクトまで作成して頂き有難うございます。検討してみます。

0 件のいいね
メッセージ6/6

kandennti
Mentor
Mentor

よく見たら、 "ExtractBOM" と言うサンプルスプリクトが有ったので、

体積表示の代わりにサイズを表示させるようにしてみました。

#fusion360 python

import adsk.core, adsk.fusion, traceback

def spacePadRight(value, length):
    pad = ''
    if type(value) is str:
        paddingLength = length - len(value) + 1
    else:
        paddingLength = length - value + 1
    while paddingLength > 0:
        pad += ' '
        paddingLength -= 1

    return str(value) + pad

def walkThrough(bom):
    mStr = ''
    for item in bom:
        mStr += spacePadRight(item['name'], 15) + \
            str(spacePadRight(item['instances'], 15)) + \
            str(item['size']) + '\n'
    return mStr

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface

        product = app.activeProduct
        design = adsk.fusion.Design.cast(product)
        title = 'Extract BOM+'
        if not design:
            ui.messageBox('No active design', title)
            return

        root = design.rootComponent
        occs = root.allOccurrences
        
        unitsMgr = design.unitsManager
        defLenUnit = unitsMgr.defaultLengthUnits
        unit = unitsMgr.convert(1, unitsMgr.internalUnits, defLenUnit)   
        
        bom = []
        for occ in occs:
            comp = occ.component
            jj = 0
            for bomI in bom:
                if bomI['component'] == comp:
                    bomI['instances'] += 1
                    break
                jj += 1
            
            
            if jj == len(bom):
                (x,y,z) = GetCompBodiesSize(comp)
                
                bom.append({
                    'component': comp,
                    'name': comp.name,
                    'instances': 1,
                    'size': '{:.3f} x {:.3f} x {:.3f}'.format(x*unit,y*unit,z*unit)
                })

        title = spacePadRight('コンポーネント', 15) + \
                spacePadRight('数', 15) + \
                spacePadRight('サイズ', 25) + '\n'
                
        msg = title + '\n' + walkThrough(bom)
        
        ui.messageBox(msg, 'コンポーネント サイズ')

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
            
def GetCompBodiesSize(comp):     
    boxes = [bBody.boundingBox 
             for bBody in comp.bRepBodies if bBody.isLightBulbOn & bBody.isVisible]
    
    if len(boxes) < 1:
        return (0,0,0)
    
    maxposs = (max(box.maxPoint.x for box in boxes),
               max(box.maxPoint.y for box in boxes),
               max(box.maxPoint.z for box in boxes))

    minposs = (min(box.minPoint.x for box in boxes),
               min(box.minPoint.y for box in boxes),
               min(box.minPoint.z for box in boxes))

    return (maxposs[0]-minposs[0],
            maxposs[1]-minposs[1],
            maxposs[2]-minposs[2])

 

4.png

 

 

・1個のコンポーネント内に複数ボディがある場合、

 全てのボディを含めた状態でのサイズです。

・コンポーネント・ボディが非表示の場合、

 サイズは 0 x 0 x 0 となります。

・対象となるボディは、BRepなものだけです。

・単位は、あなたが設定している単位になります。

 (アーカイブ自体かも)

・テスト不足です。

 

 

 

 

 

 

これと画像を組み合わせて、Htmlにすれば良さそうな気もしてはいます。

クラウドなCADだと、何処にファイルを書き出すかが悩みどころですが・・・。

0 件のいいね